Unity-协程

协程的简单实现

​ 一般的程序执行都是线性的,也就是必须一行一行的执行代码。

​ 使用Unity提供的协程,就可以类似于开辟另一条线程,调整根据你所写的代码,调整下一行代码执行的时间。

项目示例

​ 下面的例子是一个 U3D Demo 中的代码,实现最简单的 Enemy 追击 Player 的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
IEnumerator MoveToAttackTarget()
{
agent.isStopped = false; // agent is NavMeshComponent

transform.LookAt(attackTarget.transform);

while(Vector3.Distance(attackTarget.transform.position,transform.position)>2)
{
agent.destination = attackTarget.transform.position; //Move to attack target
yield return null;
}

agent.isStopped = true;

if(LastAttackTime<0) //Attack
{
anim.SetTrigger("Attack");
LastAttackTime = 0.5f;
}
}

更多可能 - Update优化

使用协程模拟Update函数

1
2
3
4
5
6
7
8
9
10
11
12
13
protected virtual void Start()
{
StartCoroutine(IEUpdate());
}

protected virtual IEnumerator IEUpdate()
{
while(true)
{
yield return null;
//需要每帧执行的语句
}
}

相对于Update的优点(仅个人见解):

  1. 可以随时停止调用
  2. 在只调用一次的方法中启动一段每帧执行的代码片段

深入Unity Coroutine

深入Unity Coroutine - 知乎 (zhihu.com)