private void TargetQuery(Entity entity,
                                 ref CommanderStatus.Component commander,
                                 ref CommanderTeam.Component team,
                                 ref BaseUnitStatus.Component status,
                                 ref UnitActionData action,
                                 ref SpatialEntityId entityId)
        {
            if (status.State != UnitState.Alive)
            {
                return;
            }

            if (status.Type != UnitType.Commander)
            {
                return;
            }

            if (status.Order == OrderType.Idle)
            {
                return;
            }

            var trans = EntityManager.GetComponentObject <Transform>(entity);
            var pos   = trans.position;

            applyOrder(status, entityId, pos, action.SightRange, ref commander, ref team);
        }
        private void TeamQuery(Entity entity,
                               ref CommanderSight.Component sight,
                               ref CommanderTeam.Component team,
                               ref BaseUnitStatus.Component status,
                               ref SpatialEntityId entityId)
        {
            if (status.State != UnitState.Alive)
            {
                return;
            }

            if (UnitUtils.IsOfficer(status.Type) == false)
            {
                return;
            }

            if (status.Order == OrderType.Idle)
            {
                return;
            }

            if (status.Rank == 0)
            {
                return;
            }

            var trans = EntityManager.GetComponentObject <Transform>(entity);
            var pos   = trans.position;

            team.FollowerInfo.UnderCommanders.Clear();

            var rank   = status.Rank - 1;
            var range  = RangeDictionary.GetBoidsRange(status.Rank);
            var allies = getAllyUnits(status.Side, pos, range, allowDead: false, GetSingleUnitTypes(UnitType.Commander));

            foreach (var unit in allies)
            {
                if (unit.id == entityId.EntityId)
                {
                    continue;
                }

                BaseUnitStatus.Component?sts;
                if (this.TryGetComponent(unit.id, out sts) == false)
                {
                    continue;
                }

                if (sts.Value.Rank != rank)
                {
                    continue;
                }

                team.FollowerInfo.UnderCommanders.Add(unit.id);
            }
        }
        private void CommanderQuery(Entity entity,
                                    ref VirtualArmy.Component army,
                                    ref CommanderTeam.Component team,
                                    ref BaseUnitStatus.Component status)
        {
            if (status.State != UnitState.Alive)
            {
                return;
            }

            var trans = EntityManager.GetComponentObject <Transform>(entity);
            var pos   = trans.position;

            var unit = getNearestPlayer(pos, HexDictionary.HexEdgeLength, selfId: null);

            if (unit == null)
            {
                var followers = team.FollowerInfo.Followers;
                if (army.IsActive && army.SimpleUnits.Count == followers.Count)
                {
                    SyncTroop(army.SimpleUnits, trans);
                }
                else
                {
                    VirtualizeUnits(ref army, trans, team.FollowerInfo.Followers);
                }
            }
            else
            {
                if (army.IsActive)
                {
                    RealizeUnits(ref army, trans);
                }
                else
                {
                    AlarmUnits(ref army, team.FollowerInfo.Followers);
                }
            }
        }