あるGameObjectから他のGameObject内の変数を読もうとしてハマった話
はじめに
タイトルに書いたようにドハマりしました・・・。
気づけばそりゃそうだろと思うようなことなのですが・・(´・ω・`)
ハマった点
オブジェクト(OBJ_A)とオブジェクト(OBJ_B)があるとします。また、OBJ_AとOBJ_Bはどちらもprefab化しています。(便宜上、OBJ_AのprefabをOBJ_A[pre]のように表現します。)
OBJ_AとOBJ_Bにはそれぞれ以下の内容のスクリプト(A.cs、B.cs)がアタッチされています。
A.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public class A : MonoBehaviour { public GameObject bObj; private B b; // Use this for initialization void Start () { b = bObj.GetComponent<B> (); } // Update is called once per frame void Update () { Debug.Log ("A:" + b.num); } }
B.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public class B : MonoBehaviour { public int num = 0; // Use this for initialization void Start () { } // Update is called once per frame void Update () { num++; Debug.Log ("B:" + num); } }
見てわかるように、updateされるたびにBスクリプト内のnumがインクリメントされ、numの値をAとBのスクリプト内でコンソールに出力しています。
bObjにOBJ_Bを入れるために、OBJ_AをInspectorに表示させると以下のようになります。
今からここにOBJ_Bを入れるのですが、私は考えなしに(いつものように)OBJ_B[pre]の方をいれて以下のような出力になりました。
この出力を見た私:「!?」
原因
OBJ_B[pre]を入れたということが原因です。
OBJ_B[pre]の内部を見に行ったところでUpdate関数でインクリメントされているnumはそこにはいません。num = 0
が待っているだけです。Update関数が実行されるのはゲーム内で有効なオブジェクトである必要があるからです。
解決法
もう分かるかと思いますが、HierarchyにあるOBJ_Bの方を入れる必要があったわけです。
以下がその時の出力結果です。
おわり
何言ってんだよ当たり前だろ。って言われるような内容ですが、ハマっていた当時は原因不明で「??」って感じでした。
Instantiateに使うオブジェクトとして考えなしにとりあえずprefabを設定していたツケがきたんですね(´・ω・`)
説明や語句の使用で間違っている箇所があればコメントをお願いします!