Esempio n. 1
0
    /// <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);
    }