public StateMachineActor(ActorBehaviour ab)
    {
        _actorBehaviour = ab;

        var idleState   = new ActorIdleState(this, _actorBehaviour);
        var walkState   = new ActorWalkState(this, _actorBehaviour);
        var fightState  = new ActorFightState(this, _actorBehaviour);
        var dieState    = new ActorDieState(this, _actorBehaviour);
        var vanishState = new ActorDieState(this, _actorBehaviour);

        var stateList = new Dictionary <FSMStateActor.StateEnum, IFsmState>
        {
            { FSMStateActor.StateEnum.IDLE, idleState },
            { FSMStateActor.StateEnum.WALK, walkState },
            { FSMStateActor.StateEnum.FIGHT, fightState },
            { FSMStateActor.StateEnum.DIE, dieState },
            { FSMStateActor.StateEnum.VANISH, vanishState },
        };

        SetStates(stateList);

        var allowedTransitions = new Dictionary <FSMStateActor.StateEnum, IList <FSMStateActor.StateEnum> >();

        allowedTransitions.Add(FSMStateActor.StateEnum.IDLE, new List <FSMStateActor.StateEnum>
        {
            FSMStateActor.StateEnum.WALK,
            FSMStateActor.StateEnum.FIGHT,
            FSMStateActor.StateEnum.DIE,
        });
        allowedTransitions.Add(FSMStateActor.StateEnum.WALK, new List <FSMStateActor.StateEnum>
        {
            FSMStateActor.StateEnum.IDLE,
            FSMStateActor.StateEnum.FIGHT,
            FSMStateActor.StateEnum.DIE,
        });
        allowedTransitions.Add(FSMStateActor.StateEnum.FIGHT, new List <FSMStateActor.StateEnum>
        {
            FSMStateActor.StateEnum.IDLE,
            FSMStateActor.StateEnum.WALK,
            FSMStateActor.StateEnum.DIE,
        });
        allowedTransitions.Add(FSMStateActor.StateEnum.DIE, new List <FSMStateActor.StateEnum>
        {
            FSMStateActor.StateEnum.VANISH,
        });
        allowedTransitions.Add(FSMStateActor.StateEnum.VANISH, new List <FSMStateActor.StateEnum>
        {
            FSMStateActor.StateEnum.NONE,
        });
        SetTransitions(allowedTransitions);
    }
Ejemplo n.º 2
0
    public StateMachineActor(ActorBehaviour ab)
    {
        _actorBehaviour = ab;

        var idleState       = new ActorIdleState(this, _actorBehaviour);
        var dieState        = new ActorDieState(this, _actorBehaviour);
        var vanishState     = new ActorVanishState(this, _actorBehaviour);
        var harvestState    = new ActorHarvestState(this, _actorBehaviour);
        var walkState       = new ActorWalkState(this, _actorBehaviour);
        var walkFightState  = new ActorWalkFightState(this, _actorBehaviour);
        var fightState      = new ActorFightState(this, _actorBehaviour);
        var delayFightState = new ActorDelayFightState(this, _actorBehaviour);
        var guardState      = new ActorGuardState(this, _actorBehaviour);

        var stateList = new Dictionary <StateEnum, IFsmState>
        {
            { StateEnum.IDLE, idleState },
            { StateEnum.DIE, dieState },
            { StateEnum.VANISH, vanishState },
            { StateEnum.HARVEST, harvestState },
            { StateEnum.WALK, walkState },
            { StateEnum.WALKFIGHT, walkFightState },
            { StateEnum.FIGHT, fightState },
            { StateEnum.DELAYFIGHT, delayFightState },
            { StateEnum.GUARD, guardState },
        };

        SetStates(stateList);

        var allowedTransitions = new Dictionary <StateEnum, IList <StateEnum> >();

        allowedTransitions.Add(StateEnum.IDLE, new List <StateEnum>
        {
            StateEnum.IDLE,
            StateEnum.DIE,
            StateEnum.HARVEST,
            StateEnum.WALK,
            StateEnum.WALKFIGHT,
            StateEnum.FIGHT,      // 敌人如果在附近,直接可以进入战斗状态
            StateEnum.DELAYFIGHT, // 间隔一定的时间再攻击, 弹药基数足够的情况下,第二次攻击都用此方式
            StateEnum.GUARD,
        });
        allowedTransitions.Add(StateEnum.DIE, new List <StateEnum>
        {
            StateEnum.DIE,
            StateEnum.VANISH,
        });
        allowedTransitions.Add(StateEnum.VANISH, new List <StateEnum>
        {
            StateEnum.NONE,
            StateEnum.VANISH,
        });
        allowedTransitions.Add(StateEnum.HARVEST, new List <StateEnum>
        {
            StateEnum.IDLE,
            StateEnum.DIE,
            StateEnum.WALK,
            StateEnum.WALKFIGHT,
            StateEnum.FIGHT,
            StateEnum.GUARD,
        });
        allowedTransitions.Add(StateEnum.WALK, new List <StateEnum>
        {
            StateEnum.IDLE,
            StateEnum.DIE,
            StateEnum.WALK,
            StateEnum.WALKFIGHT,
            StateEnum.FIGHT,
            StateEnum.DELAYFIGHT,
            StateEnum.GUARD,
        });
        allowedTransitions.Add(StateEnum.WALKFIGHT, new List <StateEnum>
        {
            StateEnum.IDLE,
            StateEnum.DIE,
            StateEnum.WALK,
            StateEnum.WALKFIGHT,
            StateEnum.FIGHT,
            StateEnum.DELAYFIGHT,
            StateEnum.GUARD,
        });
        allowedTransitions.Add(StateEnum.FIGHT, new List <StateEnum>
        {
            StateEnum.IDLE,
            StateEnum.DIE,
            StateEnum.WALK,
            StateEnum.WALKFIGHT,
            StateEnum.FIGHT,
            StateEnum.DELAYFIGHT,
            StateEnum.GUARD,
        });
        allowedTransitions.Add(StateEnum.DELAYFIGHT, new List <StateEnum>
        {
            StateEnum.IDLE,
            StateEnum.DIE,
            StateEnum.WALK,
            StateEnum.WALKFIGHT,
            StateEnum.FIGHT,
            StateEnum.GUARD,
        });
        allowedTransitions.Add(StateEnum.GUARD, new List <StateEnum>
        {
            StateEnum.IDLE,
            StateEnum.DIE,
            StateEnum.WALK,
            StateEnum.WALKFIGHT,
            StateEnum.FIGHT,
            StateEnum.GUARD,
        });
        SetTransitions(allowedTransitions);
    }