オブジェクトの生成、UpdateよりCoroutine
Updateでオブジェクト生成のメソッドを書くより、StartCoroutineを使って生成する方が早くなる。(理由は・・・)
Coroutineとwhileを使ってオブジェクトを生成する。
using UnityEngine; using System.Collections; public class Interpolator3 : MonoBehaviour { float Distance12; float Distance2new; GameObject Obj1; GameObject Obj2; public GameObject Prefab; Vector3 UnitVector; float distanceMin = 0.1f; void Start () { Obj1 = GameObject.Find("Object1"); Obj2 = GameObject.Find("Object2"); // 2点間の距離 Distance12 = Vector3.Distance(Obj1.transform.localPosition, Obj2.transform.localPosition); // 2つのオブジェクトの方向ベクトル UnitVector = ( Obj2.transform.position - Obj1.transform.position ).normalized; StartCoroutine(CreateSon()); } // nはグローバルにしてカウントする。 int n = 1; IEnumerator CreateSon () { while(true){ if( Distance12 > distanceMin){ if(GameObject.Find("Son_1") == null){ Vector3 Pos = Obj1.transform.localPosition + UnitVector * (distanceMin * 2f); GameObject obj = Instantiate(Prefab, Pos, Quaternion.identity) as GameObject; obj.name = "Son_1"; } } Distance2new = Vector3.Distance(GameObject.Find("Son_" + n).transform.position,Obj2.transform.localPosition); if(Distance2new > distanceMin){ // yield return new WaitForSeconds(0.001f); Vector3 PosNext = GameObject.Find("Son_" + n).transform.localPosition + UnitVector * (distanceMin * 2f); GameObject objNext = Instantiate(Prefab, PosNext, Quaternion.identity) as GameObject; n++; objNext.name = "Son_" + n; } else{ yield break; } } }
Upadte内でオブジェクトを生成する。
// nはグローバルにしてカウントする。 int n = 1; void Update () { if( Distance12 > distanceMin){ if(GameObject.Find("Son_1") == null){ Vector3 Pos = Obj1.transform.localPosition + UnitVector * (distanceMin * 2f); GameObject obj = Instantiate(Prefab, Pos, Quaternion.identity) as GameObject; obj.name = "Son_1"; } } Distance2new = Vector3.Distance(GameObject.Find("Son_" + n).transform.position,Obj2.transform.localPosition); if(Distance2new > distanceMin){ Vector3 PosNext = GameObject.Find("Son_" + n).transform.localPosition + UnitVector * (distanceMin * 2f); GameObject objNext = Instantiate(Prefab, PosNext, Quaternion.identity) as GameObject; n++; objNext.name = "Son_" + n; } }
}