質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

635閲覧

Array.IndexOfを使っても-1しか返ってきません。

_string

総合スコア15

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/05/09 13:21

発生している問題・実現したいこと

現在動いている情報を見るために、TextFieldを使ったのですが正直座標設定などが非常に面倒くさいので、 自動化をしたいと考えました。 OnGUIはvoid Updata()のように毎回処理されるという特徴があります。 そこで、Tagを指標とし新しいTagだった場合x,y座標をArrayCSaveへstring型で格納、TagをArrayTagSaveへ代入します。 逆に、すでに同じTagがあった場合は、ArrayTagSaveに格納されているTagの要素数を使い、ArrayCSaveからTagの座標を取得し表示したいです。 「すでに同じTagがあった場合」という部分ですね。 If文を使い、要素数を取得しようとプログラムを組んだのですが、 Array.IndexOfを使っても-1しか返ってきません。 ArrayTagSaveに毎回、Tagが代入されていることは確認済みです。 原因が突き止められません。教えていただけると幸いです。

該当のソースコード

C#

1public class RealTimeInfo : MonoBehaviour 2{ 3 void Start() 4 { 5 OnGUI(); 6 } 7 void OnGUI() 8 { 9 GUI_Support GUI_S = new GUI_Support(); 10 GUI_S.Auto_TextField("test", "test_Tag"); 11 GUI_S.Auto_TextField("nn", "nn_Tag"); 12 } 13} 14 15interface GUI_Support_OrderList 16{ 17 void Auto_TextField(string MainText, string Tag); 18} 19 20public class GUI_Support : GUI_Support_OrderList 21{ 22 WordControl Wc = new WordControl(); 23 private ushort ACx = 0, 24 ACy = 0; 25 private ushort[] ArrayTextLength = new ushort[0]; 26 private string[] ArrayTagSave = new string[0]; 27 private string[] ArrayCSave = new string[0]; 28 //一文字をX = 15とする 29 //Y = 20とする 30 //文字を表示する 31 //表示したい文字を取得→タグと一致していれば、そのタグの要素数から座標を取得しその座標に文字を表示 32 // タグと一致していなければ、新しく配列を作成しタグと座標を代入 33 public void Auto_TextField(string MainText, string Tag) 34 { 35 short GetArrayTagSave = Convert.ToInt16(Array.IndexOf(ArrayTagSave, Tag)); 36 if (GetArrayTagSave == -1) 37 { 38 Array.Resize(ref ArrayTextLength, ArrayTextLength.Length + 1); 39 Array.Resize(ref ArrayTagSave , ArrayTagSave.Length + 1); 40 Array.Resize(ref ArrayCSave , ArrayCSave.Length + 1); 41 if (1920 >= ACy) 42 { 43 ACy = 0; 44 ACx = Convert.ToUInt16(Convert.ToInt32(ArrayTextLength.Max()) + 10); 45 } 46 ArrayCSave[ArrayCSave.Length - 1] = Convert.ToString(ACx) + "," + Convert.ToString(ACy); 47 ushort MainTextLength = Convert.ToUInt16(MainText.Length * 15); 48 ArrayTextLength[ArrayTextLength.Length - 1] = MainTextLength; 49 ArrayTagSave[ArrayTagSave.Length - 1] = Tag; 50 GUI.TextField(new Rect(ACx, ACy, ACx + MainTextLength, 20), MainText); 51 ACy += 20; 52 } 53 else 54 { 55 int ACx_TArray = 0; 56 int ACy_TArray = 0; 57 Wc.GetTwoWord(ArrayCSave[GetArrayTagSave], ref ACx_TArray, ref ACy_TArray); 58 ushort MainTextLength = Convert.ToUInt16(MainText.Length * 15); 59 GUI.TextField(new Rect(ACx_TArray, ACy_TArray,ACx_TArray + MainTextLength, 20), MainText); 60 } 61 } 62} 63 64public class WordControl 65{ 66 public void GetTwoWord(string word, ref int FirstWord, ref int SecondWord) 67 { 68 FirstWord = Convert.ToInt32(word.Substring(0, word.IndexOf(","))); 69 SecondWord = Convert.ToInt32(word.Substring(word.IndexOf(",") + 1, word.Length)); 70 } 71}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

プログラムを見直した結果自己解決ができました。

投稿2020/05/09 14:21

_string

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問