예제 #1
0
        private void LateUpdate()
        {
            foreach (var target in _targets.Values)
            {
                target.Assignees.Clear();
            }

            _aggressive.Clear();

            foreach (var ai in _potentialAggressive)
            {
                var enemy = ai.Situation.Threat;

                if (enemy != null)
                {
                    if (!_targets.ContainsKey(enemy))
                    {
                        _targets[enemy] = new AIGroupTarget(enemy);
                    }

                    _targets[enemy].CheckIn(ai, MaxAggressive);
                }
            }

            foreach (var target in _targets.Values)
            {
                if (target.Assignees.Count == 0)
                {
                    _targetsToRemove.Add(target.Target);
                }
                else
                {
                    foreach (var assignee in target.Assignees)
                    {
                        _aggressive.Add(assignee.AI);
                    }
                }
            }

            foreach (var target in _targetsToRemove)
            {
                _targets.Remove(target);
            }

            _targetsToRemove.Clear();
            _potentialAggressive.Clear();
        }
예제 #2
0
        private void LateUpdate()
        {
            foreach (var target in _targets.Values)
            {
                target.Forced.Clear();
                target.Unforced.Clear();
            }

            foreach (var ai in _aggressive)
            {
                if (_aggressiveDuration.ContainsKey(ai))
                {
                    var value = _aggressiveDuration[ai];

                    if (value >= Sustain)
                    {
                        _aggressiveDuration.Remove(ai);
                    }
                    else
                    {
                        _aggressiveDuration[ai] = value + Time.deltaTime;
                    }
                }
                else
                {
                    _aggressiveDuration[ai] = 0;
                }
            }

            _aggressive.Clear();

            foreach (var ai in _potentialAggressive)
            {
                var enemy = ai.Situation.Threat;

                if (enemy != null)
                {
                    if (!_targets.ContainsKey(enemy))
                    {
                        _targets[enemy] = new AIGroupTarget(enemy);
                    }

                    _targets[enemy].CheckIn(ai, MaxAggressive, _aggressiveDuration.ContainsKey(ai));
                }
            }

            foreach (var target in _targets.Values)
            {
                if (target.Forced.Count == 0 && target.Unforced.Count == 0)
                {
                    _targetsToRemove.Add(target.Target);
                }
                else
                {
                    foreach (var assignee in target.Forced)
                    {
                        _aggressive.Add(assignee.AI);
                    }

                    var left = MaxAggressive - target.Forced.Count;

                    if (left > target.Unforced.Count)
                    {
                        left = target.Unforced.Count;
                    }

                    for (int i = 0; i < left; i++)
                    {
                        _aggressive.Add(target.Unforced[i].AI);
                    }
                }
            }

            foreach (var target in _targetsToRemove)
            {
                _targets.Remove(target);
            }

            _targetsToRemove.Clear();
            _potentialAggressive.Clear();
        }