From 4790bd0091f88c710fb28b08dd36fa8cbe8dfd09 Mon Sep 17 00:00:00 2001 From: SepComet <202308010230@stu.csust.edu.cn> Date: Sat, 6 Jun 2026 14:57:08 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=20EnemyManagerComponent=20?= =?UTF-8?q?=E9=83=A8=E5=88=86=E9=80=BB=E8=BE=91=E5=88=B0=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Scripts/Procedure/Game/GameStateBattle.cs | 2 +- .../EnemyManager/EnemyManagerComponent.cs | 68 +++++++++---------- 2 files changed, 34 insertions(+), 36 deletions(-) diff --git a/Assets/GameMain/Scripts/Procedure/Game/GameStateBattle.cs b/Assets/GameMain/Scripts/Procedure/Game/GameStateBattle.cs index fe674fe..89c77de 100644 --- a/Assets/GameMain/Scripts/Procedure/Game/GameStateBattle.cs +++ b/Assets/GameMain/Scripts/Procedure/Game/GameStateBattle.cs @@ -50,7 +50,7 @@ namespace SepCore.Procedure } _levelTimeLeft = drLevel.Duration; - _enemyManager.OnInit(drLevel); + _enemyManager.OnInit(drLevel, Player); if (Player != null) Player.Enable = true; } diff --git a/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyManagerComponent.cs b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyManagerComponent.cs index 602951d..1ccb19e 100644 --- a/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyManagerComponent.cs +++ b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyManagerComponent.cs @@ -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(); _enemyById = new Dictionary(); - 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); } }