AppSeedのアプリ開発ブログ

アプリ開発会社AppSeed(アップシード)開発担当のブログです。iOS、Android、Unity、Cocos2d-xなどアプリ開発関連のTipsや備忘録、アプリ開発に役立つ情報を発信します。

【Unity】複数のボタンに順番に番号を振る方法

【Unity】複数のボタンに順番に番号を振る方法

少し前に「Unityで大量のボタンにコードでクリックイベントを追加する方法」を書いたのですが、

develop.hateblo.jp


仕事で「複数のボタンに順番に番号を振る」っていうこともやらなきゃいけなかったのでメモとして残しておきます。


複数のボタンに番号を振る(失敗例)

【Unity】複数のボタンに順番に番号を振る方法

まず最初に思いついたのが、それぞれのボタンにタグをつけて、「GameObject.FindGameObjectsWithTag」で検索をかけ、取得したGameObjectの配列にそれぞれindexを割り振っていく方法。

GameObject[] buttons = GameObject.FindGameObjectsWithTag("StageButton");
 for (int i = 0; i < buttons.Length; i++)
 {
            buttons[i].GetComponent<StageButton>().index = i + 1;
 }

一応、この方法でUnityのプレビュー上では問題なかったのですが、Android端末上で動かしてみたら、ボタンにつけた順番がおかしくなってしまいました。

順番がおかしくなってしまう原因ですが、おそらく「GameObject.FindGameObjectsWithTag」で取得した配列は、ヒエラルキー上で追加した順番で取得できるのではなく、検索に引っかかったやつから配列に追加していくっぽいので、上記の手法だと正しくindexを割り振れないようです。



複数のボタンに番号を振る(成功例)

そして最終的には以下の手法を取ることにしました。

List<GameObject> buttons; //取得したボタンを格納する

void SetIndex(){
GameObject area = GameObject.FindGameObjectWithTag("ButtonArea");
 buttons = new List<GameObject>();
 for (int i = 0; i < area.transform.childCount; i++)
 {
       buttons.Add(area.transform.GetChild(i).gameObject);
 }

 for (int i = 0; i < buttons.Count; i++)
 {
            buttons[i].GetComponent<StageButton>().index = i + 1;
 }
}


【Unity】複数のボタンに順番に番号を振る方法

複数ボタンの親オブジェクトとして「ButtonArea」を用意して、まず「GameObject.FindGameObjectWithTag」で「ButtonArea」を取得します。
「ButtonArea」の子であるボタンは「transform.GetChild("インデックス")」で追加順に取得できるので、順番通りにindexを割り振ることができました。


最初の手法はUnityプレビュー上では何回やっても問題なかったのでAndroidの実機でうまく行かないのが何故なのか調べて無駄に時間を浪費してしまいました。
今後の教訓として残しておきます。