Files
zeling_v2/Assets/_Game/Scripts/Enemies/RangedEnemy.cs
T
joywayerandClaude Opus 5 cf0ac60fad refactor(enemy): 清全库行为树残留,删无人使用的 Boss 技能事件频道
Task 21 Step 2 全库扫描后的收尾:

注释与 Tooltip 里的旧决策层措辞逐处改为只描述功能——
EnemyControlledState / RangedEnemy / FlyingEnemy / SensorSlotNames /
EnemyPoiseComponent / EnemyAnimationConfigSO / EnemyAiBrain。

EnemyQuotaManager 的序列化字段 _maxActiveBehaviorTrees 改名 _maxActiveBrains
(它裁剪的实际是 EnemyAiBrain),带 FormerlySerializedAs。复核确认目前
无任何场景 / 预制体挂载该组件,故无值可丢;属未雨绸缪。

BossSkillEventChannelSO + BossEvents.BossSkillEvent + EVT_BossSkill.asset 删除:
唯一发送方 BossSkillExecutor 已随旧轨删除,复核确认全项目零发送方、零订阅方,
资产 guid 在场景 / 预制体 / Addressables 分组中均无引用。

自检:编译 0 error;EditMode 260/260 通过;
SO 校验 0 error 0 warning;层矩阵 25/25 正确。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 17:14:09 +08:00

55 lines
1.9 KiB
C#

using UnityEngine;
using BaseGames.Combat;
using BaseGames.Core;
using BaseGames.Core.Pool;
namespace BaseGames.Enemies
{
/// <summary>
/// 远程敌人。重写 <see cref="EnemyBase.SpawnProjectile"/> 以从对象池生成抛射物。
/// 能力模块或动画事件通过调用 SpawnProjectile(payload) 触发发射。
/// </summary>
public class RangedEnemy : EnemyBase
{
[SerializeField] private ProjectileConfigSO _projectileConfig;
[SerializeField] private Transform _firePoint;
protected override void Awake()
{
base.Awake();
Debug.Assert(_projectileConfig != null, $"[RangedEnemy] {name}: 未配置 ProjectileConfigSO。", this);
}
/// <summary>
/// 从对象池生成一枚抖射物并朝玩家发射。
/// payload 可留空;若传入多重配置键则由子类解析。
/// </summary>
public override void SpawnProjectile(string payload)
{
var spawnPos = _firePoint != null ? _firePoint.position : transform.position;
var pool = ServiceLocator.GetOrDefault<IObjectPoolService>();
if (pool == null)
{
Debug.LogWarning($"[RangedEnemy] {name}: IObjectPoolService 未就绪,无法生成抛射物。");
return;
}
var go = pool.Spawn(
_projectileConfig.PoolKey,
spawnPos,
Quaternion.identity);
if (go == null) return;
var proj = go.GetComponent<Projectile>();
if (proj == null) return;
Vector2 dir = _playerTransform != null
? ((Vector2)(_playerTransform.position - spawnPos)).normalized
: (Vector2)transform.right;
var damageInfo = DamageInfo.From(_projectileConfig.DamageSource);
proj.Initialize(_projectileConfig, damageInfo, dir, gameObject.layer);
}
}
}