动画状态机

 

由题可知需要四个状态

先对四个状态和他们之间的关系进行处理

publicclassState{

    publicStateMachine machine;

    protectedfloat time;

    publicvirtualvoid EnterState() {}

    publicvirtualvoid UpdateState() {}

    publicvirtualvoid ExitState() { }

}

publicclassIdle : State

{

    privatefloat toWalkTime;

    publicoverridevoid EnterState()

    {

        Debug.Log("进入站岗状态");

        toWalkTime = Random.Range(2.0f, 3.0f);

    }

    publicoverridevoid UpdateState()

    {

        //持续站岗状态

        time += Time.deltaTime;

        if (time >= toWalkTime)

        {

            this.machine.ChangeState(StateType.Walk);

        }

        if (Input.GetKeyDown(KeyCode.F))

        {

            this.machine.ChangeState(StateType.Fire);

        }

    }

    publicoverridevoid ExitState()

    {

        time = 0;

    }

}

publicclassWalk : State

{

    privatefloat toIdleTime;

    publicoverridevoid EnterState()

    {

        Debug.Log("进入巡逻状态");

        toIdleTime = Random.Range(3.0f, 5.0f);

    }

    publicoverridevoid UpdateState()

    {

        Debug.Log("持续巡逻状态");

        time += Time.deltaTime;

        if (time >= toIdleTime)

        {

            this.machine.ChangeState(StateType.Idle);

        }

        if (Input.GetKeyDown(KeyCode.F))

        {

            this.machine.ChangeState(StateType.Fire);

        }

        if (this.machine.hp<=0)

        {

            this.machine.ChangeState(StateType.Die);

        }

    }

    publicoverridevoid ExitState()

    {

        time = 0;

    }

}

publicclassFire :State

{

    publicoverridevoid EnterState()

    {

        Debug.Log("进入开火状态");

    }

    publicoverridevoid UpdateState()

    {

        Debug.Log("持续开火状态");

        if (Input.GetKeyDown(KeyCode.L))

        {

            this.machine.ChangeState(StateType.Walk);

        }

        if (this.machine.hp <= 0)

        {

            this.machine.ChangeState(StateType.Die);

        }

    }

    publicoverridevoid ExitState()

    {

       

    }

}

publicclassDie : State

{

    publicoverridevoid EnterState()

    {

        Debug.Log("进入死亡状态");

    }

    publicoverridevoid UpdateState()

    {

       

    }

    publicoverridevoid ExitState()

    {

    }

}

规定状态之间相互切换

publicenumStateType

{

    Idle,

    Walk,

    Fire,

    Die

}

publicclassStateMachine

{

    publicDictionary<StateType, State> dic = newDictionary<StateType, State>();

    privateState currentState;

    privateState lastState;

    publicint hp = 5;

    publicvoid Register(StateType key, State value)

    {

        value.machine = this;

        dic.Add(key, value);

    }

    publicvoid ChangeState(StateType key)

    {

        if (dic.ContainsKey(key))

        {

            currentState = dic[key];

        }

    }

    publicvoid DoWork()

    {

        if (currentState != lastState)

        {

            currentState.EnterState();

            lastState = currentState;

        }

        currentState.UpdateState();

        if (lastState != currentState)

        {

            lastState.ExitState();

        }

        if (Input.GetKeyDown(KeyCode.S))

        {

            hp--;

        }

    }

}

编写状态运行方法

publicclassAI : MonoBehaviour {

    privateStateMachine stateMachine = newStateMachine();

         // Use this for initialization

         void Start () {

        stateMachine.Register(StateType.Idle, newIdle());

        stateMachine.Register(StateType.Walk, newWalk());

        stateMachine.Register(StateType.Fire, newFire());

        stateMachine.Register(StateType.Die, newDie());

        stateMachine.ChangeState(StateType.Idle);

         }

         // Update is called once per frame

         void Update () {

        stateMachine.DoWork();

         }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值