先来看看这样的情况:如果想做一只左右游动的鱼的行为,那么用状态机的思路就是左和右两个状态。那么代码写出来差不多就是
void Update() { if(state==left){...} else{...} }
for(...) fish.moveleft(); for(...) fish.moveright();
但是当游戏的处理方式变成以Update为一帧的处理方式之后,这种无脑的方法就失效了,这样出来的效果会是鱼根本不动,具体为什么我想写过的人都知道。于是就出现了冗长的switch或者if语句,而要做的仅仅就是切换几个状态而已
来看看用协程是怎么做的吧
using UnityEngine; using System.Collections; public class NewBehaviourScript : MonoBehaviour { public Transform fish; // Use this for initialization void Start () { StartCoroutine(Move(100)); } IEnumerator Move(int speed) { float ut = 0; while (true) { ut += Time.deltaTime; if (ut >= 2) { ut = 0; var angles = fish.transform.localEulerAngles; angles.z += 180; fish.transform.localEulerAngles = angles; } fish.Translate(speed * Time.deltaTime, 0, 0); yield return 0; } } }
说是这么说,但是当实现一种功能成习惯的时候,通常仍然习惯性的使用老方法而不会去使用新方法,虽然用熟练的方法可以更快的完成任务,但是想本质上提高效率还是需要思想上的进一步提升。这也是别人动不动能写一个框架,而你实现个小功能却找了半天bug的差距所在,很多时候开始的方向就是错的