本目录收纳并抽象了原项目的子弹相关逻辑(不修改原脚本),包括类型定义、弹道、命中效果、生命周期、拖尾控制器,以及一个统一的子弹控制器与批量创建方法,方便迁移到其他 Cocos Creator 项目中复用。
BulletTypes.ts:统一的类型与配置接口(WeaponConfig、BulletConfig 等)。ConfigLoader.ts:轻量配置加载器(直接注入或从 resources 读取 weapons.json)。effects/BulletCount.ts:子弹生成信息计算(单发、散射、连发),输出位置、方向、延迟。effects/BulletTrajectory.ts:弹道控制(straight、arc、guided)。effects/BulletHitEffect.ts:命中效果整合(伤害、穿透、弹射、爆炸、燃烧)。effects/BulletLifecycle.ts:生命周期控制(存活时间、射程、穿透、弹射、回程)。PortableEventBus.ts:可选的本地事件总线(on/once/off/emit)。BulletTrailController.ts:拖尾效果控制器与预设。BulletEngine.ts:统一子弹控制器 WeaponBulletController 与批量创建 BulletEngine.createBullets。1) 复制目录:将 assets/scripts/BulletControl 整体拷贝到目标项目(保持相对路径结构)。
2) 准备配置:
ConfigLoader.setWeaponsData(loadedJson)。weapons.json 放入 resources/data/weapons.json,再调用 await ConfigLoader.loadWeaponsFromResources('data/weapons')。
3) 运行时创建子弹:使用 BulletEngine.createBullets(initData, bulletPrefabOrNode) 批量生成。示例:
import { Prefab, Vec3 } from 'cc';
import { BulletEngine } from './BulletEngine';
import { ConfigLoader } from './ConfigLoader';
// 预先加载/注入武器配置
ConfigLoader.setWeaponsData(myWeaponsJson);
const bullets = BulletEngine.createBullets({
weaponId: 'sharp_carrot',
firePosition: new Vec3(100, 200, 0),
direction: new Vec3(1, 0, 0),
sourceBlock: someBlockNode
}, myBulletPrefab /* Prefab | Node */);
// 将 bullets 添加到场景或发射节点下
bullets.forEach(n => myShootRoot.addChild(n));
BulletTypes.ts)WeaponConfig:武器整体配置(id、stats、bulletConfig、升级与价格等)。WeaponStats:基础数值(伤害、速度、射程、冷却、暴击等)。BulletConfig:子弹外观与行为(visual、count、trajectory、hitEffects、lifecycle、shouldRotate)。BulletInitData:运行时生成所需(weaponId|weaponConfig、firePosition、direction、sourceBlock)。effects)BulletCount):
single:单发。scatter:散射(角度范围内平均分布)。burst:连发(支持每发延迟)。BulletTrajectory):
straight:直线,按 speed 前进。arc:弧线(采用方向渐近旋转,无重力)。guided:追踪(延迟后按目标方向渐近旋转,rotateSpeed 影响转向快慢)。setTarget(nodeOrPosition) 设置/更新目标。BulletHitEffect):
pierce_damage)、弹射(ricochet_damage)、爆炸、燃烧等。applyOnHit() 返回命中结果,供生命周期消费计数与销毁判断。BulletLifecycle):
notifyHit(result) 消费命中次数;shouldDestroyNow() 判断立即销毁;shouldReturnNow() 判断进入回程。BulletEngine.ts)WeaponBulletController:每颗子弹的统一控制器,负责:
bulletConfig.shouldRotate === false,仅旋转子节点 Pellet。Collider2D 的 BEGIN_CONTACT 并触发命中与销毁判定。BulletEngine.createBullets(initData, prefabOrNode):按 BulletCount 生成信息批量创建子弹(支持延迟激活)。applyOnHit() 返回后由生命周期判断)。sharp_carrot/hot_pepper/okra_missile/mace_club 使用 -90°。PortableEventBus 提供最小替换方案(迁移时可替换为项目自带总线)。assets/data/weapons.jsonassets/data/excel/方块武器配置/方块武器配置表.xlsxassets/data/excel/weapon_config_manager.pyassets/exported_data/,将上述文件复制到该目录,便于独立维护与回溯。weapons.json;Excel 与 Python 管理器用于离线生成/校验配置。count.mode = 'scatter' 与 spreadAngle;代码不需要特殊处理,BulletEngine 将自动分配方向。count.mode = 'burst' 与 burstDelayMs;createBullets 会按延迟激活。guided,在运行时调用 trajectory.setTarget(targetNode) 更新目标。type = 'return_trip';命中或距离耗尽后折返。Collider2D(若要参与碰撞)、WeaponBulletController(将自动添加所需组件)。bulletConfig.shouldRotate 设为 false 并在 Prefab 内使用 Pellet 命名的子节点。Collider2D 所在分组/掩码与敌人/地形匹配,避免误碰撞或不触发。deltaTime 驱动:BulletTrajectory、BulletLifecycle 需要在组件 update() 中被调用(已集成于控制器)。1) 复制 BulletControl 目录到目标项目的 assets/scripts/。
2) 复制 assets/exported_data 中的数据文件(或自行定义位置)。
3) 使用 ConfigLoader 注入或加载 weapons.json。
4) 在你的发射逻辑中,调用 BulletEngine.createBullets(...) 创建并挂载到场景。
如需扩展新的弹道/效果/生命周期模式,参考现有类的接口进行实现,并在 WeaponConfig 中添加相应配置即可。