/// <summary>切换状态</summary> /// <param name="newState">新状态</param> public void ChangeState(RoleState newState) { if (CurrRoleCtrl.CurrRoleType == RoleType.Monster) { //Debug.Log(newState.ToString()); } //因为休闲 战斗 都有多种状态 所以此处需要排除 休闲 攻击状态(因为可能需要从普通休闲切换到战斗休闲及技能切换) if (CurrRoleStateEnum == newState && CurrRoleStateEnum != RoleState.Idle && CurrRoleStateEnum != RoleState.Attack) { return; } //调用以前状态的离开方法 if (m_CurrRoleState != null) { m_CurrRoleState.OnLeave(); } //更改当前状态枚举 CurrRoleStateEnum = newState; //更改当前状态 m_CurrRoleState = m_RoleStateDic[newState]; if (CurrRoleStateEnum == RoleState.Idle) { //给当前待机状态赋值 CurrIdleState = ToIdleState; } //调用新状态的进入方法 m_CurrRoleState.OnEnter(); }
internal void ToResurgence(RoleIdleState idleNormal) { throw new NotImplementedException(); }
public void ToIdle(RoleIdleState state = RoleIdleState.IdleNormal) { CurrRoleFSMMgr.ToIdleState = state; CurrRoleFSMMgr.ChangeState(RoleState.Idle); }
//NPC有两个状态分别是在路径中巡逻和追逐玩家 //如果他在第一个状态并且SawPlayer 过度状态被出发了,它就转变到ChasePlayer状态 //如果他在ChasePlayer状态并且LostPlayer状态被触发了,它就转变到FollowPath状态 private void MakeFSM()//建造状态机 { RoleIdleState idle = new RoleIdleState(); idle.AddTransition(RoleTransition.Idle, RoleStateID.Idle); idle.AddTransition(RoleTransition.FreeWalk, RoleStateID.Walk); idle.AddTransition(RoleTransition.Dead, RoleStateID.Dead); idle.AddTransition(RoleTransition.Acct, RoleStateID.Acct); idle.AddTransition(RoleTransition.Skill, RoleStateID.Skill); idle.AddTransition(RoleTransition.CrashPlayer, RoleStateID.CrashPlayer); RoleWalkState walk = new RoleWalkState(); walk.AddTransition(RoleTransition.FreeWalk, RoleStateID.Walk); walk.AddTransition(RoleTransition.Acct, RoleStateID.Acct); walk.AddTransition(RoleTransition.Skill, RoleStateID.Skill); walk.AddTransition(RoleTransition.Dead, RoleStateID.Dead); walk.AddTransition(RoleTransition.Idle, RoleStateID.Idle); walk.AddTransition(RoleTransition.CrashPlayer, RoleStateID.CrashPlayer); RoleDeadState dead = new RoleDeadState(); dead.AddTransition(RoleTransition.Dead, RoleStateID.Dead); dead.AddTransition(RoleTransition.Idle, RoleStateID.Idle); RoleAcctState acce = new RoleAcctState(); acce.AddTransition(RoleTransition.Acct, RoleStateID.Acct); acce.AddTransition(RoleTransition.Skill, RoleStateID.Skill); acce.AddTransition(RoleTransition.FreeWalk, RoleStateID.Walk); acce.AddTransition(RoleTransition.Dead, RoleStateID.Dead); acce.AddTransition(RoleTransition.Idle, RoleStateID.Idle); acce.AddTransition(RoleTransition.CrashPlayer, RoleStateID.CrashPlayer); RoleSkillState skill = new RoleSkillState(); skill.AddTransition(RoleTransition.Skill, RoleStateID.Skill); skill.AddTransition(RoleTransition.Acct, RoleStateID.Acct); skill.AddTransition(RoleTransition.FreeWalk, RoleStateID.Walk); skill.AddTransition(RoleTransition.Dead, RoleStateID.Dead); skill.AddTransition(RoleTransition.Idle, RoleStateID.Idle); skill.AddTransition(RoleTransition.CrashPlayer, RoleStateID.CrashPlayer); skill.AddTransition(RoleTransition.Switch, RoleStateID.Switch); RoleSwitchState sw = new RoleSwitchState(); sw.AddTransition(RoleTransition.Skill, RoleStateID.Skill); sw.AddTransition(RoleTransition.Acct, RoleStateID.Acct); sw.AddTransition(RoleTransition.FreeWalk, RoleStateID.Walk); sw.AddTransition(RoleTransition.Idle, RoleStateID.Idle); sw.AddTransition(RoleTransition.Dead, RoleStateID.Dead); sw.AddTransition(RoleTransition.CrashPlayer, RoleStateID.CrashPlayer); RoleCrashState crash = new RoleCrashState(); crash.AddTransition(RoleTransition.Skill, RoleStateID.Skill); crash.AddTransition(RoleTransition.Acct, RoleStateID.Acct); crash.AddTransition(RoleTransition.FreeWalk, RoleStateID.Walk); crash.AddTransition(RoleTransition.Dead, RoleStateID.Dead); crash.AddTransition(RoleTransition.Idle, RoleStateID.Idle); Fsm = new RoleFSMSystem(); Fsm.AddState(idle); Fsm.AddState(walk); Fsm.AddState(acce); Fsm.AddState(skill); Fsm.AddState(dead); Fsm.AddState(sw); Fsm.AddState(crash); }