From 921193f469d974ca89524dc7f72b6887a1a43949 Mon Sep 17 00:00:00 2001 From: basil <2428390463@qq.com> Date: Thu, 18 Jun 2026 15:33:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=8E=20EnemyManager=20=E9=87=8C=E6=8B=86?= =?UTF-8?q?=E5=88=86=E5=87=BA=E6=95=8C=E4=BA=BA=E7=9A=84=E6=B3=A8=E5=86=8C?= =?UTF-8?q?/=E7=AE=A1=E7=90=86/=E6=9F=A5=E8=AF=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EnemyManager/EnemyManagerComponent.cs | 88 +++---------------- .../EnemyManager/EnemyRegistry.cs | 85 ++++++++++++++++++ .../EnemyManager/EnemyRegistry.cs.meta | 11 +++ 3 files changed, 109 insertions(+), 75 deletions(-) create mode 100644 Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyRegistry.cs create mode 100644 Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyRegistry.cs.meta diff --git a/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyManagerComponent.cs b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyManagerComponent.cs index 5857036..dfcf504 100644 --- a/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyManagerComponent.cs +++ b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyManagerComponent.cs @@ -17,18 +17,14 @@ namespace SepCore.EnemyManager private const string EnemyGroupName = "Enemy"; private EntityComponent _entity; + private EnemyRegistry _enemyRegistry; - private List _enemies; - private Dictionary _enemyById; - - public List Enemies => _enemies; + public List Enemies => _enemyRegistry?.Enemies; private float _spawnEnemyTimer; [SerializeField] private int _spawnEnemyMaxCount = 5000; - private int _currentEnemyCount; - [SerializeField] private int _spawnDistanceFromPlayer = 20; private int _currentSpawnEnemyId; @@ -51,15 +47,14 @@ namespace SepCore.EnemyManager public float SpawnRateScale => _spawnRateScale; public float BattleDuration => _duration; public float ElapsedBattleTime => _spawnEnemyTimer; - public int CurrentEnemyCount => _currentEnemyCount; + public int CurrentEnemyCount => _enemyRegistry?.Count ?? 0; #region FSM private void Start() { _entity = GameEntry.Entity; - _enemies = new List(); - _enemyById = new Dictionary(); + _enemyRegistry = new EnemyRegistry(); GameEntry.Event.Subscribe(HideEntityCompleteEventArgs.EventId, OnHideEntityComplete); } @@ -68,8 +63,7 @@ namespace SepCore.EnemyManager { GameEntry.Event.Unsubscribe(HideEntityCompleteEventArgs.EventId, OnHideEntityComplete); - _enemies = null; - _enemyById = null; + _enemyRegistry = null; _entity = null; } @@ -87,7 +81,7 @@ namespace SepCore.EnemyManager SetSpawnRateScale(_spawnRateScale); - _currentEnemyCount = 0; + _enemyRegistry.Clear(); _currentSpawnEnemyId = 0; } @@ -124,8 +118,6 @@ namespace SepCore.EnemyManager _nextSpawnTimes = null; ClearEnemies(); - - _currentEnemyCount = 0; } #endregion @@ -134,7 +126,7 @@ namespace SepCore.EnemyManager { if (_player == null) return; - if (_currentEnemyCount >= _spawnEnemyMaxCount) return; + if (_enemyRegistry.Count >= _spawnEnemyMaxCount) return; int entityPoolId = _currentSpawnEnemyId % _spawnEnemyMaxCount; var enemyData = EntityDataFactory.Create(entityPoolId, enemyType, _currentLevel); enemyData.Position = _spawnPositionStrategy.GetSpawnPosition(_player); @@ -146,37 +138,24 @@ namespace SepCore.EnemyManager return; } - RegisterEnemy(enemy); + enemy.SetTarget(_player); + _enemyRegistry.Register(enemy); } public void ClearEnemies() { - foreach (var enemy in _enemies) + foreach (var enemy in _enemyRegistry.Enemies) { if (enemy == null || !enemy.Available) continue; _entity.HideEntity(enemy); } - _enemies.Clear(); - _enemyById?.Clear(); + _enemyRegistry.Clear(); } public bool TryGetEnemy(int entityId, out EntityBase enemy) { - enemy = null; - if (_enemyById == null || !_enemyById.TryGetValue(entityId, out EntityBase cachedEnemy)) - { - return false; - } - - if (cachedEnemy == null || !cachedEnemy.Available) - { - _enemyById.Remove(entityId); - return false; - } - - enemy = cachedEnemy; - return true; + return _enemyRegistry.TryGet(entityId, out enemy); } public void SetSpawnRateScale(float scale) @@ -226,20 +205,6 @@ namespace SepCore.EnemyManager #region Event Handler - private void RegisterEnemy(EnemyBase enemy) - { - if (enemy == null) - { - return; - } - - _currentEnemyCount++; - enemy.SetTarget(_player); - RemoveEnemyFromCache(enemy.Id); - _enemies.Add(enemy); - _enemyById[enemy.Id] = enemy; - } - private void OnHideEntityComplete(object sender, GameEventArgs e) { if (e is not HideEntityCompleteEventArgs ne) return; @@ -247,34 +212,7 @@ namespace SepCore.EnemyManager string entityGroupName = ne.EntityGroup.Name; if (entityGroupName == EnemyGroupName) { - if (_currentEnemyCount > 0) - { - _currentEnemyCount--; - } - - RemoveEnemyFromCache(ne.EntityId); - } - } - - private void RemoveEnemyFromCache(int entityId) - { - if (_enemyById != null) - { - _enemyById.Remove(entityId); - } - - for (int i = _enemies.Count - 1; i >= 0; i--) - { - EntityBase cachedEnemy = _enemies[i]; - if (cachedEnemy == null || cachedEnemy.Id == entityId) - { - if (cachedEnemy != null && _enemyById != null) - { - _enemyById.Remove(cachedEnemy.Id); - } - - _enemies.RemoveAt(i); - } + _enemyRegistry.Remove(ne.EntityId); } } diff --git a/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyRegistry.cs b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyRegistry.cs new file mode 100644 index 0000000..93474f6 --- /dev/null +++ b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyRegistry.cs @@ -0,0 +1,85 @@ +using System.Collections.Generic; +using SepCore.Entity; +using UnityEngine; + +namespace SepCore.EnemyManager +{ + public class EnemyRegistry + { + private readonly List _enemies; + private readonly Dictionary _enemyById; + + public int Count { get; private set; } + public List Enemies => _enemies; + + public EnemyRegistry() + { + _enemies = new List(); + _enemyById = new Dictionary(); + } + + public void Register(EnemyBase enemy) + { + if (enemy == null) return; + + Count++; + RemoveFromCache(enemy.Id); + _enemies.Add(enemy); + _enemyById[enemy.Id] = enemy; + } + + public void Remove(int entityId) + { + if (Count > 0) + { + Count--; + } + + RemoveFromCache(entityId); + } + + public bool TryGet(int entityId, out EntityBase enemy) + { + enemy = null; + if (!_enemyById.TryGetValue(entityId, out EntityBase cachedEnemy)) + { + return false; + } + + if (cachedEnemy == null || !cachedEnemy.Available) + { + _enemyById.Remove(entityId); + return false; + } + + enemy = cachedEnemy; + return true; + } + + public void Clear() + { + _enemies.Clear(); + _enemyById.Clear(); + Count = 0; + } + + private void RemoveFromCache(int entityId) + { + _enemyById.Remove(entityId); + + for (int i = _enemies.Count - 1; i >= 0; i--) + { + EntityBase cachedEnemy = _enemies[i]; + if (cachedEnemy == null || cachedEnemy.Id == entityId) + { + if (cachedEnemy != null) + { + _enemyById.Remove(cachedEnemy.Id); + } + + _enemies.RemoveAt(i); + } + } + } + } +} diff --git a/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyRegistry.cs.meta b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyRegistry.cs.meta new file mode 100644 index 0000000..60e20b5 --- /dev/null +++ b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyRegistry.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7a24dd17510328f4392432d9da7ab6a5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: