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
分かって使っているなら多分おかしい事ではないと思います…
全く詳しくないですが、現在の仕様だとDontDestroyOnLoadは非推奨で、Additiveなシーンロードを使って?みたいな話になってたような気がします?
nullになるという話ですが、どういった条件でどこがnullになってしまうのか?でしょうか。
シーンを跨いだ場合の話ですか?
いわゆるSingletonMonoBehaviourな話だと思うのですが、すべてのシーンに配置して始まったシーンのモノを唯一のものとする、みたいな仕様でしたっけ
回答ありがとうございます。
シーンについて調べてみたところ、確かにDontDestroyOnLoadは推奨されていないようで、シングルトンなクラスの持ち方も少し考えなおさなければならないと思いました。
nullになってしまう件ですが、こちらはシーンを跨がずに現在のシーン内での参照でnullになってしまうため、いまいち原因がわからずな状況です。。
インスペクターからの紐づけをやめ、インスタンス化時にfindメソッオブジェクトを設定するようにしてみると参照できましたので、インスペクターからの紐づけとの動作の違いについて確認してみようと思います。
問題はDontDestroyOnLoadではなくGAME_OBJECT_CANVAS(にセットされているGameObject)ですね。instanceはシングルトンかつシーン遷移時に維持されますが、GAME_OBJECT_CANVASは普通のGameObjectです。
例えばGAME_OBJECT_CANVASに初期設定されているGameObjectが別スクリプトによりDestroyされていて、同名の別オブジェクトがシーン上に存在している場合は「インスペクター紐付けだとnullになるがFindだと見付かる」という状態になるので、幅広く確認してみてください。
回答1件
あなたの回答
tips
プレビュー