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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

894閲覧

【Unity】GameObjectを管理するクラスを定義し、そのクラスに定義されたObjectを参照するとNull判定となる

gimn

総合スコア39

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/05/02 05:32

編集2021/05/02 05:36

UnityでGameObjectの管理を目的としたクラスを考えており、
下記のようにSerializeFieldでオブジェクトを定義し、それぞれインスペクターからドラッグして紐づけておき、
別のクラスからここを参照して使用するような構成を考えてみたのですが、
実際参照先でNull判定となってしまいました。

【参照方法例】
GameObjectManager.instance.GAME_OBJECT_CANVAS

ProjectSettings ⇒ スクリプト実行順序 でこのクラスを先に実行するようにしてみましたが、結果は変わりませんでした。

Findをなるべく使わない方向で上記のような構成を考えたのですが、上記のような方法は適切ではないのでしょうか。

c#

1public class GameObjectManager : MonoBehaviour 2{ 3 [SerializeField] 4 public GameObject GAME_OBJECT_CANVAS; 5 6 public static GameObjectManager instance; 7 8 private void Awake() 9 { 10 if (instance == null) 11 { 12 instance = this; 13 DontDestroyOnLoad(gameObject); 14 } 15 else 16 { 17 Destroy(gameObject); 18 } 19 } 20} 21

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/05/03 05:24

分かって使っているなら多分おかしい事ではないと思います… 全く詳しくないですが、現在の仕様だとDontDestroyOnLoadは非推奨で、Additiveなシーンロードを使って?みたいな話になってたような気がします? nullになるという話ですが、どういった条件でどこがnullになってしまうのか?でしょうか。 シーンを跨いだ場合の話ですか? いわゆるSingletonMonoBehaviourな話だと思うのですが、すべてのシーンに配置して始まったシーンのモノを唯一のものとする、みたいな仕様でしたっけ
gimn

2021/05/04 03:08

回答ありがとうございます。 シーンについて調べてみたところ、確かにDontDestroyOnLoadは推奨されていないようで、シングルトンなクラスの持ち方も少し考えなおさなければならないと思いました。 nullになってしまう件ですが、こちらはシーンを跨がずに現在のシーン内での参照でnullになってしまうため、いまいち原因がわからずな状況です。。 インスペクターからの紐づけをやめ、インスタンス化時にfindメソッオブジェクトを設定するようにしてみると参照できましたので、インスペクターからの紐づけとの動作の違いについて確認してみようと思います。
sakura_hana

2021/05/06 02:22

問題はDontDestroyOnLoadではなくGAME_OBJECT_CANVAS(にセットされているGameObject)ですね。instanceはシングルトンかつシーン遷移時に維持されますが、GAME_OBJECT_CANVASは普通のGameObjectです。 例えばGAME_OBJECT_CANVASに初期設定されているGameObjectが別スクリプトによりDestroyされていて、同名の別オブジェクトがシーン上に存在している場合は「インスペクター紐付けだとnullになるがFindだと見付かる」という状態になるので、幅広く確認してみてください。
guest

回答1

0

自己解決

確認、回答が遅れてしまい申し訳ございません。
sakura_hanaさんが回答くださったとおりの事象であったようです。
最初の取得だけであればfindも多用することはないため、findでの取得が安定であるかもしれませんね。

投稿2021/05/28 15:07

gimn

総合スコア39

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問