protected override void Execute(List <GameEntity> entities)
    {
        var entity  = entities.SingleEntity();
        var badGuys = CharacterUtils.FindBadGuys(_allCharacters.AsEnumerable());

        foreach (var e in badGuys)
        {
            var targetIndicator = e.view.gameObject.GetComponentInChildren <TargetIndicator>(true);
            targetIndicator.SetActive(entity.isUserInput && e.isCurrentTarget);
        }
    }
    protected override void Execute(List <GameEntity> entities)
    {
        entities.ForEach(e => e.isTargetSwitch = false);
        var badGuys = CharacterUtils.FindBadGuys(_allCharacters.AsEnumerable());

        var curTargetIdx = badGuys.FindIndex(entity => entity.isCurrentTarget);

        badGuys.ForEach(entity => entity.isCurrentTarget = false);

        for (int i = 1; i < badGuys.Count; i++)
        {
            var nextEnemy = badGuys[(curTargetIdx + i) % badGuys.Count];
            if (CharacterUtils.IsNotDead(nextEnemy))
            {
                nextEnemy.isCurrentTarget = true;
                return;
            }
        }
    }
    private GameEntity GetTarget(GameEntity entity)
    {
        GameEntity result;

        switch (entity.character.type)
        {
        case CharacterType.GoodGuy:
            var badGuys = CharacterUtils.FindBadGuys(_allCharacters.AsEnumerable());
            result = badGuys.FirstOrDefault(e => e.isCurrentTarget);
            break;

        case CharacterType.BadGuy:
            var goodGuys = CharacterUtils.FindGoodGuys(_allCharacters.AsEnumerable());
            result = CharacterUtils.FirstAliveCharacter(goodGuys);
            break;

        default:
            throw new ArgumentOutOfRangeException();
        }

        return(result);
    }