Beispiel #1
0
    void Update()
    {
        if (isDie)
        {
            state = EnemyFightState.Die;
        }
        else
        {
            if (actionBar.GetComponent <UISlider>().value == 1) //当行动条的位置达到终点,NGUI滑动器的最大值为1,最小值为0,所以value=1,就代表到达最大值
            {
                FightManager.main.state = FightState.Enemy;     //把整个游戏的战斗状态为敌人控制
                state = EnemyFightState.Atk;                    //敌人状态切换为攻击状态
            }
        }

        switch (state)
        {
        case EnemyFightState.Idle:
            break;

        case EnemyFightState.Atk:
            OnAtk();
            break;

        case EnemyFightState.Die:
            StartCoroutine(waitDieEnd());
            break;

        default:
            break;
        }
    }
Beispiel #2
0
    protected override void InitStateMachine()
    {
        m_FSM      = new FSMSystem();
        m_FSM.attr = attr;

        idleState  = new EnemyIdleState();
        moveState  = new EnemyMoveState();
        fightState = new EnemyFightState();
        deathState = new EnemyDeathState();



        m_FSM.AddState(idleState, this);
        idleState.AddTransition(Transition.IsMove, StateID.Move);
        idleState.AddTransition(Transition.IsFight, StateID.Fight);


        m_FSM.AddState(moveState, this);
        moveState.AddTransition(Transition.IsIdle, StateID.Idle);
        moveState.AddTransition(Transition.IsFight, StateID.Fight);


        m_FSM.AddState(fightState, this);
        fightState.AddTransition(Transition.IsIdle, StateID.Idle);

        m_FSM.AddState(deathState, this);

        //初始状态为Idle
        m_FSM.SetCurrentState(idleState);
    }
Beispiel #3
0
    IEnumerator waitAtkEnd()
    {
        anima.CrossFade(animName_atk);
        yield return(new WaitForSeconds(anima.GetClip(animName_atk).length));

        if (isAtk == false)
        {
            target.gameObject.SendMessage("OnDamage", attack);
            isAtk = true;
        }
        state     = EnemyFightState.Idle;
        targetPos = startPos;
    }
Beispiel #4
0
 void OnAtk()
 {
     if (target == null)                                                        //如果还没有攻击过,即没有目标
     {
         GameObject[] targets = GameObject.FindGameObjectsWithTag(Tags.Player); //寻找主角
         target    = targets[Random.Range(0, targets.Length)].transform;
         targetPos = target.transform.position;                                 //这里为多个主角的时候,敌人会随机选取主角
     }
     else
     {
         float dis = Vector3.Distance(transform.position, targetPos);   //计算与目标之间的距离
         if (dis > 1.5f)                                                //如果与目标之间的距离大于1.5f
         {
             transform.LookAt(targetPos);                               //朝着目标看去
             transform.Translate(Vector3.forward * 5 * Time.deltaTime); //朝着目标跑去
             anima.CrossFade(animName_run);                             //播放奔跑动画
         }
         else
         {
             if (targetPos == startPos)                         //如果目标位置为开始的位置
             {
                 anima.CrossFade(animName_idle);                //播放空闲动画
                 transform.localEulerAngles = startRot;         //将角度设置为初始角度
                 transform.localPosition    = startPos;         //将位置设置为初始位置
                 FightManager.main.FinishRound();               //结束一个回合
                 actionBar.GetComponent <UISlider>().value = 0; ////把行动条归零,重新开始一个回合
                 state = EnemyFightState.Idle;                  //将敌人的状态切换为空闲状态
                 isAtk = false;                                 //结束一个回合之后把攻击设置为为攻击,为下一个回合做准备
             }
             else
             {
                 StartCoroutine(waitAtkEnd());//开始攻击
             }
         }
     }
 }