やまめも

【 ゲーム開発・日々のことについて 】

オブジェクトの生成、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;
		}
	}

}