예제 #1
0
 public Commander(CommandedUnitAI ai)
 {
     this.ai          = ai;
     commandedAIs     = new HashSet <CommandedUnitAI>();
     unitNoticedFacts = new Dictionary <Unit, UnitNoticedFact>();
     AddCommandedAI(ai);
 }
예제 #2
0
 public void RemoveCommandedAI(CommandedUnitAI ai)
 {
     if (!commandedAIs.Contains(ai))
     {
         return;
     }
     commandedAIs.Remove(ai);
     ai.owner.Died -= OnUnitDied;
 }
예제 #3
0
        public void AddCommandedAI(CommandedUnitAI ai)
        {
            if (commandedAIs.Contains(ai))
            {
                return;
            }
            commandedAIs.Add(ai);

            ai.owner.Died += OnUnitDied;
        }
예제 #4
0
 private void OnUnitDied(Unit unit)
 {
     RemoveCommandedAI(unit.ai as CommandedUnitAI);
     if (unit.ai == this.ai)
     {
         if (commandedAIs.Count == 0)
         {
             return;
         }
         this.ai = commandedAIs.First();
     }
 }
예제 #5
0
        public static Commander FindCommanderFor(CommandedUnitAI ai)
        {
            int  layerMask = 1 << ai.owner.gameObject.layer;
            var  position  = ai.owner.position;
            var  units     = Unit.GetInRadius <Unit>(position, commanderSearchRadius, layerMask);
            Unit closest   = units.ClosestTo(position, u => u != ai.owner && u.ai is CommandedUnitAI cmd && cmd.isCommanderSelf);

            if (closest != null)
            {
                return(((CommandedUnitAI)closest.ai).commander);
            }

            return(new Commander(ai));
        }
예제 #6
0
        public void ReportSearchPointIsClear(Vector2 searchPoint, CommandedUnitAI reporter)
        {
            const float distanceTolerance = 2f;

            foreach (var commandedAI in commandedAIs)
            {
                if (commandedAI == reporter)
                {
                    continue;
                }
                if (commandedAI.state is TargetSearchWanderingState wanderingState &&
                    !wanderingState.hasCheckedSearchPoint &&
                    (wanderingState.searchPoint - searchPoint).CompareLength(distanceTolerance) < 0)
                {
                    wanderingState.ReportedThatSearchPointIsClear();
                }
            }
        }