# 方案:atk_type 12 穿透散射箭 / 13 连发箭 > 状态:已按确认规则落地 > 日期:2026-09-02 > 关联:[方案-战斗技能逻辑层.md](./方案-战斗技能逻辑层.md)、[方案-战斗表现数据驱动.md](./方案-战斗表现数据驱动.md) ## 1. 配表 | atk_type | 名称 | atk_para | |----------|------|----------| | 12 | 穿透散射箭 | 散射箭数量, 邻箭夹角(度), 伤害系数(万分比) | | 13 | 连发箭 | 连发数量, 间隔时间(秒), 伤害系数(万分比) | - 灵宝弓 `12,5,12,10000`:5 箭、夹角 12°、100% 攻击 - 射日弓 `13,3,0.2,10000`:3 发、间隔 0.2s、100% 攻击 被动 result 10 把上述形态写到宿主普攻。 ## 2. 已确认规则 ### 12 散射 - 一支沿施法点→主目标连线;其余按夹角向左右对称增加。 - 只配奇数;若偶数,多出的一支补在世界 +Y 更大的一侧。 - **直线**飞行,无限穿透,每箭每敌只伤一次。 - 飞行距离 = **出手时塔射程 × 2**。 - 开战只锁主目标当瞄准;伤害由体盒 tick,不是 `ctx.hit()`。 - 体盒与表现箭同在 **Cocos 世界**(Y 向上),对怪腰点做 OBB,占地按半格放大;`worldToCell` 仅用于候选查询(先把箭位映回逻辑格)。不可把格子逻辑坐标(Y 向下)拿去跟画面箭比。 ### 13 连发 - 每发只打**首次锁定**的那个目标,不重新索敌。 - 配表发数**打满**:目标中途死亡也继续发射,箭飞向最后瞄准点;落地时目标已死则不结算。 - 伤害在**箭落地**时结算(与 atk_type=4 普攻落地结算相同)。 - **固定 3 条弹道循环**(发次 `i % 3`),与配表连发数无关: - 第 1 路:武器→目标直线 - 第 2 路:左侧向外弯的抛物线(同落点) - 第 3 路:右侧向外弯的抛物线(同落点) - 例:3 连发 = 中、左、右;4 连发则第 4 发再走中间直线 - 落地:目标可伤则结算;**已死不结算,但仍回收表现箭**(`VolleyShot.onLand`)。 - 施法锁:持续到**最后一发射出**且攻击动画结束(取较晚者);`holdCasting` 避免拉弓结束提前收招丢后几发;在飞箭不挡下一击。 ## 3. 实现 | 层 | 位置 | |----|------| | Ability | `SkillAbilityBuilder`:12/13 索敌单体;timeline 仅 PlayPresentation | | 逻辑弹道 | `BowAtkRuntime`(对标直线火龙 OBB) | | 表现 | `SkillVisualChannel.launchScatterPierce` / `launchVolleyShot` | | 播控 | `ScatterPierceAtkPresenter` / `VolleyArrowAtkPresenter`;`Skill.scheduleBowShapeLaunch` | 速度与普通弓箭相同:`1280` px/s。 ## 4. 修订 | 日期 | 说明 | |------|------| | 2026-09-08 | 射日弓间隔改为 0.2s;连发三箭落点同目标、弧线按发次区分 | | 2026-09-08 | 修复连发提前收招只见两发;holdCasting + 弦中点高低/左右弧 | | 2026-09-11 | 连发改为中/左/右三弹道循环:中间直线,左右向外弯抛物线 | | 2026-09-11 | 射日弓飞出投掷物缩放 0.6,其它弓保持 1 |