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; } }
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); }
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; }
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());//开始攻击 } } } }