清理各个 Component 里的判断以及调用规范

This commit is contained in:
2026-09-14 18:35:02 +08:00
parent 5fbeec2476
commit 17ee268416
30 changed files with 769 additions and 1326 deletions
@@ -13,7 +13,7 @@ namespace SepCore.EnemyManager
{
public class EnemyManagerComponent : GameFrameworkComponent
{
private const string EnemyGroupName = "Enemy";
private string EnemyGroupName => GameEntry.Luban.Global.EnemyGroupName;
private EntityComponent _entity;
private EnemyRegistry _enemyRegistry;
@@ -21,8 +21,8 @@ namespace SepCore.EnemyManager
public IReadOnlyCollection<EntityBase> Enemies => _enemyRegistry.Enemies;
[SerializeField] private int _spawnEnemyMaxCount = 5000;
[SerializeField] private int _spawnDistanceFromPlayer = 20;
private int _spawnEnemyMaxCount;
private int _spawnDistanceFromPlayer;
private int _currentSpawnEnemyId;
private int _currentLevel;
@@ -61,12 +61,8 @@ namespace SepCore.EnemyManager
GameEntry.Event.Unsubscribe(HideEntityCompleteEventArgs.EventId, OnHideEntityComplete);
GameEntry.Event.Unsubscribe(ShowEntitySuccessEventArgs.EventId, OnShowEntitySuccess);
_spawnCts?.Dispose();
_spawnCts = null;
_enemyRegistry = null;
_spawnScheduler?.Reset();
_spawnScheduler = null;
_entity = null;
_spawnCts.Dispose();
_spawnScheduler.Reset();
}
public void OnInit(LevelConfig level, Player player)
@@ -78,7 +74,8 @@ namespace SepCore.EnemyManager
}
_isStopped = false;
_spawnEnemyMaxCount = GameEntry.Luban.Global.SpawnEnemyMaxCount;
_spawnDistanceFromPlayer = GameEntry.Luban.Global.SpawnDistanceFromPlayer / 1000;
_player = player.CachedTransform;
_spawnPositionStrategy = new RandomCircleSpawnStrategy(_spawnDistanceFromPlayer);
@@ -138,7 +135,7 @@ namespace SepCore.EnemyManager
var ct = _spawnCts.Token;
var (isCanceled, enemy) =
await _entity.ShowEnemyAsync(enemyData, cancellationToken: ct).SuppressCancellationThrow();
if (isCanceled || ct.IsCancellationRequested || enemy == null || !enemy.Available)
if (isCanceled || ct.IsCancellationRequested)
{
// 取消通常发生在 OnReset 期间,此时实体往往尚未出生,enemy 为 null 无法 hide。
// 真正的兜底在 OnShowEntitySuccess:停战后出生的敌人会被立即 hide。
@@ -150,6 +147,19 @@ namespace SepCore.EnemyManager
return;
}
if (enemy == null)
{
Log.Error("Can not spawn enemy '{0}' with entity id '{1}': entity logic is invalid.", enemyType,
entityId);
return;
}
// 未取消但实体已不可用,说明 OnShowEntitySuccess 已在停战窗口兜底 hide。
if (!enemy.Available)
{
return;
}
// await 恢复时若已停战,说明这是漏网的在途敌人,立即 hide,不注册。
if (_isStopped)
{
@@ -157,11 +167,7 @@ namespace SepCore.EnemyManager
return;
}
if (_player != null)
{
enemy.SetTarget(_player);
}
enemy.SetTarget(_player);
_enemyRegistry.Register(enemy);
}