55 lines
1.9 KiB
C#
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"/> 以从对象池生成抛射物。
|
|
/// Behavior Designer 任务通过调用 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);
|
|
}
|
|
}
|
|
}
|