Unity_Lesson

プレハブ(Prefab)を生成する際、生成されたオブジェクトにヒエラルキー上のオブジェクト(HierarchyObject)の情報をセットし、それを動的に操作できる仕組みについて
(prefabに直接セット出来ないので、それの解決案)

PrefabObjectを生成し、HierarchyObjectの情報を取得する例


HierarchyObject.cs

  public class HierarchyObject : MonoBehaviour
  {
      public int hp = 100;
  }

   

PrefabObject.cs

生成するプレハブに、このスクリプトをアタッチします。

このプレハブは、生成された後にHierarchyObjectの参照をセットし、その情報を利用します。

この時点でインスペクターにセットしようとしてもセット出来ません。

 


InstantinatePrefab.cs

プレハブを定期的に生成し、その際に生成されたプレハブに対して、ヒエラルキー上にあるHierarchyObjectの参照を設定する役割を持っています。

  1. 位置をランダムな位置にプレハブを生成。
  2. 生成されたプレハブにアタッチされているPrefabObjectを取得し、そのSetHierarchyObject()メソッドを使って、hierarchyObjectの参照を渡します。
  3. 一定時間後に生成されたオブジェクトを破棄します。
public class InstantinatePrefab : MonoBehaviour
{
    [SerializeField] GameObject prefabObject;
    [SerializeField] HierarchyObject hierarchyObject;
    float interval = 3f ;

    void Start()
    {
        //実行したいメソッド名(stringで指定します),初回実行までの遅延時間(秒単位),その後の繰り返し実行の間隔(秒単位)
        InvokeRepeating(nameof(GeneratePrefab), 0, interval);
    }

    void GeneratePrefab()
    {
        Vector3 generatePos = new Vector3(0f, Random.Range(-1, 1), 0f);
        GameObject gObject = Instantiate(prefabObject, generatePos, Quaternion.identity);

        // 生成と同時に必要な参照をセット
        PrefabObject pObject = gObject.GetComponent<PrefabObject>();
        if (pObject != null)
        {
            pObject.SetHierarchyObject(hierarchyObject);
        }

        Destroy(gObject, interval); // 自動で指定秒数後に削除
    }
}