PrefabReference
プレハブ(Prefab)を生成する際、生成されたオブジェクトにヒエラルキー上のオブジェクト(HierarchyObject)の情報をセットし、それを動的に操作できる仕組みについて
(prefabに直接セット出来ないので、それの解決案)
PrefabObjectを生成し、HierarchyObjectの情報を取得する例
HierarchyObject.cs
public class HierarchyObject : MonoBehaviour
{
public int hp = 100;
}
PrefabObject.cs
生成するプレハブに、このスクリプトをアタッチします。
このプレハブは、生成された後にHierarchyObjectの参照をセットし、その情報を利用します。
この時点でインスペクターにセットしようとしてもセット出来ません。
-
SetHierarchyObjectメソッド:
このメソッドを使って、生成時にHierarchyObjectの参照を外部からセットします。 -
Update()メソッド:
毎フレーム、HierarchyObjectのhpをデバッグログに出力することで、プレハブとヒエラルキーオブジェクトが正しく関連付けられているか確認します。public class PrefabObject : MonoBehaviour
{
[SerializeField] HierarchyObject hierarchyObject;
void Update()
{
Debug.Log(hierarchyObject.hp);
}
public void SetHierarchyObject(HierarchyObject hObject)
{
this.hierarchyObject = hObject;
}
}
InstantinatePrefab.cs
プレ ハブを定期的に生成し、その際に生成されたプレハブに対して、ヒエラルキー上にあるHierarchyObjectの参照を設定する役割を持っています。
- 位置をランダムな位置にプレハブを生成。
- 生成されたプレハブにアタッチされている
PrefabObjectを取得し、そのSetHierarchyObject()メソッドを使って、hierarchyObjectの参照を渡します。 - 一定時間後に生成されたオブジェクトを破棄します。
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); // 自動で指定秒数後に削除
}
}