/// <summary> /// 添加或者更新刺激 /// </summary> /// <param name="stimu"></param> public void AddOrUpdateStimulu(CAIStimulus stimu) { if (m_stimuDict.ContainsKey(stimu.Id)) { //拷贝第一次看见的值以及其他旧对象需要保留下来的值 CAIStimulus src = m_stimuDict[stimu.Id]; stimu.TimeBecameVisible = src.TimeBecameVisible; } m_stimuDict[stimu.Id] = stimu; }
/// <summary> /// 留在记忆中的人, 看见时间太长, 在原地的概率就很小了, 我们就不予考虑了 /// </summary> /// <returns></returns> public List <CAIController> GetListOfRecentlySensedOpponents() { m_recentOpponents.Clear(); foreach (var item in m_stimuDict) { CAIStimulus record = item.Value; if (record.Invalid) { continue; } m_recentOpponents.Add(record.Source); } return(m_recentOpponents); }
public override void Update(List <CAIController> stimusSrcList) { base.Update(stimusSrcList); bool isReady = m_regulator.Update(); if (!isReady) { return; } for (int i = 0; i < stimusSrcList.Count; ++i) { CAIController enemy = stimusSrcList[i]; if (enemy.Pawn.DeadOrDyingOrInvalid) { continue; } bool isEnemy = Owner.Pawn.IsEnemyTeam(enemy.Pawn); if (!isEnemy) { continue; } bool canSee = Owner.LineOfSightTo(enemy, Vector3.zero); if (!canSee) { continue; } //如果能够看见 CAIStimulus stimu = new CAIStimulus(); stimu.Sense = this; stimu.Source = Owner; stimu.Expired = false; stimu.Source = enemy; stimu.TimeBecameVisible = Time.realtimeSinceStartup; stimu.TimeLastSensed = Time.realtimeSinceStartup; stimu.StimulusLocation = enemy.LocalPosition; stimu.ReceiverLocation = Owner.LocalPosition; AddOrUpdateStimulu(stimu); return; } }
protected virtual void CleanInvalidSources() { if (m_stimuDict.Count <= 20) { return; } m_stimusToDie.Clear(); foreach (var pair in m_stimuDict) { CAIStimulus item = pair.Value; if (item.Expired) { m_stimusToDie.Add(item.Id); } } foreach (var item in m_stimusToDie) { m_stimuDict.Remove(item); } }
//检测记忆是否过期 protected void CheckExpirationOrInvalid() { foreach (var pair in m_stimuDict) { CAIStimulus item = pair.Value; if (item.Source == null || item.Source.Pawn.DeadOrDying) { item.Expired = true; m_stimuDict[item.Id] = item; continue; } float currTime = Time.realtimeSinceStartup; float deltaTime = currTime - item.TimeLastSensed; if (deltaTime <= m_defaultExpirationAge) { continue; } item.Expired = true; m_stimuDict[item.Id] = item; } }
protected void RefreshStimulus(CAIStimulus StimulusStore, CAIStimulus NewStimulus) { }
public void RegisterStimulus(CAIStimulus stimulus) { m_stimulusList.Add(stimulus); }