void Start() { instance = this; SetVisibility(false); currActionState = MonsterActionState.Rest; //SetVisibility(true); }
protected override void ActionStateFSM(MonsterActionState _nextActionState) { switch (_nextActionState) { case MonsterActionState.Idle: case MonsterActionState.Walk: case MonsterActionState.Attack: StartAction(_nextActionState.ToString(), StopActionDelegate); break; } }
/// <summary>action 초기화</summary> protected void InitActionState(MonsterActionState _initActionState) { mCurrentActoin = MonsterActionState.None; mNexttActoin = _initActionState; }
/// <summary>다음 action을 설정하는 기본 Method (virtual)</summary> protected virtual void SetActionState(MonsterActionState _nextActionState) { mNexttActoin = _nextActionState; }
IEnumerator ActionStateLoopFSM() { while (true) { yield return null; if (mCurrentActoin != mNexttActoin) { mCurrentActoin = mNexttActoin; ActionStateFSM(mNexttActoin); } } }
/// <summary>action이 변경될 때 실행되는 부분 (abstract)\n이 Method로 직접 state를 변경하면 안 된다</summary> protected abstract void ActionStateFSM(MonsterActionState _nextActionState);
/// <summary> /// 队伍执行下一个动作 /// </summary> /// <param name="turn">当前回合数</param> /// <param name="enemy">敌人(玩家队伍)</param> /// <returns>本次行动日志</returns> public string DoNextAction(int turn, PlayerTeam enemy) { Unit nextActionUnit = null; double maxValue = 0; double randValue = 0; int count = 0; //根据队伍行动状态选取下一个行动单位并执行动作 if (this.ActionState == MonsterActionState.AllReady) { //随机选取未行动的Boss for (int i = 0; i < Bosses.Length; i++) { if (Bosses[i].ActionState == UnitActionState.Ready) { count++; randValue = RandomBuilder.GetDouble(); if (randValue > maxValue) { nextActionUnit = Bosses[i]; maxValue = randValue; } } } //最后一个Boss行动,修改队伍行动状态 if (count <= 1) { this.ActionState = MonsterActionState.BossDone; } } //无Boss行动 选取精英行动 if (nextActionUnit == null && this.ActionState == MonsterActionState.BossDone) { //随机选取未行动的精英 for (int i = 0; i < Elites.Length; i++) { if (Elites[i].ActionState == UnitActionState.Ready) { count++; randValue = RandomBuilder.GetDouble(); if (randValue > maxValue) { nextActionUnit = Elites[i]; maxValue = randValue; } } } //如果为最后一个精英行动,修改队伍行动状态 if (count <= 1) { this.ActionState = MonsterActionState.ElitesDone; } } //无Boss和精英行动 选取喽啰行动 if (nextActionUnit == null && this.ActionState == MonsterActionState.ElitesDone) { //随机选取未行动的喽啰 for (int i = 0; i < Minions.Length; i++) { if (Minions[i].ActionState == UnitActionState.Ready) { count++; randValue = RandomBuilder.GetDouble(); if (randValue > maxValue) { nextActionUnit = Minions[i]; maxValue = randValue; } } } //如果为最后一个喽啰动,修改队伍行动状态 if (count <= 1) { this.ActionState = MonsterActionState.AllDone; } } //如果无可行动单位,返回空字符串 if (nextActionUnit == null) { return ""; } else { //执行该单位动作 return nextActionUnit.Action(turn, enemy); } }
/// <summary> /// 重置所有单位的行动状态 /// </summary> public void ResetActionState() { if (this.ActionState != MonsterActionState.AllDead) { //重置Boss行动状态 for (int i = 0; i < Bosses.Length; i++) { Bosses[i].ResetActionState(); } //重置精英的行动状态 for (int i = 0; i < Elites.Length; i++) { Elites[i].ResetActionState(); } //重置喽啰的行动状态 for (int i = 0; i < Minions.Length; i++) { Minions[i].ResetActionState(); } //修改队伍行动状态 this.ActionState = MonsterActionState.AllReady; } }
public void PersecutionMode() { currActionState = MonsterActionState.Persecution; }