该脚本定义了一个带有对象池支持、可命中怪物或物品的子弹基类,子类可重写移动逻辑、特效或销毁行为。主要服务于塔防游戏中标准直线追踪型子弹。
声明
目标物体的Transform( [HideInInspector])子弹当前锁定的目标物体的 Transform
子弹移动速度。
子弹攻击力。
所属塔的ID。(用于资源路径拼接)
塔的等级。(用于加载对应等级的子弹模型和特效)
方法
protected virtual void Update()
游戏结束检查:
GameController.Instance.gameover,若游戏结束则调用DestoryBullect(),销毁子弹。
游戏暂停检查:
GameController.Instance.isPause,若暂停则return,子弹停止移动。
目标有效性检查:
检查目标是否为空或未激活(!targetTrans.gameObject.activeSelf),若无效则销毁。
子弹移动与转向:
根据目标标签(是"Item")计算移动位置:使用Vector3.Lerp,使子弹向目标移动并朝向目标。
Vector3.Lerp(start, target, speed * Time.deltaTime / distance)调用
transform.LookAt使子弹朝向目标强制修正朝向:
如果子弹的欧拉角y==0,则设置y 为 90(2D视角调整)。
核心方法
protected virtual void DestoryBullect()
销毁子弹的方法
清空 targetTrans 引用。
调用
GameController.Instance.PushGameObjectToFactory()将子弹放回对象池。路径格式:
"Tower/ID{塔id}/Bullect/{塔等级}"
protected virtual void CreateEffect()
创建击中特效的方法
从对象池获取击中特效:
GameController.Instance.GetGameObjectResource("Tower/ID{塔id}/Effect/{等级}")将特效位置设置为子弹当前位置(特效自动播放,无需额外代码)。
protected virtual void OnTriggerEnter2D(Collider2D collision)
2D触发检测的方法
触发条件:子弹进入 2D 触发器。
逻辑流程:
判断碰撞体标签是否为
"Monster"或"Item",且自身激活。如果目标位置无效,或(碰撞体的标签是
"Item"且GameController.Instance.targetTrans等于null)→ 提前返回。如果碰撞体是怪物,或(碰撞体的标签是
"Item"且GameController.Instance.targetTrans等于该碰撞体)→· 向碰撞体发送
"TakeDamage"消息,参数为attackValue
· 调用CreateEffect()生成特效。
· 调用DestoryBullect()销毁子弹。
依赖的外部类
-
GameController:单例,提供全局状态(gameOver,isPause,gameSpeed)以及资源管理方法(GetGameObjectResource,PushGameObjectToFactory)。 -
targetTrans指向的物体必须响应TakeDamage消息(通常为怪物类或可破坏物品类)。
拼写错误:类名 Bulle``c``t、方法 DestoryBullect 应为 Bullet / DestroyBullet。
层次依赖 :资源路径硬编码为 "Tower/ID.../Bullect/...",需确保对象池中对应路径存在。