调整 EnemyManagerComponent 部分逻辑到异步操作

This commit is contained in:
SepComet 2026-06-06 14:57:08 +08:00
parent 41ff2c6df8
commit 4790bd0091
2 changed files with 34 additions and 36 deletions

View File

@ -50,7 +50,7 @@ namespace SepCore.Procedure
}
_levelTimeLeft = drLevel.Duration;
_enemyManager.OnInit(drLevel);
_enemyManager.OnInit(drLevel, Player);
if (Player != null) Player.Enable = true;
}

View File

@ -1,8 +1,10 @@
using System.Collections.Generic;
using Cysharp.Threading.Tasks;
using SepCore.DataTable;
using SepCore.Definition;
using SepCore.Entity;
using GameFramework.Event;
using SepCore.AsyncTask;
using SepCore.CustomUtility;
using UnityEngine;
using UnityGameFramework.Runtime;
@ -59,25 +61,22 @@ namespace SepCore.EnemyManager
_enemies = new List<EntityBase>();
_enemyById = new Dictionary<int, EntityBase>();
GameEntry.Event.Subscribe(ShowEntitySuccessEventArgs.EventId, OnShowEntitySuccess);
GameEntry.Event.Subscribe(HideEntityCompleteEventArgs.EventId, OnHideEntityComplete);
}
private void OnDestroy()
{
if (GameEntry.Event != null)
{
GameEntry.Event.Unsubscribe(ShowEntitySuccessEventArgs.EventId, OnShowEntitySuccess);
GameEntry.Event.Unsubscribe(HideEntityCompleteEventArgs.EventId, OnHideEntityComplete);
}
GameEntry.Event.Unsubscribe(HideEntityCompleteEventArgs.EventId, OnHideEntityComplete);
_enemies = null;
_enemyById = null;
_entity = null;
}
public void OnInit(DRLevel level)
public void OnInit(DRLevel level, Player player)
{
_player = player != null ? player.CachedTransform : null;
_baseSpawnEnemyIntervals = (float[])level.Intervals.Clone();
_spawnEnemyIntervals = (float[])_baseSpawnEnemyIntervals.Clone();
_spawnEnemyTypes = level.EntityTypes;
@ -101,7 +100,7 @@ namespace SepCore.EnemyManager
if (_spawnEnemyTimer < nextSpawnTime) continue;
for (int j = 0; j < _spawnEnemyCounts[i]; j++)
{
SpawnEnemy(_spawnEnemyTypes[i]);
SpawnEnemyAsync(_spawnEnemyTypes[i]).Forget();
}
_nextSpawnTimes[i] += _spawnEnemyIntervals[i];
@ -130,7 +129,7 @@ namespace SepCore.EnemyManager
#endregion
private void SpawnEnemy(EnemyType enemyType)
private async UniTaskVoid SpawnEnemyAsync(EnemyType enemyType)
{
if (_player == null) return;
@ -138,8 +137,15 @@ namespace SepCore.EnemyManager
int entityPoolId = _currentSpawnEnemyId % _spawnEnemyMaxCount;
var enemyData = EntityDataFactory.Create(entityPoolId, enemyType, _currentLevel);
enemyData.Position = GetRandomPosition();
_entity.ShowEnemy(enemyData);
_currentSpawnEnemyId++;
EnemyBase enemy = await _entity.ShowEnemyAsync(enemyData);
if (enemy == null)
{
return;
}
RegisterEnemy(enemy);
}
private Vector3 GetRandomPosition()
@ -227,41 +233,33 @@ namespace SepCore.EnemyManager
#region Event Handler
private void OnShowEntitySuccess(object sender, GameEventArgs e)
private void RegisterEnemy(EnemyBase enemy)
{
if (!(e is ShowEntitySuccessEventArgs ne)) return;
string entityGroupName = ne.Entity?.EntityGroup?.Name;
if (entityGroupName == EnemyGroupName && ne.Entity.Logic is EnemyBase enemy)
if (enemy == null)
{
_currentEnemyCount++;
enemy.SetTarget(_player);
RemoveEnemyFromCache(enemy.Id);
_enemies.Add(enemy);
_enemyById[enemy.Id] = enemy;
return;
}
if (ne.EntityLogicType == typeof(Player))
{
_player = ne.Entity.transform;
}
_currentEnemyCount++;
enemy.SetTarget(_player);
RemoveEnemyFromCache(enemy.Id);
_enemies.Add(enemy);
_enemyById[enemy.Id] = enemy;
}
private void OnHideEntityComplete(object sender, GameEventArgs e)
{
if (e is HideEntityCompleteEventArgs ne)
{
string entityGroupName = ne.EntityGroup.Name;
if (entityGroupName == EnemyGroupName)
{
if (_currentEnemyCount > 0)
{
_currentEnemyCount--;
}
if (e is not HideEntityCompleteEventArgs ne) return;
RemoveEnemyFromCache(ne.EntityId);
string entityGroupName = ne.EntityGroup.Name;
if (entityGroupName == EnemyGroupName)
{
if (_currentEnemyCount > 0)
{
_currentEnemyCount--;
}
RemoveEnemyFromCache(ne.EntityId);
}
}