예제 #1
0
        /// <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;
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        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;
            }
        }
예제 #4
0
        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);
            }
        }
예제 #5
0
        //检测记忆是否过期
        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;
            }
        }
예제 #6
0
 protected void RefreshStimulus(CAIStimulus StimulusStore, CAIStimulus NewStimulus)
 {
 }
예제 #7
0
 public void RegisterStimulus(CAIStimulus stimulus)
 {
     m_stimulusList.Add(stimulus);
 }