質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

443閲覧

Unity5.6 / 2D / ugui - Main Cameraにスクリプトをアタッチするとエラー

sukiyakigozens

総合スコア28

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2017/07/17 18:13

編集2017/07/19 02:59

###前提・実現したいこと
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) でも問題ありませんでしょうか?

ベストアンサーにさせていただきたいので、回答欄にご記入いただけまでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Bongo

2017/07/18 22:20

スクリプトの実行タイミングの問題でしょうかね(Awakeの中でGameObjectを取得しようとしたが、取得対象がまだ生成されていなかった...とか)?その問題の起こるスクリプトを記載いただけると手がかりになるかもしれません。長すぎて書き込めないようでしたら、そのGameObject取得部分周辺だけでも可能でしょうか。
sukiyakigozens

2017/07/19 03:00

再追記させていただきました。ご参照おねがいいたします。
guest

回答1

0

ベストアンサー

追加のご質問に関してですが、PopUpOpenクラス内のpopUp_allとOther.CS内のpopUp_allは有効範囲が異なるはずですので、名前かぶりは気にせず同名を使って問題ないかと思います。

※ただし、partialを使って一つのクラスを複数のファイルに分けて記述する...といった場合は、同じクラス内で名前かぶりがないようにしなければならないかと思いますが、うっかり同名を付けてしまってもエラーが出て教えてくれるはずですので、さほど大きな問題にはならないと思います。

参考: [Unity] [C#] クラス定義を複数ソースに分割する | ftvlog

投稿2017/07/19 03:37

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sukiyakigozens

2017/07/19 03:52

ご返答大変ありがとうございました。 感謝しております。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問