###前提・実現したいこと
Main Cameraにスクリプトをアタッチするとエラーが出てしいます。(Unity初心者です。)
(複数存在するスクリプトを数カ所に分けてアタッチするのではなく、可能な限りMain Cameraにまとめる事ができるならばまとめたいです。)
###発生している問題・エラーメッセージ
ボタンに関してのスクリプトをMain Camera にアタッチしてあると下記エラーがでます。
Object reference not set to an instance of an object
スクリプトをいったんRemoveし、再度Main Cameraにアタッチし直すとエラーが出ません。
(このことからスクリプトには問題ないように思えます。)
しかしながらUnityを再起動すると同じエラーが出ます。
###試したこと
Main Cameraではなく、Canvasにアタッチするとエラーがでません。(Unityを再起動してもエラーでません)
質問させてください。
質問
Main Cameraにアタッチしてもよいスクリプトと、アタッチしてはいけないスクリプトというものがありますでしょうか?
(後から見た時にわかりやすいように、できるかぎりスクリプトをアタッチする場所をまとめたいです。)
現在、Main Cameraには他のスクリプト(Admobのスクリプト)がアタッチしてあり、
問題なく動作しているようなのですが、
追記
_obj = GameObject.Find("Canvas/Panel/obj");
という様な、Canvasの中に位置するobjを参照するコードを使用しております。
それが原因でCanvasにアタッチするべきだったのでしょうか?
しかしながら、
Main Cameraから、いったんスクリプトをRemoveして再度Main Cameraにアタッチするとエラーなしで動作するのはなぜでしょうか?
(Unity再起動後にエラーが出てしまいますが)
ご教授よろしくおねがいいたします。
再追記
スクリプトはこのような感じで、パネルの中にボタンが何個かあり、押された時の動作が書かれてます。
オブジェクト自体は、インスタンシエイトで作成はしておらず、すでにヒエラルキー上に置いてあります。
StartからAwakeに変えましたら、Main Camera上でもエラーが出なくなりました。
public class SceneChanger : MonoBehaviour { GameObject _level1; void Awake () //元はStartでした { _level1 = GameObject.Find("Canvas/popUp/level1"); _level1.GetComponent<Button>().onClick.AddListener(() => OnClickBtnLevel1(_level1)); } void OnClickBtnLevel1(GameObject obj) { SceneManager.LoadScene ("101"); } }
実はさらにもうひとつ別のスクリプト(下記)がありまして、(同じくMain Camera内にアタッチ)
Startにてボタンの親(名前:popUp)を消す命令を入れておりました。
そのせいで上のスクリプトでは子が見つからないというのが原因でした。
上のスクリプトはAwake使用によりStartより先に読まれるようです。
ご指摘いただいたとおり実行の順番の問題でした。
public class PopUpOpen : MonoBehaviour { GameObject popUp_all; void Start() { popUp_all = GameObject.Find("Canvas/popUp"); popUp_all.SetActive (false); } }
すいません、さらに質問させてください。
少し外れますが、
Main Cameraにアタッチの別のスクリプト内にて(例:Other.CS)
上記とまったく同じオブジェクト(popUp_all) を再度、Canvas/popUpとパスをたどって参照する場合、
その際、Other.CS内での呼び名は「popUp_all」は上記スクリプトで一度使用しているので
「popUp_all_2」と名前を変える必要がありますでしょうか?
または同じ名前(popUp_all) でも問題ありませんでしょうか?
ベストアンサーにさせていただきたいので、回答欄にご記入いただけまでしょうか?
回答1件
あなたの回答
tips
プレビュー