예제 #1
0
    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);
    }
예제 #2
0
    /// <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);
    }