/// <summary> /// 初始化 /// </summary> void Init() { fsm = new FSMSystem(); agent = GetComponent <NavMeshAgent>(); anim = GetComponent <Animator>(); player = GameObject.FindWithTag("Player").transform; wayPoints = GameObject.FindGameObjectsWithTag("PatrolPoint"); patrol = new Patrol(fsm, transform, player, agent, anim, wayPoints); chase = new Chase(fsm, transform, player, agent, anim); attack = new Attack(fsm, transform, player, agent, anim); dead = new Dead(fsm, transform, player, agent, anim); hit = new Hit(fsm, transform, player, agent, anim); #region 改变状态 //看家玩家之后改变自己的状态为追击 看见玩家 -> 追击玩家 patrol.AddTransition(Transition.SawPlayer, FSMState.Chase); //巡逻过程中,可能会被玩家攻击 patrol.AddTransition(Transition.GetHit, FSMState.Hit); //巡逻中玩家进入它的范围 -> 开始攻击 patrol.AddTransition(Transition.ReachPlayer, FSMState.Attack); //追击的过程中,玩家移速过快,距离范围过大 丢失玩家 -> 开始巡逻 chase.AddTransition(Transition.LostPlayer, FSMState.Patrol); //追击过程中,追到了玩家 -> 开始攻击 chase.AddTransition(Transition.ReachPlayer, FSMState.Attack); //收到攻击 chase.AddTransition(Transition.GetHit, FSMState.Hit); //攻击过程中 玩家移动,只要还在距离范围内,就会触发追击,直至玩家超出指定距离 attack.AddTransition(Transition.SawPlayer, FSMState.Chase); //攻击过程中,玩家突然死亡,或者距离超出 就去巡逻 attack.AddTransition(Transition.LostPlayer, FSMState.Patrol); //收到攻击 attack.AddTransition(Transition.GetHit, FSMState.Hit); //被击打的时候,也会存在丢失玩家的情况 hit.AddTransition(Transition.LostPlayer, FSMState.Patrol); #endregion fsm.AddState(patrol); fsm.AddState(chase); fsm.AddState(attack); fsm.AddState(dead); fsm.AddState(hit); }