ということで、 今回はUnityで複数のオブジェクトをスクリプトで操作 することを書いておこうと思います |
前回はスクロールバーを使って リストを作ったわね 今回はそのリストを選択すると中央の表示が変わるっていうのをやってみるわ |
ここからプログラムを多用する感じだな とは言え、独学なので間違いがあったら指摘してほしいな 一応、参考書3冊ぐらい買ってるけど、ほとんど読んでないし |
ということで リストを選択して、真ん中の画面に反映するのをやってみます 詳しくは「続きを読む」からどうぞー |
まず、 リストを生成します で、それが下のソースコードになります |
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; /// /// キャラクターセレクトのスクロール項目を作成する /// public class CharaterSelectScrollViewScript : MonoBehaviour { ///【外部取得】 スクロールオブジェクト public GameObject ParentScrollView; /// キャラリスト private List CharaterList; // Use this for initialization void Start () { GameDataScript GameData = GameDataScript.Instance; // 項目を作成する for (int n = 0; n < GameData.CharacterNameList.Count; n++) { // プレハブを取得 GameObject prefab = (GameObject)Resources.Load("common/SelectNamePanel"); // プレハブからインスタンスを生成 GameObject tmpSelectNamePanel = Instantiate(prefab, Vector3.zero, Quaternion.identity); tmpSelectNamePanel.transform.SetParent(ParentScrollView.transform); tmpSelectNamePanel.transform.localScale = Vector3.one; tmpSelectNamePanel.transform.position = Vector3.zero; tmpSelectNamePanel.transform.localPosition = new Vector3(0, -50 - (n * 65), 0); tmpSelectNamePanel.name = "List" + n.ToString(); // 子オブジェクトのテキストオブジェクトとを取得 GameObject childObject = tmpSelectNamePanel.transform.FindChild("NameText").gameObject; childObject.GetComponent().text = GameData.CharacterNameList[n]; } } // Update is called once per frame void Update () { } }
ゲーム上の生コードよ 単純に「common/SelectNamePanel」を生成して「ParentScrollView」に配置してるだけよ ParentScrollViewはUnity側でスクロールバーのGameObjectを登録してるわ |
当然上のソースはスクロールバーのGameObjectに登録するぞ スクロールバーが表示されるとリストも生成されるようになる もっといい方法があるのかもしれないけど、冬月はこう作ってる |
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; /// /// 名前選択ボタンの設定 /// public class SelectNamePanelScript : MonoBehaviour { // Use this for initialization void Start() { } // Update is called once per frame void Update() { } /// /// 選択したときの処理 /// public void OnClick() { GameDataScript GameData = GameDataScript.Instance; // 子オブジェクトのテキストオブジェクトとを取得 GameObject childObject = this.transform.FindChild("NameText").gameObject; string CharNameText = childObject.GetComponent().text; // 名前からキャラクターの番号を取得 GameData.SelectCharacterNum = GameDataScript.Instance.GetNumberFromName(childObject.GetComponent().text); //キャラクターイメージ欄 GameObject CharacterImagePanel = GameObject.Find("CharacterImagePanel"); // 子の名前テキスト GameObject childCharacterNameText = CharacterImagePanel.transform.FindChild("NameText").gameObject; childCharacterNameText.GetComponent().text = CharNameText; // 子のステータステキスト List statusTextList = new List(); CharacterDataScript tmpCharacterDataScript = new CharacterDataScript(GameDataScript.Instance.SelectCharacterNum); statusTextList = tmpCharacterDataScript.GetStatusTextList(); GameObject childCharacterStatusText1 = CharacterImagePanel.transform.FindChild("StatusText1").gameObject; childCharacterStatusText1.GetComponent().text = statusTextList[0]; GameObject childCharacterStatusText2 = CharacterImagePanel.transform.FindChild("StatusText2").gameObject; childCharacterStatusText2.GetComponent().text = statusTextList[1]; GameObject childCharacterStatusText3 = CharacterImagePanel.transform.FindChild("StatusText3").gameObject; childCharacterStatusText3.GetComponent().text = tmpCharacterDataScript.GetAttackStatusText(); // スキルカード GameObject childCharacterSkillText = CharacterImagePanel.transform.FindChild("SkillStatusText").gameObject; childCharacterSkillText.GetComponent().text = tmpCharacterDataScript.GetSkillDataText(GameDataScript.Instance.SelectSkillIndex); } } }
いきなり本編ですが リスト側のボタン処理になります これはPrefabに保存しているボタンオブジェクトに登録します |
処理の流れとしては onClick()関数にクリックされたときに処理されるようにしておき、各GameObjectにデータを投げる 感じになってます |
string CharNameText = childObject.GetComponent().text;で 今このリストに表示されている名前(判断するためのもの)を引っ張ってきて それからこのボタンが何かを判別し処理を分けてるわ |
肝心なのは GameObject CharacterImagePanel = GameObject.Find(“CharacterImagePanel”);これね Hierarchyから同じ名前のGameObjectを取得するぞ |
そしてこうやって GameObject childCharacterStatusText1 = CharacterImagePanel.transform.FindChild(“StatusText1”).gameObject;とすれば 子レイヤーのGameObjectも取得できます |
子レイヤーはテキストオブジェクトなので childCharacterStatusText1.GetComponent().text = statusTextList[0]としてテキストの変更を行っています いちおうこんな感じに作れば一方のオブジェクトから一方を操作することが出来ます |