ゲームつくろうぜ

こんにちはマイコン世代のオヤジが初心に返って色々やるブログ

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をまたいで使いたいなら、「真面目にじっくり学ぶ人向け」のリンクをどうぞ。この例はあくまでも簡易版です

真面目にじっくり学ぶ人向け

tsubakit1.hateblo.jp kan-kikuchi.hatenablog.com