Unity 初心者向け なるべく簡単に他のオブジェクトにアクセスする
他のオブジェクトの変数を参照したい
プログラムも初心者なUnity初心者が良く悩むのが、スコアやプレイヤーの座標など、別のオブジェクトにアクセスして変数を参照することではないでしょうか。
色々なところで良く説明されるのが、GameObject.Find().GetComponent<XXX>()
だったり Singletonパターン
だったりしますが、FindやGetComponentは「遅い」と書かれたりするし、Singletonパターンというのは難しくて良くわからない。
それでも手っ取り早くゲームを作りたいなら、とりあえずこんな感じでどうでしょう。
共有したい側。「ここから」 ~ 「ここまで」 をコピペして、class名部分(この場合 Player )を書き換え
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { /* -- ここから -- */ private static Player _instance; // このclass名は書き換えること public static Player I // このclass名は書き換えること { get { if (_instance == null) { _instance = null; // ?? や ?. が効くようにする } return _instance; } } void Awake() { if (_instance != this) { _instance = this; } } /* -- ここまで -- */ // Use this for initialization void Start () { } // Update is called once per frame void Update () { } }
利用する側
void Start () {
Debug.Log(Player.I.transform.position);
}
こんな感じで簡単にアクセスできるようになります。
いくつか気をつけること
- Sceneに1つしか存在しないオブジェクトでのみ、使えます。Sceneに存在しなければエラーになってしまいます
- 参照できるのは、Start()以降のタイミングです。Awake()中はまだ使えないと思ってください
- Sceneをまたいで使いたいなら、「真面目にじっくり学ぶ人向け」のリンクをどうぞ。この例はあくまでも簡易版です