From b6a13b18fcd138244eaa6957bfe2e98416823fe3 Mon Sep 17 00:00:00 2001 From: basil <2428390463@qq.com> Date: Thu, 18 Jun 2026 15:25:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=8E=20EnemyManager=20=E4=B8=AD=E6=8B=86?= =?UTF-8?q?=E5=88=86=E5=88=B7=E6=80=AA=E4=BD=8D=E7=BD=AE=E7=AD=96=E7=95=A5?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EnemyManager/EnemyManagerComponent.cs | 13 +++-------- .../EnemyManager/SpawnStrategy.meta | 8 +++++++ .../SpawnStrategy/ISpawnPositionStrategy.cs | 9 ++++++++ .../ISpawnPositionStrategy.cs.meta | 11 +++++++++ .../RandomCircleSpawnStrategy.cs | 23 +++++++++++++++++++ .../RandomCircleSpawnStrategy.cs.meta | 11 +++++++++ 6 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/SpawnStrategy.meta create mode 100644 Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/SpawnStrategy/ISpawnPositionStrategy.cs create mode 100644 Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/SpawnStrategy/ISpawnPositionStrategy.cs.meta create mode 100644 Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/SpawnStrategy/RandomCircleSpawnStrategy.cs create mode 100644 Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/SpawnStrategy/RandomCircleSpawnStrategy.cs.meta diff --git a/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyManagerComponent.cs b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyManagerComponent.cs index 1ccb19e..5857036 100644 --- a/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyManagerComponent.cs +++ b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/EnemyManagerComponent.cs @@ -8,7 +8,6 @@ using SepCore.AsyncTask; using SepCore.CustomUtility; using UnityEngine; using UnityGameFramework.Runtime; -using Random = UnityEngine.Random; namespace SepCore.EnemyManager { @@ -47,6 +46,7 @@ namespace SepCore.EnemyManager private float _spawnRateScale = 1f; private Transform _player; + private ISpawnPositionStrategy _spawnPositionStrategy; public float SpawnRateScale => _spawnRateScale; public float BattleDuration => _duration; @@ -76,6 +76,7 @@ namespace SepCore.EnemyManager public void OnInit(DRLevel level, Player player) { _player = player != null ? player.CachedTransform : null; + _spawnPositionStrategy = new RandomCircleSpawnStrategy(_spawnDistanceFromPlayer); _baseSpawnEnemyIntervals = (float[])level.Intervals.Clone(); _spawnEnemyIntervals = (float[])_baseSpawnEnemyIntervals.Clone(); @@ -136,7 +137,7 @@ namespace SepCore.EnemyManager if (_currentEnemyCount >= _spawnEnemyMaxCount) return; int entityPoolId = _currentSpawnEnemyId % _spawnEnemyMaxCount; var enemyData = EntityDataFactory.Create(entityPoolId, enemyType, _currentLevel); - enemyData.Position = GetRandomPosition(); + enemyData.Position = _spawnPositionStrategy.GetSpawnPosition(_player); _currentSpawnEnemyId++; EnemyBase enemy = await _entity.ShowEnemyAsync(enemyData); @@ -148,14 +149,6 @@ namespace SepCore.EnemyManager RegisterEnemy(enemy); } - private Vector3 GetRandomPosition() - { - float x = Random.Range(-1f, 1f); - float z = Random.Range(-1f, 1f); - Vector3 dir = new Vector3(x, 0, z).normalized; - return _player.position + dir * _spawnDistanceFromPlayer; - } - public void ClearEnemies() { foreach (var enemy in _enemies) diff --git a/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/SpawnStrategy.meta b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/SpawnStrategy.meta new file mode 100644 index 0000000..285e109 --- /dev/null +++ b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/SpawnStrategy.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 302bed92b8cc83341aa3762deb8b56be +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/SpawnStrategy/ISpawnPositionStrategy.cs b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/SpawnStrategy/ISpawnPositionStrategy.cs new file mode 100644 index 0000000..194d138 --- /dev/null +++ b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/SpawnStrategy/ISpawnPositionStrategy.cs @@ -0,0 +1,9 @@ +using UnityEngine; + +namespace SepCore.EnemyManager +{ + public interface ISpawnPositionStrategy + { + Vector3 GetSpawnPosition(Transform player); + } +} diff --git a/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/SpawnStrategy/ISpawnPositionStrategy.cs.meta b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/SpawnStrategy/ISpawnPositionStrategy.cs.meta new file mode 100644 index 0000000..93f56f6 --- /dev/null +++ b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/SpawnStrategy/ISpawnPositionStrategy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 71ed05cb0cc806b43a28fc4492963dd2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/SpawnStrategy/RandomCircleSpawnStrategy.cs b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/SpawnStrategy/RandomCircleSpawnStrategy.cs new file mode 100644 index 0000000..12a31fc --- /dev/null +++ b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/SpawnStrategy/RandomCircleSpawnStrategy.cs @@ -0,0 +1,23 @@ +using UnityEngine; +using Random = UnityEngine.Random; + +namespace SepCore.EnemyManager +{ + public class RandomCircleSpawnStrategy : ISpawnPositionStrategy + { + private readonly float _spawnDistance; + + public RandomCircleSpawnStrategy(float spawnDistance) + { + _spawnDistance = spawnDistance; + } + + public Vector3 GetSpawnPosition(Transform player) + { + float x = Random.Range(-1f, 1f); + float z = Random.Range(-1f, 1f); + Vector3 dir = new Vector3(x, 0, z).normalized; + return player.position + dir * _spawnDistance; + } + } +} diff --git a/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/SpawnStrategy/RandomCircleSpawnStrategy.cs.meta b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/SpawnStrategy/RandomCircleSpawnStrategy.cs.meta new file mode 100644 index 0000000..4994da3 --- /dev/null +++ b/Assets/GameMain/Scripts/Runtime/CustomComponent/EnemyManager/SpawnStrategy/RandomCircleSpawnStrategy.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 12331e41ea431384aa2d6a60da5f4c13 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: