public override void Update() { if (!m_Brain.IsAppropriateFoe(m_Foe)) { // time for a new foe! m_Foe = ChooseFoe(); // whatever we used to be doing, stop that. New plan is coming! m_ActionPlayer.ClearActions(true); } // if we're out of foes, stop! IsEligible() will now return false so we'll soon switch to a new state if (!m_Foe) { return; } // see if we're already chasing or attacking our active foe! if (m_ActionPlayer.GetActiveActionInfo(out var info)) { if (info.ActionTypeEnum == ActionType.GeneralChase) { if (info.TargetIds != null && info.TargetIds[0] == m_Foe.NetworkObjectId) { // yep we're chasing our foe; all set! (The attack is enqueued after it) return; } } else if (info.ActionTypeEnum == m_CurAttackAction) { if (info.TargetIds != null && info.TargetIds[0] == m_Foe.NetworkObjectId) { // yep we're attacking our foe; all set! return; } } else if (info.ActionTypeEnum == ActionType.Stun) { // we can't do anything right now. We're stunned! return; } } // Choose whether we can attack our foe directly, or if we need to get closer first var attackInfo = GetCurrentAttackInfo(); var attackData = new ActionRequestData { ActionTypeEnum = attackInfo.ActionTypeEnum, TargetIds = new ulong[] { m_Foe.NetworkObjectId }, ShouldClose = true }; m_ActionPlayer.PlayAction(ref attackData); }
/// <summary> /// Clear all active Actions. /// </summary> public void ClearActions(bool alsoClearNonBlockingActions) { m_ActionPlayer.ClearActions(alsoClearNonBlockingActions); }