StarBullect 是一个极简的子弹脚本,只实现了碰撞伤害,没有移动、对象池、特效等常见机制。它没有继承 Bullect 很可能是设计用途不同(例如作为无需移动的瞬间伤害触发器)或者是未重构的遗留代码。与标准子弹类对比,它缺少了塔防游戏子弹应有的生命周期管理,需要根据实际需求决定是否要整合到 Bullect 体系中。
代码总览
public class StarBullect : MonoBehaviour
{
public int attackValue; //攻击力数值
private void OnTriggerEnter2D(Collider2D collision)
{
if (!collision.gameObject.activeSelf) return;
if (collision.tag == "Monster" || collision.tag == "Item")
{
collision.SendMessage("TakeDamage", attackValue);
}
}
}
核心方法
private void OnTriggerEnter2D()
检查碰撞到的物体是否激活(
activeSelf),未激活则直接返回。如果碰撞体的标签是
"Monster"或"Item",则调用SendMessage("TakeDamage", attackValue)向该物体发送伤害消息。没有调用任何销毁、回收、特效生成的逻辑。
为什么 StarBullect 没有继承 Bullect?
1. 设计用途不同
Bullect体系是为追踪型、飞行子弹设计的,需要移动、转向、锁定目标、对象池管理。
StarBullect可能是一种不需要移动的子弹 ,例如从塔上发射后立即在敌人位置生成一个"星形"范围伤害触发器,不飞行。
或者是塔的"光环"效果,每次攻击时生成一个瞬间伤害的区域。
或者是作为炮塔的投射物,但移动逻辑由其他方式控制(如粒子系统、动画事件),不需要脚本驱动移动。
- 对象池策略差异
StarBullect如果设计为一次性效果(例如爆炸后自动消失),可能直接使用Destroy(gameObject, delay)而不进对象池,因此无需继承Bullect。
差异对比
| 特性 | StarBullect | TshitBullect | WindmillBullect |
|---|---|---|---|
| 继承 | MonoBehaviour |
Bullect |
Bullect |
| 移动逻辑 | 无(需外部控制移动) | 由父类或外部控制 | 自带追踪移动 (Translate) |
| 生命周期管理 | 无(依赖外部销毁) | 有 Start 初始化 |
有 OnEnable 重置 + 计时器超时销毁 |
| 特殊效果 | 无 | 减速 debuff(随等级变化) | 目标锁定 + 朝向修正 + 物品偏移 |
| 碰撞后行为 | 仅造成伤害,不销毁自身 | (父类可能销毁) | 造成伤害 + 特效,但未销毁自身 |
| 目标筛选 | 标签判断 | 标签判断 + debuff 传递 | 标签判断 + 额外判定(物品必须为目标) |
| 依赖全局状态 | 无 | 无 | 依赖 GameController.Instance(暂停/结束/目标引用) |
为什么没有生命周期管理(计时销毁)?
-
星星子弹可能是瞬发命中的(飞行时间极短,或碰撞后立即由外部销毁),不需要自己计时。
-
或者由对象池在飞出边界或命中后回收,无需在脚本内硬编码超时。