Unity将Npc脚本状态更新放在Player脚本状态更新之后执行的四种方法

Unity将Npc脚本状态更新放在Player脚本状态更新之后执行的四种方法

问题:控制Npc的状态更新在Player的状态更新之后,可能有哪些方法?

方案一:LateUpdate()

将Npc的状态更新逻辑放在LateUpdate()内,Player的状态更新逻辑放在Update()内

方案二:Invoke()

Invoke()的作用是:在应用程序的主线程上执行指定的委托。我们通过Invoke调用Npc的状态更新逻辑时,设置一定时间的延迟,以确保它在Player的状态更新之后。

方案三:Script Execution Order

在Unity也提供了一个方法来设置脚本的执行顺序,在Edit -> Project Settings -> Script Execution Order菜单项中可以修改脚本顺序,Default Time表示没有设置脚本的执行顺序的那些脚本的执行顺序。
首先我们为player,npc和camera添加对应的代码(如下图所示),这样就可以在控制台看到函数被调用的先后顺序。

public class CameraController : MonoBehaviour {

	bool isUpdate = false;
	bool isLateUpdate = false;

    // Use this for initialization
    void Start () {
		Debug.Log("Camera Start()");
    }
    
    // Update is called once per frame
    void Update () {
		if (!isUpdate)
		{
			Debug.Log("Camera Update()");
			isUpdate = true;
		}
   }
	void LateUpdate(){
		if(!isLateUpdate)
		{
			Debug.Log("Camera LateUpdate()");
			isLateUpdate = true;
		} 
	}
}

Unity将Npc脚本状态更新放在Player脚本状态更新之后执行的四种方法_第1张图片
默认情况下三个script的执行顺序
Unity将Npc脚本状态更新放在Player脚本状态更新之后执行的四种方法_第2张图片
默认情况下三个script的default time
这里可以看到函数执行顺序和Default Time的值是对应的,Default Time越小,函数越早执行。所以可以通过修改default time的值来修改执行顺序。我们把PlayController修改为200,NpcController修改为300,Apply一下,再次运行来看运行顺序。
Unity将Npc脚本状态更新放在Player脚本状态更新之后执行的四种方法_第3张图片
修改default time的值
Unity将Npc脚本状态更新放在Player脚本状态更新之后执行的四种方法_第4张图片
修改后三个script的执行顺序

方案四:使用协同程序

协程就像一个函数,能够暂停执行并将控制返回给Unity,然后继续在下一帧停止的地方继续。它本质上是一个用返回类型IEnumerator声明的函数,并且yield return语句包含在body中的某个地方。yield return null line是执行暂停并在下一帧恢复的点。要设置coroutine运行,需要使用StartCoroutine函数。
在Npc的控制脚本中使用协程,他会在所有update之后执行状态更新的逻辑.

void Update(){
StartCoroutine("NpcUpdate");
}

IEnumerator NpcUpdate()
{
//Npc Update 在这里进行npc的状态更新逻辑
yield return null;
}

你可能感兴趣的:(Unity,C#)