弹丸离开枪口以后,一次射击还没有结束。它可能经过一段飞行才碰到目标,也可能先撞上近处掩体,继续穿过薄板,或者改变方向。带爆炸的弹丸还会产生新的伤害查询与子破片。与此同时,相机已经收到发射反馈,准星仍在更新,目标上的命中提示则要等实际结果。
上一篇《武器射击系统还原(一):沿原版机制重建 TPS 相机、准星与发射流程》解释了观察方向、武器目标和最终发射方向怎样形成。这篇接着看发射之后的过程:弹丸怎样飞行和碰撞,结果怎样进入伤害与界面,以及相机和准星如何持续响应。
原型仍运行在 UE5.7 的 Lyra 独立工程中。上一版已经有 96 个武器参数映射、TPS 相机、目标跟随、散布、弹簧后坐,以及电弧、光束、追踪和喷射等专用路径。本次提升集中在这些模块的连接与覆盖:更多普通映射采用实际弹丸,碰撞结果进入共同反馈,HUD 对齐最终投影,持续喷射保留原更新相位,并加入使用原始资源的独立逐发震屏。
文章目录
下文视频保留首发、持续作用与末尾恢复。它们来自同一当前构建,均为真实 UE 画面,1280×720、30 fps、无声离线采集。连续行为由画面展示,精确算法与计数回到对应记录;成片帧率不作为实时性能数据。
从已有原型继续连接实际射击
旧版已经可以用同一个代理模型比较不同映射的相机配置、目标追随、散布和后坐。它也明确区分普通命中查询、弹道预览和独立实体抛射:开启一条可见抛物线,不会自动把原先的即时命中改成需要飞行时间的弹丸。本篇从这几条路径的实际接入继续展开。
接下来要让各模块读到正确的事件。一次发射先选中配置,按所在路径检查模式、冷却、蓄力、锁定与弹药条件,再进入对应后端。实体路径创建飞行状态,光束路径维持活动照射,追踪路径保存目标与导引历史。它们各自获得结果以后,再通知伤害、受击与 HUD。发射反馈可以先开始,命中反馈则必须有自己的来源。
| 部分 | 前一版已经具备 | 本篇进一步展开 |
|---|---|---|
| 数据 | 武器映射及各模块参数 | 复核基础记录与默认覆盖形成的有效配置,追踪实际消费者 |
| 普通发射 | 方向采样、命中查询、弹道预览和部分实体路径 | 普通物理映射扩展,飞行后按实际线段接触结算 |
| 接触响应 | 飞行数值内核与局部演示 | 穿透、跳弹、爆炸、破片及共同伤害/表现结果 |
| 准星 | 移动瞄点、刻线、几何半径与响应 | 查询相位、最终视图投影、像素域与命中事件的连接 |
| 后坐 | 冲量、弹簧状态及持续恢复 | 喷射的真实帧相位、浮点余量、迟到事件与状态交接 |
| 相机震屏 | 原型既有反馈 | 非零逐发资源的选择、波形、包络、叠加和最终姿态 |
例如,枪口效果播放了,弹丸却没有生成,说明发射链还没有接通。弹丸已经正确命中,HUD 却仍在按下扳机时播放命中动画,同样会传达错误结果。每种反馈都应跟随它所描述的事件,并保留事件发生的时间。
以霰弹为例,一次提交可以派生多颗弹粒;其中几颗打中目标,又可能汇入不同的伤害通知。爆裂铳的一颗主弹还会产生爆炸与破片。持续喷射则可能在多个活动帧更新后坐,隔一段时间才扣弹。若把所有计数都命名为 Shot,后续无论查伤害、UI 还是相机,都很难确认究竟少了哪一步。
数值模块与 UE 场景仍分开处理。积分、后坐、包络和姿态计算放在独立模块中;角色、枪口、场景查询、相机更新与绘制由 UE 提供。接入新的场景功能时,已有计算仍可单独核对。
有效配置怎样进入实际发射
武器选择面板显示的是一个映射,但运行时需要的配置分布在不同记录中。射速不决定准星半径,弹丸类型不包含整套相机机位,独立震屏也不等于弹簧后坐参数。它们通过武器映射建立联系,再由各模块读取自己的部分。
基础表也不一定就是默认运行值。当前数据先对基础记录应用默认键列表中的装备或定制覆盖,形成有效记录,然后发布给发射、散布、后坐、HUD 与震屏消费者。这里的覆盖有各自字段和规则,不能概括为把两张表逐项相加。
本轮材料核对了 96 份完整有效记录、96×10 个后坐 float 位型,以及 85×2 个普通散布宽度位型。前者说明当前默认输入的组成与发布结果相符,后两项分别检查后坐与普通散布的数据。特殊路径没有普通散布记录时,仍使用自己的参数,不人为补成普通枪。动态装备、伤势或任意现场修饰器是否完整参与,属于另一层覆盖范围。
不同武器使用相同 profile 时,本来就可能共用机位;它们仍可能因目标跟进、发射间隔、散布、后坐或震屏而表现不同。为了让每把枪看起来不同而另加机位或演示倍率,反而会掩盖实际配置的作用。
资格、提交与后端活动分别记录
扳机输入先提出请求,随后检查冷却、弹药,以及所在路径的蓄力或锁定条件。枪口闪光本身不足以确认发射成功。路径接受发射后,保存本次映射身份、时间与序号,再通知执行和反馈模块。切枪后即使旧回调才到达,也要使用发射时的映射,避免把旧事件归到新武器。
对于普通实体弹丸,弹药提交与对象生成也不是自动具备退款的完整事务。源码的出生入口仍会检查参数、场景和生成结果;若生成失败,不能从“已进入提交路径”推定空间中已有弹丸。成功案例需要结合对象出生、后续命中和目标变化检查;异常时是否补偿弹药,要另外看实现。
成功发射与成功命中分开以后,相机可以在目标尚未受伤时开始响应。这符合有飞行时间的路径:开火瞬间已有后坐和逐发震屏,命中图标晚一些出现;若弹丸碰到掩体,目标端可能没有伤害。把所有反馈统一推迟到命中,或者全部提前到扳机按下,都会改变这段因果关系。
| 记录 | 由什么产生 | 后续用在哪里 |
|---|---|---|
| 发射请求 | 输入及当前活动模式 | 检查资格、冷却与弹药 |
| 有效发射提交 | 实际路径接受的发射事件 | 当前映射身份、弹丸或特殊后端、发射反馈 |
| 持续活动更新 | 合格的喷射等连续状态 | 该路径的持续反馈与状态推进 |
| 碰撞结果 | 实际飞行或后端查询 | 停止、延续、反射、爆炸及命中处理 |
| 目标受击/死亡 | 对应目标的实际结果 | 受击表现、命中与击杀提示 |
| 相机发布 | 当前状态与反馈的组合 | 最终视图及实际屏幕投影 |
各后端还要避免重复结算。实体或追踪路径接管发射后,普通即时查询就不应再给远处目标提前扣血。为了保留 Lyra 的提交与代理表现而经过某个框架接口,不意味着该接口仍拥有本次远处伤害的权威结果。
弹丸离开枪口后怎样继续存在
先用爆裂铳看这条链怎样工作。观看完整射击时,关注主弹离开枪口后的过程、目标附近的爆炸与后续效果,以及最后一发之后仍保留的反馈恢复。资源编号、半径和破片数由数据与记录说明,不能靠几帧亮点反求。
视频 1|爆裂铳的实际弹丸、爆炸与破片路径,完整 7.20 秒。画面展示该构建的连续执行;破片参数及派生关系由固定资源、冻结实现和对应专项记录说明,不把每个屏幕亮点都算成一颗独立命中。
飞行状态不寄存在一条显示线里
当前普通物理路径在发射时建立独立弹丸对象,保存位置、速度、参数类型、出生时间、累计距离、寿命、爆炸关联及碰撞延续状态。远处伤害不会在出生时预先结算。沿途实际查询产生接触后,才进入命中处理。
“实体弹丸”在这里指有独立状态、生命期和逐段场景查询的对象。它的可见球体关闭自身碰撞,接触由飞行线段查询负责;并不要求每颗子弹都是一个交给 Chaos 自由模拟的刚体。区分这点,才能理解恢复的积分核为什么仍有自己的位置与速度,而 UE 模型只跟随结果。
本次有 79 个映射接入新的普通实体路径,另一个榴弹发射器沿用已有实体抛体并汇入共同命中响应,合计约 80 条采用实体飞行结算的物理路径。它们是配置路径的数量,不是 80 套独立模型,也不代表全部使用同一个实体后端;光束、电弧、追踪和喷射仍保留自己的后端。
位置与速度保留原始更新顺序
飞行内核使用米与秒。速度、重力倍率、质量字段、阻力字段和子步数来自对应弹丸记录。重力采用恢复的 float 常量,约为 9.82;它与项目其他物理对象使用的世界重力设置不是同一个接口。
便于阅读的公式如下。它省略了底层标量运算的括号和常量精度,精确比较仍以源码为准:
a = (0, 0, -g × gravityScale)
speed2 = dot(v, v)
若阻力分支有效:
magnitude = speed2 × drag / mass
a -= normalize(v) × magnitude
dv = a × h
p_next = p + (v + 0.5 × dv) × h
v_next = v + dv
位置用旧速度加半步加速度贡献推进,再更新速度。若先把 v 改成新速度,再用它推进整个位置,同样能画出下降轨迹,但每一步位移、远距离误差和命中时刻会变化。这里要保留的是实际更新顺序,仅凭轨迹外观相近还不足以替换算法。
阻力也不是对所有速度无条件执行。源码先检查正的 drag 与速度平方阈值,再检查计算幅度是否低于保护上限;接近零速时的归一化还有自己的阈值。质量与阻力字段按恢复公式配套使用,本文不额外把未确认的原始字段单位当作已证实的现实物理单位。
原始数值片段的 720 组对照核查位置和速度的六个 float 输出,材料记录结果一致。这个结论覆盖飞行内核。UE 场景碰撞、材质判定、伤害、寿命与世界调度还要分别核对,六个输出一致没有替它们完成验证。
调度步与弹丸内部子步分开
UE 包装层按弹丸年龄补足 120 Hz 的调度步,每个调度步再依据配置的 Steps 分子步。因此单次积分采用 h=(1/120)/Steps,并在每个内部子步后检查实际经过的空间。120 Hz 是当前宿主封装的选择,不能写成原游戏整个弹丸世界的统一频率。
原生坐标与 UE 场景坐标在接口处交换水平轴,并将米转换为厘米。对象状态以原生米制保存,线段端点转换成 UE 位置。若只把出生速度乘一百,却忘了碰撞点、累计距离或武装距离的换算,错误会出现在后续分支,而不一定立刻表现为轨迹方向错误。
累计飞行距离也使用实际走过的部分。无碰撞时累加 A→B;有接触时只累加 A→ImpactPoint。这样武装距离与射程不会把目标后方尚未发生的位移计入。这里累计的是沿轨迹走过的长度,与出生点到当前位置的直线距离不同。
用经过的线段检查接触
每个子步保存旧位置 A 和新位置 B,再沿 A→B 查询场景。只在 B 点做重叠检查,高速小弹丸可能已经越过薄表面;线段至少覆盖这个子步实际经过的直线路段。曲率仍由子步划分近似,不能因此声称任意复杂轨迹都能一次精确求交。
保存 A
推进飞行内核,得到 B
查询 A → B
若命中:
记录实际命中点和已飞距离
把同一结果交给碰撞处理
否则:
接受新位置,检查射程与生命周期
查询忽略发射拥有者及其附着对象,并保存已穿过对象的弱引用。寿命、有效射程、非法数值、命中延迟与可见爆炸脉冲还有各自的结束分支。这里的宿主存在有界生命期保护;无限飞行、任意引信和完整原生回收服务不在当前实现范围。
碰撞处理会终止当前 Tick 的这轮推进,之后根据分支保留状态或销毁。文章的子步示意用于解释积分与查询,不意味着每次碰撞以后还会在同一 Tick 中无缝消费完所有剩余时间。这个封装顺序也属于 UE 接入的一部分。
用 R36 串起一张资源关联图
这次使用的固定 2026 年 8 月 19 日资源中,R36 对应映射 jet_rifle_phoenix。其主弹、爆炸和破片按下表连接:
| 关联层 | 本例数据 | 执行时含义 |
|---|---|---|
| 武器 | 32 RPM | 提供发射节拍输入,并非弹丸每秒更新次数 |
| 主弹 | 类型 40,180 m/s | 创建携带对应飞行参数的对象 |
| 爆炸 | 关联 155,外半径 7 m | 主弹符合条件时进入对应爆炸记录 |
| 子破片 | 30 颗,类型 200 | 根据该记录尝试创建独立的子弹丸 |
一次主弹出生、一次爆炸和三十颗破片的创建分别记录。破片也要飞行与碰撞,不能把三十理解成三十次必定伤害;同样不能用屏幕上可见轨迹的数量代替实际创建记录。
爆炸的可见碎光还有独立的表现对象,它的粒子数量并不等于资源要求的子破片数量。有伤害的破片需要自己的飞行状态和接触结果,可见碎光只负责短时表现。判断破片机制是否执行,应检查类型与创建结果;屏幕上爆炸足够明亮,并不能替代这项核对。
当前破片方向使用 UE 均匀球面采样,主弹的原始资源联系与子弹丸参数得到保留,随机方向流则是声明过的适配。爆炸查询、表面法线、靶场伤害分类也由 UE 提供。半径是该固定数据的输入,不是适用于所有游戏版本的永久平衡参数。
还需要区分直接伤害与爆炸伤害的来源。当前冻结实现优先查询相应伤害记录,缺失时保留明确的原型回退值;这些回退不能写成原版常量。看到目标减血,可以确认这次场景结算发生,精确解释还要检查到底由主弹、范围伤害还是破片提供。
蓄力和飞行属于不同阶段
蓄力等离子提供另一种观察角度:先经过蓄力输入,再形成实际发射,随后才由弹丸飞行与接触产生结果。看下面的完整过程时,分别留意蓄力提示、弹体出现、目标受击以及停止后的恢复。
视频 2|蓄力等离子的默认发射与实体命中,完整约 8.53 秒。画面显示这条路径的阶段衔接,不用于证明任意蓄力时长都已经等价映射到原版伤害、穿透或过载结果。
蓄力进度由发射前的活动状态保存,飞行位置与速度由出生后的弹丸保存。两者可以通过有效发射事件连接,却不应共用一个进度值:蓄力到达某个阶段,不表示弹丸已经经过某段距离;弹丸命中,也不反过来决定之前蓄力是否完成。
这个例子与 R36 的作用不同。R36 展开主弹、爆炸和子破片的资源联系,等离子则补充发射资格怎样接到实体生命周期。它们共用飞行与命中处理中的部分能力,各自的配置和前置活动仍需独立读取。
碰撞结果怎样改变飞行与目标反馈
飞行对象碰到表面以后,首先获得一次实际接触事实。接下来可能停止、穿透续飞、跳弹、满足条件触发爆炸,或进入延迟处理。把碰撞统一写成 Destroy,会丢掉后续状态;把所有分支都顺序执行,又可能对一次接触重复减速或重复触发。
当前原型先使用接触结果进行对应伤害处理,再判断后续生命周期。穿透与跳弹不会无条件同时执行,满足爆炸条件的弹丸也不会再按普通续飞处理。分支的资源输入有原码依据,而 UE 目标护甲、材质标签和查询结果提供了目前的场景上下文。
先说明角度,再讨论掠射
设归一化入射方向为 d,单位表面法线为 n。当前路径的命中角约定为:
angle = 90° - asin(clamp(abs(dot(d, n)), 0, 1)) × 180° / π
正面撞向表面时,绝对点积接近一,angle 接近零;沿表面掠过时,绝对点积接近零,angle 接近九十度。读者若把它理解成另一种与表面或法线的夹角,就可能把阈值方向解释反。变量名字中的 Angle 本身不足以说明几何约定。
归一化也有实际后果。用于角度与反射的是方向,速度大小另存。把长度为几百的速度向量直接当 d,会让点积、反三角与衰减混入速度尺度。即使 clamp 暂时压住非法值,角度分支也已经失去原含义。
穿透保存衰减后的速度与已穿过对象
当前穿透分支根据记录中的减速量计算保留比例:
retained = float(1.0 - double(slowdown))
v_next = v × retained
这里保留 double 减法再转换 float 的顺序。续飞对象保持自己的生命期、距离与新速度,并把位置推到命中点前方一小段,防止马上再次读到同一表面。包装层还会把已穿过 Actor 加入忽略集合。
忽略集合也决定了这套实现的范围。一个 Actor 上可能有多个表面,忽略整个对象会跳过它们,不能代替对材料厚度、入口和出口的完整求解。这里解决的是当前续飞路径的重复命中问题,复杂厚度与护甲仍需另外处理。
目标是否可被穿透,也由当前场景提供的护甲信息或显式可穿透标签参与。资源中的穿透与伤害参数仍有各自消费者;UE 靶场分类不是原游戏完整材质服务的替代证明。当前速度降低到包装层保护阈值以下时,会结束对象,避免极低速弹丸持续残留。
跳弹需要新的方向、速度和后续查询
基础反射关系为:
r = d - 2 × dot(d, n) × n
反射只解决方向的一部分。当前路径还检查武装状态、速度门、最大跳弹次数和角度条件,再计算材质保速与角度损失。之后加入资源给定幅度的方向扰动,保存新速度,将位置向表面外推出,并增加跳弹次数。
金属与普通表面的保速分类、方向扰动采样及局部基,目前使用明确的 UE 适配。恢复了反射和相关数值关系,不意味着原始两角随机分布或全部材质响应已经运行。续飞线条是新状态推进的表现,不能只画一条反射线就当作下一次碰撞也已经正确发生。
未达到武装距离的爆炸弹还可能走早期接触分支。达到武装距离、命中角满足条件,与飞行时间结束或延迟到期触发,分别读取对应参数。寿命到期、命中爆炸与延迟爆炸因此需要独立身份,不能只用一个“碰到了”布尔值统一决定。
相机看得见,枪口仍可能被挡住
TPS 相机在角色后侧,目标查询与枪口发射存在不同空间起点。相机能越过掩体看到敌人时,枪口可能仍在掩体后方。相机查询适合表达瞄准意图,最终结果需要由枪口复查或实体飞行的实际经过空间决定。
伤害与表现都使用最终确认的命中结果。若枪口复查命中近处掩体,不能一边播放墙面火花,一边仍让远处目标沿旧命中数组扣血。实体路径则由飞行接触负责结果,不再用远处普通即时查询提前执行伤害。
历史 44 专项留下了相机可见、枪口受挡的控制记录:23 次被挡射击之后,后方目标仍保持 1000 HP、伤害为零;移除掩体的控制可以正常命中。这组控制记录支持该场景的结果连接。正文的当前靶场视频没有拍摄这一负例,也未覆盖全部肩位和遮挡情形。
受击位置与爆炸中心各有含义
普通命中、硬表面、跳弹与爆炸调用不同的轻量反馈。爆炸中心用于范围事件,目标表面的受击位置用于目标反馈。把范围中心原样当成每个敌人的受击点,会使所有受击火花都出现在同一个空中位置,丢失“谁受到了作用”的信息。
靶场角色的倾斜使用方向与强度驱动的阻尼状态。普通离散命中每次注入反应速度,持续伤害路径则按约 0.065 秒的间隔限制新反应;受击特效另有约 0.065 秒的节流,不直接改写伤害事件数。已有倾斜每帧继续收敛,不是反复从首帧播放一段受击动画。死亡进入单独的倒地与尸体处理。
这些属于当前 UE 的轻量受击表现,没有恢复原作完整敌人动画状态机、部位护甲和全部异常状态。这些表现先把实际结果显示出来,后续替换动画、美术和材质时,仍可沿用命中结果及其接口。
准星怎样使用当前目标与最终画面
下面的重机枪完整视频适合同时观察持续射击与松手恢复。固定屏幕参考、移动瞄点、外侧刻线和相机运动可能有不同变化;观察其中一项,不足以判断其余项是否执行。
视频 3|重机枪的持续射击与恢复,完整约 5.93 秒。关注移动瞄点、外圈和画面响应的区别;它不是对散布角与屏幕半径进行同比测量的实验。
先区分界面里的几种量
移动瞄点来自当前武器目标的屏幕投影。它受到目标跟随、扰动、后坐与投影关系影响。普通外圈的几何半径由自己的公式与下限决定。刻线可能跟随关联目标,也可能由 profile 的资格控制。命中标记则来自实际事件,拥有颜色、透明度和时间状态。
这些元素即使叠在同一位置,也可能来自不同状态。外圈被基础下限支配时,中心瞄点可以继续移动;命中标记淡出时,几何半径也可以保持不变。用一个“扩散动画值”同时驱动全部元素,会把几何、状态和事件混成一个无法解释的表现量。
散布宽度在发射时参与方向采样,准星半径则表达屏幕几何。二者相关,但半径不能直接命名成弹着圆半径。尤其是 TPS 中,目标距离、相机投影与武器目标偏差共同参与显示,屏幕上多十个像素并不等于散布增加了某个固定毫弧度。
查询采用已发布状态,显示采用当前最终视图
当前实现区分用于目标查询的旋转与本次相机输出。查询读取上一份已经发布的 late response;弹簧继续推进后形成当前 late,再与 base 组合为本次后坐视图。它们不是“同一帧一个旋转到处复用”。
Q_query = Q_base × Q_late_published
Q_recoil_view = Q_base × Q_late_current
Q_final = 当前CameraManager修正作用后的视图
HUD = 用实际最终视图投影相应世界目标
已发布状态是明确定义的发布合同,不应简化成任意异步系统里固定相差一个渲染帧。UE 输入、目标、相机与 HUD 的调用阶段仍由宿主提供。本文核对的是当前入口怎样消费已有输出,而没有恢复整个原引擎的场景线程、骨骼更新和 GPU 帧时序。
独立震屏在 CameraManager 后续阶段再添加修正。HUD 如果仍拿未修正的基础相机投影,就可能在最终画面已经移动时显示旧位置;反过来,为让准星看起来稳定而强制把后坐视图恢复成 base,也会把有效的相机反馈移除。核对时要同时看目标来自哪里,以及最终绘制用了哪份矩阵。
当前适配以最终玩家相机的位置、旋转以及有效投影数据,投影相应世界点。投影是否成功、目标身份是否仍有效,属于这一层自己的条件。存在一份后坐四元数,不足以证明 HUD 使用了它;画面里圆圈在动,也不足以证明所有刻线都读取了相同目标。
普通外圈使用最大轴偏差
当前支持的普通 profile 在满足标志与正的 Normalization 时,使用如下几何关系:
deviation = max(abs(screenX - centerX), abs(screenY - centerY))
extent = max(Base × Multiplier, deviation + Padding)
T = clamp(extent / Normalization, 0, 1)
response = T × ResponseEndpoint + (1 - T)
偏差采用最大坐标分量,不是欧氏长度。例如教学输入 dx=20、dy=20 像素时,deviation 为 20,而非约 28.28。Base×Multiplier 还提供下限:若下限为 24、Padding 为 2,这次 extent 仍取 24;偏差升至 30 时,extent 才由 32 支配。例子只是解释公式,未指认某把实际武器使用这些数值。
Multiplier 自身有响应历史,不是每帧直接等于任意输入标签。几何响应又有自己的归一化与端点关系。查外圈大小时,应顺着 Base、Multiplier、实际投影偏差、Padding 和 Normalization 分别检查,而不是看到圆圈没扩大就给散布乘一个演示倍率。
投影像素与参考布局分开转换
HUD 根布局使用 1920×1080 参考尺寸,非拉伸分支取:
u = min(screenWidth / 1920, screenHeight / 1080)
rootScale = (u, u)
当前 1280×720 画面中,u 为 2/3。这是根布局缩放,不意味着所有投影像素都要先乘 1.5 再传给半径消费者。普通半径在规定入口读取屏幕偏差,移动元素转到局部坐标时还有其参考画布与根缩放关系。两个消费者处在不同计算位置,不能给它们统一加一层所谓 UI 校正。
参考画布还按宽高关系计算尺寸;根布局会处理由屏幕比例产生的额外范围与居中偏移。常见 16:9 例子便于理解,但不能直接推广成所有宽屏或竖屏永远只缩放一次。核对坐标时,要从输入位置一直跟到实际绘制位置。
命中事件单独拥有颜色与透明度
命中与击杀提示由实际事件驱动,和“扳机已按下”保持分离。事件入口还检查 HUD 模式与 profile 资格,然后保存类型、标记、初始透明度和剩余时间。普通命中、其他响应与特定事件分支不必共用一张固定颜色的叉号。
当前恢复的事件进度采用归一化推进:
progress = clamp(progress + 4 × dt, 0, 1)
markerAlpha = (1 - progress) × initialAlpha
remaining -= dt
remaining < 0 时结束事件
倒计时严格小于零才清状态,等于零不提前走同一个清理分支。Kind4 在对应普通模式且 remaining 严格为正时,暂时拥有外侧元素透明度,令 outerAlpha=progress。因此命中标记可以淡出,外侧元素同时淡入;两者不是同一个方向的动画。
这种透明度控制不改变散布角,也不等于改变 extent。事件拥有透明度期间,普通几何响应不覆盖该通道。剩余时间恰好等于零时,外侧透明度已回到普通响应,Kind4 类型却还没有清理;下一次进入严格负值才清类型状态。通道写入权和事件类型的结束边界因此需要分别检查。
历史 Kind4 视频采用人为控制的 UI 数值夹具,适合检查这个分支,但不能据其图标推导实际护甲、暴击或伤害类型。当前正常射击的命中连接仍要对照真实目标状态与事件记录。把 UI 算法恢复和战斗语义恢复分开,才能避免从一个正确淡入动画夸大到完整伤害系统。
持续喷射怎样保留时间结构
单发武器很容易用“一次成功发射通知一次反馈”解释。持续喷射不同:合格活动更新会调用后坐,弹药门却可能隔若干更新才跨过;可视粒子又按自己的出生调度产生。下面两段原片完整保留持续作用和停止后的恢复,分别展示喷火器与喷火手枪。
视频 4|喷火器的持续反馈与停止恢复,完整 8.30 秒。观察持续阶段与松手之后的区别;后坐调用、扣弹和粒子出生的精确次数由对应记录核对。
视频 5|喷火手枪的连续发射与恢复,完整 7.70 秒。它与前一段使用不同配置,不作为相同输入下的强弱对照。
活动反馈不等于周期扣弹
当前已恢复的喷射更新在合格活动帧注入后坐,不只在周期弹药门跨过时注入。因此把扣弹通知当作唯一反馈入口,即使燃料消耗与粒子数量正确,也不能保留持续后坐节奏。
入口仍检查当前武器、活动资格和实际发射条件。同一引擎帧中,激活与计时回调可能到达相同入口,需要去重,避免一次活动更新因宿主回调重复而注入两次。松手、装填、切换映射后,也要停止旧武器产生新反馈,已经存在的弹簧状态则继续恢复。
喷射原有的周期资源消耗、当前 UE 的粒子调度、碰撞与伤害节流各有时间尺度。调试记录分别保存这些事件,才能在同一时间线上比较。可见粒子更密集,可能来自出生调度变化,并不直接说明后坐更新也更频繁。
float余量也是需要交接的状态
弹簧按固定子步推进,但外层每帧 dt 可以变化。当前数值关系保留 float 余量:
residual = float(residual + clamp(float(dt), 0, 1))
while residual >= H:
推进一个弹簧子步
residual = float(residual - H)
H 为恢复的 float(1/60)
余量直接决定下一帧执行几个子步。某帧未满一步时,下一帧要带着剩余部分继续;切枪时丢掉余量,会改变后续冲量何时进入积分。采用绝对时间乘六十再向下取整,虽然在整齐的固定帧率下可能接近,却不是这段逐次 float 加减的同一种状态机。
源码还保留 dt 裁剪、阈值、刚度与阻尼的消费顺序。A/B 参数进入随机冲量与弹簧状态,不是现成的相机 Pitch/Yaw。恢复后的位移经过 late-response 消费才变成旋转,所以不能为了统一时间轴只保存最终角度,再从角度推回缺失的内部速度和随机状态。
先推进已有弹簧,再注入本次持续冲量
原调用关系中,Wielder 更新先推进弹簧,Spray 后续更新再施加冲量。注入速度不等于相机位置立刻变化;它从哪个后续子步影响位移,取决于这个顺序与当前余量。
当前喷射时间轴因此记录实际引擎帧、dt、倍率和 before/after 相位。先处理属于推进前的事件,再推进已有弹簧,最后处理属于推进后的事件。普通发射与喷射事件可以使用不同相位,不能因为共享一套后坐模块就强行放到相同的绝对时间网格。
一个教学例子能说明差异:假设一帧恰好会推进一个弹簧子步,而新的冲量归属于推进之后。先积分再注入时,这一步先演化旧状态,新速度留给后续子步;交换顺序则让新冲量提前影响本步位移。两种实现最后都能回正,却在开火持续段形成不同曲线。
这个例子只解释相位,不把所有实际帧固定为一个子步。有的帧没有完整子步,有的帧执行多个;正确结果依赖真实 dt 与完整历史。正因为如此,仅检查固定 30、60 或 120 Hz 的规则输入,还不足以覆盖交替帧长的边界。
迟到事件回放原帧,不用现在的平均帧率补算
某个活动通知到达时,相机可能已经推进过它所属的帧。当前时间轴保留有界短历史,每条记录包含推进前的完整状态以及该帧 Time、Dt 和 Scale。迟到事件落在有效历史内时,从对应 Before 状态恢复,按保存的真实帧序列重放。
重放必须区分“状态需要再次计算”和“外部事件需要再次通知”。事件序号用于去重,已宣布的消费不会因为内部回放再次对外增加一次发射。历史过旧、非法时间、重复帧、容量越界等情况会被拒绝,不能宣称任意迟到都能无损追溯。
进入喷射时,普通时间轴的完整弹簧状态与未消费事件需要承接;退出喷射时,再把当前完整状态交回普通时间轴。源码将新普通时间起点放在已推进后的当前时刻,避免切换帧再积分一次。需要携带的包括两组弹簧的位置、速度及其他状态、余量、随机种子、已消费数与待处理事件,远多于一个当前角度。
有些在喷射历史建立前就存在的待处理事件,当前适配会重新放到首次推进前处理,以保留其最后一次冲量。这是当前宿主的桥接约定,原引擎其他异步任务是否使用相同协议仍未确认。
历史 49 专项在四种武器、两档倍率与六类时长序列下核对 15,840 帧、411,840 项数值及随机种子,并包含实际 UE 普通与变帧率运行的 5,760 帧回放。它支持指定输入合同中的时间结构。本文当前视频能显示持续反馈与恢复,但不能把历史专项改写成当前构建重新测试了所有帧率和网络调度。
独立逐发震屏怎样叠加到相机上
弹簧后坐与独立震屏提供不同时间结构的响应。弹簧由冲量改变速度,再持续演化位移;逐发震屏读取有限时间资源,采样波形与包络,在该段时间内提供附加修正。它们可以由同一次有效发射启动,输出却在不同阶段组合。
下面的完整五武器合集集中展示这种响应。观看时可以留意单发冲击、持续射击中多次作用,以及最后一发之后的自然恢复。不同武器的发射节拍与配置也不同,不能仅凭这段合集给出严格同输入的手感排名。
视频 6|手枪、步枪、泵动霰弹、磁轨与电弧的相机反馈合集,完整约 41.03 秒。各段保留开火与恢复,便于连续观察不同配置的响应。画面中的代理枪模不承担真实武器模型差异。
先选择资源,再建立有限实例
普通发射组件可以关联 world、local、first-person 等资源键。这些键是否被采用,还取决于当前玩家、相机和局部分支条件,不能见到非零就同时播放。当前 TPS 原型接入的是已用的本地非零逐发路径,UE 的本地控制 Pawn、成功发射回调和实际相机身份提供宿主输入。
某次发射选择到资源后,实例保存资源引用、开始时间与停止基准 stop=start+duration。资源是反复读取的配置,实例的出生与结束则属于这次发射。高射速下可以同时存在多份未结束实例;重新读取配置不能把它们全部重置成最新一发。
本轮 82 个映射连接到七组原始逐发震屏资源。82 是使用映射数,七是资源组数,多种武器可以共用资源。其余 14 项保留已有路径,其中五条普通组件的原始逐发字段为零。零字段不能推出该武器没有弹簧后坐、持续反馈或其他原型表现。
原局部选择还存在特定 Arc 分支的键读取关系,材料通过不同哨兵键的实执行确认,当前两项 Arc 默认键相同。正文使用已确认的选择结果,详细分支放入技术索引,不依据一个字段名字擅自改写消费。第一人称、world 距离传播与持续循环震屏也没有随这条本地路径一起全部迁入。
资源保存波形,包络控制它何时有效
资源前部的六个通道分别提供旋转和平移输入。每个通道保存振幅、频率、波形类型与相对时间标记。当前七组资源均为有限、非定向,且不启用传播延迟。这里讲的是已使用的编译分支,不是一份原引擎所有可用波形的完整规范。
在已恢复路径中,类型 3 直接使用常量幅度,其他已执行类型使用对应正弦采样。relative 标记决定用相对出生时间还是当前绝对时间:
tau = relative == 1 ? now - start : now
wave = kind == 3 ? amplitude
: sin(2π × frequency × tau) × amplitude
sample = wave × envelope(start, stop, now)
相对时间会让同资源的每个实例从自身出生相位开始;绝对时间则在世界时刻采样。即便使用同一振幅与频率,发射时间不同也可能改变绝对时间分支的采样值。再加上多个实例相加,资源振幅自然不等于每一枪实际可见峰值。
float 相位的乘法顺序也参与原始对照。数学上写成 2πft 方便理解,源码的乘法、加法与 sin 调用顺序仍应保留,避免把代数等价直接当成浮点执行等价。旧周期扰动中的角频率与这里资源频率也不能混用,5 rad/s 不能直接标成 5 Hz。
下表把旋转通道振幅换算成度,便于阅读。资源仍以弧度保存;C0、C1、C2 是原生通道,不能直接命名成 UE 的 Pitch、Yaw、Roll。
| 示例资源 | C0 振幅 | C1 振幅 | C2 振幅 | 时间参数摘要 |
|---|---|---|---|---|
| 标准手枪 | 约 0.06° | 约 0.7° | 约 0.15° | attack 0.025 s,decay 0.6 s,duration 0.085 s,release 0 |
| 普通步枪资源 | 约 0.05° | 约 0.1° | 约 0.4° | attack 0.025 s,decay 0.05 s,sustain 0.2,duration 0.1 s,release 0.3 s |
| 霰弹、磁轨、电弧共用的一组 | 约 3° | 约 1.4° | 约 0.3° | attack 0.02 s,decay 0.08 s,sustain 0.15,duration 0.05 s,release 0.3 s |
差异来自恢复的数据,没有为每把枪追加演示倍率。最终冲击还取决于其他条件:有限时长可能在 decay 尚未完整经过时结束,包络可能远低于一,多实例则可能在不同相位互相加强或抵消。
duration不是在完整ADSR之后再补的一段时间
设 A、D、S、R 分别为 attack、decay、sustain、release。当前分支先检查有限时间边界,再按顺序选择阶段:
if now <= start or now >= stop + R:
envelope = 0
else:
e = now - start
if e < A:
envelope = e / A
elif e - A < D:
v = (e - A) / D
envelope = (1 - v) + v × S
elif now <= stop:
envelope = S
else:
envelope = S × (1 - (now - stop) / R)
边界与分支顺序同时决定结果。不能先画一个标准 ADSR,再把 duration 当成额外 sustain 时间。标准手枪资源的 duration 为 0.085 s,decay 却为 0.6 s,release 为零。超过有限停止边界时,直接停止采样,不会为了画完 decay 再运行半秒。
用这组时间参数做教学计算:相对开始 0.025 s 时已达到 attack 末端;到 0.05 s,仍在 decay 的早段。只要到达 0.085 s 的停止边界,顶部时间判断就让输出为零。它是否在画面中显得锐利,还要再乘当时波形、输出强度并经过姿态组合,不能只从包络结束推断完整屏幕运动。
另一组资源的 duration 也可能早于 attack+decay 的总长度。到 stop 后,输出仍先检查 decay 条件,随后才可能进入 release。按函数的分支顺序绘制,才能在曲线上保留这种阶段关系;常见音频包络模板无法直接代替。零 release、严格边界和阶段重叠也都参与结果。
多实例先累加通道,再生成一次修正
每帧先移除已经结束的记录,在剩余实例中采样六个通道,并按遍历顺序累加。相同通道上的结果先合成 Sum,随后才生成姿态。源码中结束实例清理与采样边界各有比较符号;记录短暂仍在容器中,不代表该边界上一定有非零输出。
先累加通道,再生成姿态,与每个实例先生成四元数、再逐个相乘的结果不同。只保留最强实例也会丢掉高射速下的叠加关系。UE 当前用数组保存和遍历实例,原引擎内存池与 free-list 的完整顺序没有整体复制。数值回放采用实际 UE 事件与遍历顺序来检查原片段。
令合成通道为 C0…C5,当前姿态关系为:
q_native = qZ(C0 × kR) × qX(C1 × kR) × qY(C2 × kR)
t_native = (C3, C4, C5) × kT
四元数的顺序不能随意交换。C0 绕原生 Z、C1 绕原生 X、C2 绕原生 Y,再按 qZ×qX×qY 组合;半角与三角函数属于这一转换。把三个通道直接加到 UE 欧拉角上,会绕过坐标基和手性,也改变旋转的应用空间。
当前原生四元数到 UE 的对应为 (-y,-x,-z,w),位置向量则交换水平轴并把米换成厘米。转换后的局部修正作用在已有视图之后:
Q_recoil_view = Q_base × Q_late
Q_final = Q_view_after_other_modifiers × Q_shake_UE
第二式保留 CameraManager 的宿主阶段:当前先执行保留的其他 Modifier,再应用原始逐发修正。只有在其他修正为单位作用时,才能把中间视图直接写成第一式结果。读数中的“本帧 Modifier 增量”也因此是该阶段前后的总差,不能自动当成纯独立震屏通道。
当前TPS有旋转修正,不新增平移震屏
已验证的 TPS View 分支使用旋转因子一、平移因子零。资源可以存有非零平移通道,但在这条视角路径上,平移输出被相应因子关闭。不能因为代码有位置应用接口,就写成镜头这次增加了前后位移。
本轮还核对了不同用途的设置:后坐输出 Gain 默认一,独立 camera_shake_strength 默认约 0.66。前者作用于弹簧位移到 late response 的消费链,后者控制独立震屏输出。当前以 UE cvar 提供设置入口,原始完整菜单、设置文件和生命周期没有整体迁入。
当前原生旋转因子一与设置强度 0.66 在对应输出端共同生效;不能把强度再提前乘到后坐随机冲量,或者同时乘进多个消费者。若想提供统一体验设置,也应先明确这是产品层新策略,而不是悄悄改写恢复数据。
只替换对应的代理震屏,保留其他反馈
代理样枪原有的火器震屏如果与恢复资源同时播放,同一次发射会重复表达。当前只在认证的非零资源路径成立时,替换对应的普通 Lyra 火器震屏。其他提示、未映射或零资源路径保留既有行为,避免为了接入新模块把其他工作正常的反馈一起清掉。
这与移除全部 CameraModifier 完全不同。弹簧后坐、逐发震屏和其他宿主修正需要各自检查。一个实例存在并不保证实际可见:它可能处在零包络边界、被强度设为零、没有通过局部相机资格,或者没有在最终视图应用。检查对象数只能证明对象存在。
材料中关闭独立原始与代理震屏的控制,将 CameraManager 额外震动归零,同时保留弹簧后坐。这个对照帮助区分来源。它不能把任何画面运动都归结为独立震屏,因为呼吸、目标跟随、玩家输入及基础相机更新仍有自己的作用。
资源振幅与实测峰值分开报告
当前 54 构建的代表场景中,标准手枪独立修正四元数总角度峰值约 0.46086°,霰弹、磁轨、电弧共用的一组约 1.88213°。这些是指定输入与时序下的观测,不是每发固定角度,也不是直接拿通道振幅相加得到的数值。
表格中还有 Modifier 最大单轴值,它记录前后姿态差中的最大 Pitch/Yaw/Roll 分量。总角度与最大轴值即便同以度表示,仍不是同一指标;更不能把恢复稳定窗口里的残余量当成整段射击峰值。解释比较时需要同时保留字段含义和统计窗口。
七组资源的 6,888 组数值核测试覆盖包络、边界、多实例与最终姿态;另有局部启动、资源选择和设置绑定的独立集合。各集合检查的输入条件不同,统计时要分别列出,不能当成“完整武器数量”。
当前 96 项运行还记录了 80,645 帧与 1,040 个实际逐发震屏事件,将它们回放到原始数值片段后,六通道最大误差为零,四元数最大分量误差约 5.960464477539063e-08。后者是分量绝对差,不是度数、像素误差或整幅画面的相似度。
没有同输入原作实录,这些结果不能表述成原作视觉百分之百一致。可以确认的是:指定资源、事件、遍历顺序与采样时刻进入对应数值计算后,产生了所述结果;真实 UE 录像进一步展示它如何进入当前相机。
用实时数据分清参数、状态与输出
武器响应逐渐完整以后,只看画面越来越难定位来源。左上实时参数卡保留输入系数、后坐状态和最终相机增量;左下显示当前映射与武器信息。这些读数让观察到的问题有具体的核对位置。
例如,相机相对角色根的位置可能在后方一百多厘米。那是基础机位,不表示每次开火又把相机向后移动了一百多厘米。若要讨论震屏平移,应该读取应用 Modifier 前后的增量,并检查当前 TPS 的平移因子;不能从基础机位字段直接做结论。
| 字段 | 数据身份与单位 | 适合回答的问题 |
|---|---|---|
| A/B 输入 | 后坐配置系数,按消费者解释 | 本次映射究竟使用了什么冲量输入 |
| Gain / Scale / dt | 输出增益、弹簧调用倍率与本帧时间 | 参数在哪一阶段被缩放,按什么时间推进 |
| Recoil local P/Y/R | 已消费的后坐局部角,单位度 | 弹簧后坐怎样影响视图 |
| Camera – pawn root | 相对角色根的基础相机位置,单位厘米 | 当前机位,而非本次新增位移 |
| Modifier camera | 相机修正阶段前后的姿态/位移差 | 最终阶段是否实际改变画面 |
| Native实例与局部角 | 独立逐发资源的活动与输出 | 资源是否启动,以及当前采样是否非零 |
| Peak与恢复残余 | 各自窗口内的统计 | 射击峰值和末尾收敛是否满足不同条件 |
前面的短片中,有些窗口会显示代理开关仍开启,却没有对应代理火器震屏活动。这并不自动是矛盾:全局允许开关与当前非零资源的替换资格不同。要确认是否重复叠加,应看实际活动类别和最终修正,而不是只看一个开关。
相机卡还可以帮助判断“反馈弱”来自哪里。若成功发射序号增加,却没有进入后坐队列,应查通知入口与映射身份;若弹簧持续变化、独立实例为零,应查资源选择与资格;若实例非零但当前角度为零,先看采样时刻、包络和强度。不同层的问题不应统一用放大 Gain 处理。
HUD 也需要相同的观察方法。瞄点在动、外圈不变时,先核对 Base×Multiplier 是否提供更大的下限;命中透明度变化时,再看事件是否暂时拥有该通道。把几种量摆在同一帧,能减少动画、美术与玩法之间对“准星扩散”一词的歧义。
完整每帧 CSV 用于追查事件与连续状态,摘要表用于挑选典型映射。正文只展示含义明确的参数和观测,不要求读者浏览八万多行记录。内部数值回放检查消费者,文章的视频与配图则帮助读者理解这些数字为什么影响实际画面。
特殊后端保留各自的活动与结束条件
普通实体弹丸连接得更完整,并不意味着所有武器都应该改成同一个发射器。连续光束需要维持当前枪口到查询端点的活动状态;电弧需要候选和跳转历史;追踪弹需要目标资格、方向与导引状态;喷射则分别管理发射器和已出生粒子。
它们可以共同通知有效发射、命中和反馈,但通知粒度各有含义。一次光束有效更新与一颗普通弹丸命中没有相同的计数口径;一次电弧发射可能涉及多个接触;追踪过程存在也不表示已经获得消耗弹药并生成弹体的资格。
追踪从资格到实际命中
下面保留追踪手枪的完整过程,观察锁定提示、实际发射、弹丸及受击反馈。正文不再重写上一篇的全部导引公式,重点在各阶段如何连接。
视频 7|追踪弹的默认发射与命中反馈,完整约 7.37 秒。锁定过程、消耗弹药与实体活动分别判断;本片不包含所有空仓、失锁和装填反例。
历史专项分别检查过未锁定不消耗、锁定后消耗、空仓不发射、备用弹转入与装填后恢复。当前完整视频呈现默认路径,不能把历史每一种反例都写成这段录像的内容。追踪端点爆炸等环节仍含 UE 适配,原始导引数值与完整原作场景服务不是同一层成果。
发射后若目标身份或场景条件改变,后端如何处理还要依据各自状态机。一次合法出生不能替代后续每一步资格。也不能为了统一生命周期,让每个后端在松手时立刻清掉所有已产生实体;已发射的弹丸与活动中的输入有不同所有权。
电弧仍使用自己的目标与传播关系
电弧短片保留蓄力、作用与恢复。可以观察它与普通飞行路径不同的节奏,但候选距离、方向门和传播身份仍应读参数与记录,不能按一条发光线推断每个内部候选。
视频 8|电弧的发射、受击与相机反馈,完整约 8.87 秒。它展示当前默认过程,不增加未记录的连锁跳数、护甲或伤害语义。
连续光束保留活动状态,不按普通弹丸解释
激光炮把时间关系换成了预热与持续照射。下面保留完整过程,关注预热到作用的衔接,以及松手后当前照射和相机反馈怎样结束。无需沿着一颗主弹的轨迹去解释这条路径。
视频 9|激光炮的默认预热、持续照射与停止,完整约 5.07 秒。它展示当前光束后端的连续行为,不作为完整温度、过热、散热与补给生命周期的专项证明。
光束预热完成、活动照射、实际接触、伤害通知和停止分别保存含义。持续活动期间,后端按自己的当前状态更新作用;接触与目标结果进入相应反馈,不能把一次可见光束等同于一颗普通弹丸,或把每次更新都算成一次独立按键发射。
停止新照射以后,已有命中提示、弹簧后坐或其他相机状态仍按各自规则恢复。因而光束结束与所有反馈归零不必发生在同一帧。与前面的喷射、追踪和电弧并列观看,可以看到共享反馈接口之下仍保留不同的执行与结束条件。
停止输入与清理已有对象分开
松手会阻止需要持续输入的后端继续产生新作用;已经产生的飞行体、粒子、命中事件和相机实例按照各自规则结束。装填、切枪与取消还要检查旧入口是否继续提交,不能只清一个可见效果就认为所有活动都关闭。
当前 54 构建的默认路径覆盖发射、UI、受击、相机与自然回正。更宽的移动、蹲下、模式、装填、切换等生命周期组合,材料来自明确标注的历史 42/44 专项。它们保留工程依据,但没有被合并包装成当前构建重新跑完的同一个总验收。
代理弹匣、按键生命周期、场景目标、轻量特效与枪口节点仍是原型输入。完整人物持枪、身体转向、移动瞄准协同与网络复制会进一步影响这些接口。本篇到此描述的是已连接的单机机制和输出,尚未把整套角色枪械 3C 合入正式项目。
用对应证据判断覆盖与自然恢复
讨论覆盖时,先区分统计对象。96 项是当前参数映射数,79 个新普通实体映射、合计约 80 条采用实体飞行结算的物理路径、82 个非零逐发震屏映射、七组震屏资源,都在统计不同对象。它们不能相加,也不能互相替代。
本轮有效配置、飞行内核、HUD、喷射时序、震屏与实际画面各有证据。各项记录分别说明输入、计算与实际接入,单个模块的数值一致不代替整套系统的验收。
| 材料 | 可以核对 | 不能直接推出 |
|---|---|---|
| 固定配置与默认覆盖核查 | 当前有效输入及字段发布关系 | 任意装备、伤势、技能与动态场景都已覆盖 |
| 飞行内核 720 组对照 | 指定输入下位置与速度输出 | 原版碰撞、材质、伤害和世界调度完整运行 |
| 历史 49 喷射专项 | 指定帧序列、余量、相位和随机状态 | 当前全部后端、任意调度与网络一致 |
| 震屏资源数值对照及实际事件回放 | 对应波形、包络、通道和姿态计算 | 原作整幅画面或同输入视觉完全一致 |
| 当前 54 构建默认 96 项运行 | 默认发射、UI、受击、相机及自然恢复 | 全模式、完整生命周期与正式产品验收 |
| 当前完整视频 | 连续可见执行及末尾恢复 | 实时性能、无声音频听感或未拍摄的反例 |
| 历史 42/44 生命周期与控制场景 | 指定版本的交互和负例结果 | 当前构建已重新执行相同完整集合 |
录像尾部按真实恢复决定
固定给每把武器留半秒尾巴,可能截掉慢恢复;给每把枪留很长尾巴,则增加大量无关静止。当前录制以实际首发前约 0.5 秒开始,保留末次有效命中、爆炸或喷射作用,再检查后坐、独立震屏、Modifier 增量及可见准星是否恢复并稳定。
稳定窗口包含连续 30 个 60 Hz 仿真帧,即 0.5 秒。这个窗口是录像与验收条件,不能写成原游戏存在一个统一的“松手半秒回正”玩法规则。不同武器达到窗口的时刻可以不同,末次反馈也不必等于最后一颗主弹离开枪口的时刻。
呼吸与原有扰动保持运行,收敛不要求每个状态严格变成数学零。隐藏准星的路径也按自身可见资格处理,不要求原本隐藏的元素突然出现。若为了通过恢复判断而强制把目标或相机归中,就已经改变了需要展示的连续状态。
当前完整目录有 96 段独立视频、六个分组,以及带章节的约 12 分 08 秒合集。正文使用九段完整素材,保留原来的时长与恢复尾部;其他当前视频和两段历史专项按版本索引,不交叉冒充。
本篇选择的视频包括约 41 秒五武器合集,故它与单枪展示本身存在内容重合。正文不再重复嵌入手枪、霰弹与磁轨单片,也不把合集算成一次包含所有测试条件的连续验收。读者看到的是多个独立场景组织成的展示。
版本与统计窗口不藏在一个总分里
当前画面对应 54 构建,55 是录制批次。较早 36/37 记录提供实体与碰撞路径依据,历史 30/49 材料提供 UI 与时序专项。各自报告中的“当前”属于那个冻结报告的时间,不应直接转写成本文所有结论的共同版本。
同样,原始数值片段的一致性、UE 运行事件回放与可见结果是相互补充的层次。完整解码与浏览器播放检查媒体是否可读,实际参数和事件记录则说明画面对应的输入。本文写作阶段没有修改工程、重新逆向或重新录制,也没有把材料核对称为新增引擎验收。
这次连接为后续项目留下什么
现在可以沿一次射击追踪数据:有效配置进入实际提交,实体或特殊后端保存自己的活动,接触产生对应结果,伤害与表现共享结果,命中事件进入 HUD,发射反馈则在相机与准星相关状态中继续演化。松手以后,各层依据自己的结束条件收敛。
后续可以沿这些接口替换具体实现。枪口节点可以换成更完整的武器骨骼,轻量受击可以换成正式动画与特效,场景材质可以接入更丰富分类,UI 可以替换资源而保留同样消费者。替换时仍要保留输入身份、单位、阶段与生命周期,让伤害继续对应实际命中结果。
目前仍使用 Lyra 代理枪模、单机 TPS 场景和明确的 UE 适配。原版完整美术与音频、完整第一人称、世界距离传播与循环震屏、原生设置/内存池生命周期、全部引信和部位护甲、全模式与联机,没有作为本次完成成果。
完整枪械 3C 的下一条线还包括输入、人物朝向、武器姿态、身体动画、移动与瞄准协同、打断恢复及网络状态。本轮补充的发射和反馈链为这些工作提供可检查的接口,但不代替它们。本文继续讨论已接通的武器射击流程,完整角色战斗系统另行展开。
完整视频与专项材料索引
正文中的九段已保留完整原片;下列链接用于补充阅读,已嵌入正文的等离子与激光也保留直接入口,不要求按编号顺序全部观看。其他片段引用当前素材包的原始文件,未重新编码。历史专项单独列出,不能作为当前构建的画面证明。
| 分组 | 当前完整素材 | 用途 |
|---|---|---|
| 普通射击 | AP 步枪、手枪、霰弹 | 对应独立映射的开火和恢复;部分已被正文合集覆盖 |
| 实体与蓄力 | 蓄力等离子、磁轨、榴弹 | 补充各自默认发射过程,不代表同一物理后端 |
| 连续与特殊 | 激光、特殊投掷 | 补充预热/持续照射与特殊释放 |
| 历史专项 | 喷射49、Kind4 UI夹具 | 前者为历史时序专项,后者为控制输入的界面分支;不推导当前性能或护甲语义 |
AI 协作复盘
本篇从旧文与冻结交接开始,把已有能力与本轮进一步连接的消费者分开。AI 用于整理数据依赖、阅读对应实现、改写公式说明、组织完整视频与机制图;没有在写作中扩展工程功能或新增运行结果。
校对重点放在容易被画面混淆的地方:弹道预览与真实飞行、发射与命中、普通外圈与散布、持续后坐与扣弹、弹簧后坐与独立震屏。参数与阶段不由屏幕观感反推,视频未展示的掩体、材质或生命周期反例回到各自历史记录。
数字也保留原身份:映射数不等于资源数,数值分量误差不等于角度,恢复残余不等于射击峰值,录制批次不等于构建。图用于解释计算与消费者,实际效果仍由真实画面和对应事件支持。这样文章可以深入到实现,同时把尚未连接的完整 3C 工作留在后续范围内。










