【Unity】コンポーネントからゲームオブジェクトの座標を取得する

コンポーネントを取得すると、その情報からコンポーネントをアタッチしているゲームオブジェクトの情報を取得することができます

位置情報は、ゲームオブジェクトのtransform.positionプロパティから取得するイメージですが、コンポーネントを使いたい場合、ついでにゲームオブジェクトの情報が得ることができるテクニックの紹介になります


今回は、座標の情報を取得してみます

サンプル構成

Cube

プレイヤーに見立てています

シーン

スクリプト

using UnityEngine;

public class PlayerStatus : MonoBehaviour
{
}

GameObject

何らかのマネージャに見立てています

シーン

インスペクター上で、CubeをPlayerStatusのところにドラッグ&ドロップします

スクリプト

using UnityEngine;

public class Test : MonoBehaviour
{
    [SerializeField]
    PlayerStatus playerStatus;

    void Start()
    {
        Debug.Log($"プレイヤーの位置は、{playerStatus.transform.position}");
    }
}
using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        var position = GameObject.Find("Cube").GetComponent<PlayerStatus>().transform.position;

        Debug.Log($"プレイヤーの位置は、{position}");
    }
}

さらに考えると、

using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        var position = GameObject.Find("Cube").transform.position;

        Debug.Log($"プレイヤーの位置は、{position}");
    }
}

でもいいのですが、この資料では、スクリプトの取得のついでにゲームオブジェクトの位置も取得できるとのケースにメリットを見出しています

実行結果

プレイヤーの位置は、(10.00, 0.00, 10.00)

解説

UnityEngineでの継承関係

Component ← Behaviour ← MonoBehaviour ← PlayerStatus

Componentクラスには、Transform型のプロパティ(getのみ)が宣言されています
プロパティ名は、transformになります

UnityEngine内のComponentクラス抜粋

public class Component : UnityEngine.Object
{
	public extern Transform transform {
		[MethodImpl (MethodImplOptions.InternalCall)]
		[FreeFunction ("GetTransform", HasExplicitThis = true, ThrowsException = true)]
		get;
	}
}

内部では、このコンポーネントをアタッチしているゲームオブジェクトのTransformをGetComponentしているので、

playerStatus.transform.position

は、PlayerStatusスクリプト(コンポーネント)のゲームオブジェクトの座標が取得できることになります

Unity,学習バトル

Posted by hidepon