using System; using System.Collections.Generic; using System.Linq; using Cielonos.MainGame.Characters; using Sirenix.OdinInspector; using SLSFramework.General; using UnityEngine; namespace Cielonos.MainGame { public partial class BattleManager : Singleton { private static Player Player => MainGameManager.Player; [ShowInInspector] private EnemySubmodule enemySm; protected override void Awake() { base.Awake(); enemySm ??= new EnemySubmodule(this); } } public partial class BattleManager { public static EnemySubmodule EnemySm => Instance.enemySm; } public partial class BattleManager { public class EnemySubmodule : SubmoduleBase { public enum SortingType { Nearest, Farthest } public List activeEnemiesList; public EnemySubmodule(BattleManager owner) : base(owner) { activeEnemiesList = new List(); } public CharacterBase GetNearestEnemy(float maximumDistance = float.MaxValue, Transform origin = null) { if (origin == null) { origin = Player.transform; } List nearestEnemies = GetEnemiesInRadius(origin.position, maximumDistance); CharacterBase nearestEnemy = nearestEnemies.Count > 0 ? nearestEnemies[0] : null; return nearestEnemy; } public List GetNearestEnemies(float maximumDistance = float.MaxValue, int enemyCount = 1, Transform origin = null) { if (origin == null) { origin = Player.transform; } List nearestEnemies = GetEnemiesInRadius(origin.position, maximumDistance).Take(enemyCount).ToList(); return nearestEnemies; } public List GetEnemiesInRadius(Vector3 origin, float radius, SortingType sortingType = SortingType.Nearest) { List enemiesInRadius = new List(); foreach (CharacterBase enemy in activeEnemiesList) { float enemyRadius = enemy.collisionSc.useCharacterController ? enemy.collisionSc.characterController.radius : enemy.collisionSc.mainColliderRadius; float distance = Vector3.Distance(origin, enemy.transform.position) - enemyRadius; if (distance <= radius) { enemiesInRadius.Add(enemy); } } if (sortingType == SortingType.Nearest) { enemiesInRadius = enemiesInRadius.OrderBy(x => Vector3.Distance(origin, x.transform.position)).ToList(); } else if (sortingType == SortingType.Farthest) { enemiesInRadius = enemiesInRadius.OrderByDescending(x => Vector3.Distance(origin, x.transform.position)).ToList(); } return enemiesInRadius; } } } }