動的に追加したButtonコンポーネントのOnclickの処理で別コンポーネントで扱っている変数に代入したい
このようなhierarchyでコンポーネントを配置しています。
コンポーネント名 | 型 | 概要 |
---|---|---|
GameContoroller | GameObject | 場面の管理やセリフの更新などを行う。 |
OptionPanel | Panel | 選択肢を表示するボタンを入れるパネル |
OptionButton | Button | 選択肢を表示するボタンの雛形。prefabにしてもよかったが、こちらにした |
GameCotorollerクラス内でOptionPanel内に動的に選択肢ボタンを追加し、
OnClickで呼び出した関数でGameContorollerクラス内の変数に代入を行いたいと思っています。
代入を行いと思っている変数は下記SceneクラスのCurentSceneというクラス変数NextSceneIDです。
ViewOption内で動的に生成したButtonのOnClickにclickHandler関数を割り当て、代入したいと考えており、次のようなコードを書きました。
C#
1public class GameController : MonoBehaviour 2{ 3 4 /* 略 */ 5 6 public class Scene 7 { 8 public string ID; 9 public string NextSceneID; 10 public Queue<string> Texts = new Queue<string>(); 11 public List<Option> Options = new List<Option>(); 12 public Queue<string> BackGround = new Queue<string>(); 13 public Queue<ActionType> Actions = new Queue<ActionType>(); 14 15 } 16 17 public class Option 18 { 19 public string OptionText; 20 public string val; 21 public Action Action; 22 } 23 24 public Scene CurrentScene; 25 26 /* 略 */ 27 28 void ViewOption(){ 29 30 TextPanel.SetActive(false); 31 OptionPanel.SetActive(true); 32 foreach (Option o in CurrentScene.Options) 33 { 34 35 //Button b = Instantiate(Resources.Load("Button" , typeof(Button) ) ) as Button; 36 Button b = Instantiate( OptionButton ); 37 b.transform.SetParent(OptionPanel.transform , false ); 38 b.transform.localScale = new Vector3( 1F , 1F , 1F ); 39 b.onClick.AddListener( () => o.Action() ); 40 b.transform.FindChild("Text").GetComponent<Text>().text = o.OptionText; 41 b.transform.FindChild("Text").GetComponent<Text>().fontSize = 75; 42 43 } 44 45 } 46 47 public void clickHandler (string id ){ 48 Debug.Log(id); 49 CurrentScene.NextSceneID = id; 50 SetNextAction(); 51 } 52}
o.Actionについては
C#
1Option op = new Option(){ 2 OptionText = sp[0], //spはそれぞれ入力確認できています 3 val = sp[1], 4 Action = () => clickHandler(sp[1]) 5 };
という処理をしています。
発生している問題・エラーメッセージ
ここでViewOptionが実行された際、
このようにOptionPanel内にOptionButtonは追加され、clickHandlerが実行され、
idも適切に渡せている(Debug.Logで確認)のですが、
NullReferenceException: Object reference not set to an instance of an object
とエラーが出ます。
該当のソースコード
エラー発生箇所は、
C#
1CurrentScene.NextSceneID = id;
であり、
C#
1Debug.Log(CurrentScene.NextSceneID);
や
C#
1Debug.Log(CurrentScene);
でも同様のエラーが出たことから、CurrenSceneの参照ができていないことが原因だと考えています。
OnClickで呼ばれるclickHandlerはOptionButtonで呼ばれている?ことがその原因だと考えています。
ただ、Unityを触るのは殆ど初めてなのでUnityにおける参照範囲や参照方法のセオリー等がはっきりと分かっておらず、浅はかな質問になってしまっているかも知れませんが、回答頂けると幸いです。
補足情報(FW/ツールのバージョンなど
Unity 2019.3.0f
MacOS Mojava 10.14.5
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/17 22:45
2020/02/18 03:18
2020/02/18 03:37
2020/02/18 04:03
2020/02/18 04:18