MRが楽しい

MRやVRについて学習したことを書き残す

Unityでオブジェクトの子オブジェクトを指定する

本日は Unity の小ネタ枠です。
Unityでオブジェクトの子オブジェクトを指定する方法についてです。

既にシーンに存在するオブジェクトを子オブジェクトに移動する

既にシーンに存在するオブジェクトを子オブジェクトに移動する場合、オブジェクトの Transfrom.parent に親オブジェクトを指定します。
docs.unity3d.com

using UnityEngine;

public class ParentTest : MonoBehaviour
{
    [SerializeField]
    private GameObject _childObject;
    
    void Start()
    {
        // 親オブジェクトを Transform.parent に指定する
        _childObject.transform.parent = this.transform;
    }
}

このときワールド空間としての位置、回転、スケールが維持されるよう、ローカル空間の位置、回転、スケールが更新されます。



子オブジェクトを新たに生成する

子オブジェクトを新たに生成する場合、Instantiate の引数に親オブジェクトを指定してオブジェクトを生成します。
docs.unity3d.com

using UnityEngine;

public class InstantiateTest : MonoBehaviour
{
    [SerializeField]
    private GameObject _spawnPrefab;
    
    void Start()
    {
        // 第二引数に指定したオブジェクトの子オブジェクトとしてオブジェクトをスポーンする
        GameObject spawnObject = Instantiate(_spawnPrefab, this.transform);
    }
}

生成された子オブジェクトのローカル空間の位置、回転、スケールは指定したプレハブに準拠します。

以下の座標、回転指定の Instantiate はワールド空間の位置、回転を指定します。

using UnityEngine;

public class InstantiateTest : MonoBehaviour
{
    [SerializeField]
    private GameObject _spawnPrefab;
    
    void Start()
    {
        // 第二引数に指定したオブジェクトの子オブジェクトとしてオブジェクトをスポーンする
        GameObject spawnObject = Instantiate(_spawnPrefab, Vector3.up, Quaternion.identity, this.transform);
    }
}

ローカル空間の位置、回転、スケールを指定したい場合は Instantiate の戻り値からオブジェクトの参照を取得して直接指定します。

using UnityEngine;

public class InstantiateTest : MonoBehaviour
{
    [SerializeField]
    private GameObject _spawnPrefab;
    
    void Start()
    {
        // 第二引数に指定したオブジェクトの子オブジェクトとしてオブジェクトをスポーンする
        GameObject spawnObject = Instantiate(_spawnPrefab, Vector3.up, Quaternion.identity, this.transform);
        spawnObject.transform.localPosition = Vector3.up;
        spawnObject.transform.localRotation = Quaternion.identity;
    }
}