Пример #1
0
    /// <summary>
    /// 初始化状态机
    /// 状态和转换条件在这统一初始化添加
    /// 默认 除了skill和fight状态 其余状态要切换到其他状态的时候 要先切换到idle状态
    /// </summary>
    protected override void InitStateMachine()
    {
        stateDic   = new Dictionary <StateID, FSMState>();
        m_FSM      = new FSMSystem();
        idleState  = new PlayerIdleState();
        moveState  = new PlayerMoveState();
        fightState = new PlayerFightState();
        skillState = new PlayerSkillState();


        //attr = player.GetComponent<AttrController>();
        m_FSM.attr = attr;

        m_FSM.AddState(idleState, this);
        stateDic.Add(idleState.ID, idleState);
        idleState.AddTransition(Transition.IsIdle, StateID.Idle);
        idleState.AddTransition(Transition.IsMove, StateID.Move);
        idleState.AddTransition(Transition.IsDeath, StateID.Death);
        idleState.AddTransition(Transition.IsFight, StateID.Fight);
        idleState.AddTransition(Transition.IsCast_Skill, StateID.Cast_Skill);
        idleState.AddTransition(Transition.IsRiding, StateID.Riding);
        idleState.AddTransition(Transition.IsVigilance, StateID.Vigilance);
        idleState.AddTransition(Transition.IsChatStart, StateID.ChatStart);
        idleState.AddTransition(Transition.IsChatEnd, StateID.ChatEnd);


        m_FSM.AddState(moveState, this);
        stateDic.Add(moveState.ID, moveState);
        moveState.AddTransition(Transition.IsIdle, StateID.Idle);

        m_FSM.AddState(fightState, this);
        stateDic.Add(fightState.ID, fightState);
        fightState.AddTransition(Transition.IsIdle, StateID.Idle);
        fightState.AddTransition(Transition.IsCast_Skill, StateID.Cast_Skill);
        fightState.AddTransition(Transition.IsMove, StateID.Move);

        m_FSM.AddState(skillState, this);
        stateDic.Add(skillState.ID, skillState);
        skillState.AddTransition(Transition.IsIdle, StateID.Idle);
        skillState.AddTransition(Transition.IsFight, StateID.Fight);

        //初始状态分主城(Idle)和地下城(Fight)
        //设置初始状态(idle状态)

        if (AttrController.Instance.Fight())
        {
            m_FSM.SetCurrentState(fightState);
            m_FSM.CurrentState.m_MyJoystick = ETCInput.GetControlJoystick("MyJoystick");
            //m_FSM.attr.StartCoroutine(fightState.DoLogic());
        }
        else
        {
            m_FSM.SetCurrentState(idleState);
            m_FSM.CurrentState.m_MyJoystick = ETCInput.GetControlJoystick("MyJoystick");
        }
        //m_FSM.attr.StartCoroutine(idleState.DoLogic());
        //idleState.RunLogic();

        //测试战斗状态
        //m_FSM.SetCurrentState(fightState);
        //m_FSM.CurrentState.m_MyJoystick = ETCInput.GetControlJoystick("MyJoystick");
        //m_FSM.attr.StartCoroutine(fightState.DoLogic());
    }
Пример #2
0
    //NPC有两个状态分别是在路径中巡逻和追逐玩家
    //如果他在第一个状态并且SawPlayer 过度状态被出发了,它就转变到ChasePlayer状态
    //如果他在ChasePlayer状态并且LostPlayer状态被触发了,它就转变到FollowPath状态

    private void MakeFSM()//建造状态机
    {
        PlayerIdleState idle = new PlayerIdleState();

        idle.AddTransition(Transition.FreeWalk, StateID.Walk);
        idle.AddTransition(Transition.Dead, StateID.Dead);
        idle.AddTransition(Transition.Acct, StateID.Acct);
        idle.AddTransition(Transition.Skill, StateID.Skill);
        idle.AddTransition(Transition.CrashPlayer, StateID.CrashPlayer);

        PlayerWalkState walk = new PlayerWalkState();

        walk.AddTransition(Transition.FreeWalk, StateID.Walk);
        walk.AddTransition(Transition.Acct, StateID.Acct);
        walk.AddTransition(Transition.Skill, StateID.Skill);
        walk.AddTransition(Transition.Dead, StateID.Dead);
        walk.AddTransition(Transition.Idle, StateID.Idle);
        walk.AddTransition(Transition.CrashPlayer, StateID.CrashPlayer);

        PlayerDeadState dead = new PlayerDeadState();

        dead.AddTransition(Transition.Dead, StateID.Dead);
        dead.AddTransition(Transition.Idle, StateID.Idle);
        dead.AddTransition(Transition.FreeWalk, StateID.Walk);

        PlayerAcceState acce = new PlayerAcceState();

        acce.AddTransition(Transition.Acct, StateID.Acct);
        acce.AddTransition(Transition.Skill, StateID.Skill);
        acce.AddTransition(Transition.FreeWalk, StateID.Walk);
        acce.AddTransition(Transition.Dead, StateID.Dead);
        acce.AddTransition(Transition.Idle, StateID.Idle);
        acce.AddTransition(Transition.CrashPlayer, StateID.CrashPlayer);

        PlayerSkillState skill = new PlayerSkillState();

        skill.AddTransition(Transition.Skill, StateID.Skill);
        skill.AddTransition(Transition.Acct, StateID.Acct);
        skill.AddTransition(Transition.FreeWalk, StateID.Walk);
        skill.AddTransition(Transition.Dead, StateID.Dead);
        skill.AddTransition(Transition.Idle, StateID.Idle);
        skill.AddTransition(Transition.CrashPlayer, StateID.CrashPlayer);

        //PlayerSwitchState sw = new PlayerSwitchState();
        //sw.AddTransition(Transition.Skill, StateID.Skill);
        //sw.AddTransition(Transition.Acct, StateID.Acct);
        //sw.AddTransition(Transition.FreeWalk, StateID.Walk);
        //sw.AddTransition(Transition.Dead, StateID.Dead);
        //sw.AddTransition(Transition.Idle, StateID.Idle);
        //sw.AddTransition(Transition.CrashPlayer, StateID.CrashPlayer);

        PlayerCrashState crash = new PlayerCrashState();

        crash.AddTransition(Transition.Skill, StateID.Skill);
        crash.AddTransition(Transition.Acct, StateID.Acct);
        crash.AddTransition(Transition.FreeWalk, StateID.Walk);
        crash.AddTransition(Transition.Dead, StateID.Dead);
        crash.AddTransition(Transition.Idle, StateID.Idle);

        Fsm = new FSMSystem();
        Fsm.AddState(idle);
        Fsm.AddState(walk);
        Fsm.AddState(acce);
        Fsm.AddState(skill);
        Fsm.AddState(dead);
        //Fsm.AddState(sw);
        Fsm.AddState(crash);
    }