順番の枠組み
順番の枠組み
Unityでは通常毎フレームずつ進める。
しかしプログラムが終わると次のプログラムというふうに順番に進めることもできる。
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System;
public class タイトル:MonoBehaviour
void Start()
{
StartCoroutine(コルーチンプログラム());
}
IEnumerator コルーチンプログラム()
{
Debug.Log("敵が出た");
yield return new WaitForSeconds(2f);
Debug.Log("攻撃");
}
}
説明
コルーチンは別の並行処理として実行される。
startに書くか、フラグをつけてやらないと毎フレーム新しいコルーチン処理が増えていく。
コルーチンは Update を止めない
yield はコルーチンだけを止める
コルーチンの動くプログラム
IEnumerator 1フレームだけ動くコルーチン()
{
A.transform.Translate(方向.normalized * 速度 * Time.deltaTime, Space.World);
}
1フレームだけ動いて終了。
IEnumerator 毎フレーム動くコルーチン()
{
while(true)
{
A.transform.Translate(方向.normalized * 速度 * Time.deltaTime, Space.World);
yield return null;
}
}
毎フレーム Translate が実行される(Update と同じ動き)。
yield return null; を書かないと、
1フレームの中で無限に Translate を実行し続け、Unity が固まる(CPU100%)
IEnumerator 目的座標まで動くコルーチン(Vector3 target)
{
while(Vector3.Distance(A.transform.position, target) > 0.01f)
{
A.transform.Translate(方向.normalized * 速度 * Time.deltaTime, Space.World);
yield return null;
}
}
目的地に着くまで毎フレーム動く。
IEnumerator 3秒動くコルーチン(Vector3 target)
{
float t = 0f;
while (t < 3f)
{
A.transform.Translate(方向.normalized * 速度 * Time.deltaTime, Space.World);
t += Time.deltaTime;
yield return null;
}
}

