public override IEnumerator ExcuteState() { //要转换的状态 AIStateEnum nextState = AIStateEnum.None; dir = aiAttribute.GetPlayerDir(); npcAnim.SetRunDir(dir); npcAnim.StartRunAnim(); while (nextState == AIStateEnum.None) {//只要还没退出 nextState = CheckNextState(); dir = aiAttribute.GetPlayerDir(); //播放动画 npcAnim.SetRunDir(dir); //移动留到FixedUpdate后执行 yield return(new WaitForFixedUpdate()); //主角移动 Move(); yield return(0); } npcAnim.StopRunAnim(); aiAttribute.GetComponent <PlayerController>().stateMachine.ChangeState(nextState); yield return(null); }
/// <summary> /// 移动的函数 /// </summary> /// <param name="dic">方向</param> /// <param name="desPos">目标点</param> /// <returns></returns> IEnumerator NpcMove(PersonDirection dir, Vector3 desPos) { Vector3 dicVector3 = MoveDir(dir); //设置动画 npcAnim.SetRunDir(dir); npcAnim.StartRunAnim(); bool arrive = false; //只要还没有到达 while (!arrive) { //在FixedUpdate调用之后才执行接下来的代码 yield return(new WaitForFixedUpdate()); dicVector3 = dicVector3.normalized * moveSpeed * Time.deltaTime; transform.Translate(dicVector3); if (desPos.x == 0) {//如果是y方向上的移动 arrive = Mathf.Abs(transform.localPosition.y - desPos.y) < 0.05f; } else if (desPos.y == 0) {//如果是x方向上的移动 arrive = Mathf.Abs(transform.localPosition.x - desPos.x) < 0.05f; } } //停止动画 npcAnim.StopRunAnim(); //移动后的停留时间 if (stayHereTime != 0f) { yield return(new WaitForSeconds(stayHereTime)); } //通知移动事件结束 CommandManager.Instance.CommandOver(); yield return(null); }