下载 App
《刀光剑影》开发者日志


第一期:让刀光"是画出来的",而不是贴上去的
本期进展
1. 核心玩法跑通了
玩家在屏幕上画一笔,这一笔的形状直接变成一道飞出去的刀光。画横线出横劈,画弧线出月牙,画爱心就出爱心刀光。笔画越长刀波越大,画得越快伤害越高。
技术上走的是「屏幕笔画 → 归一化形状 → 程序化几何体」这条路:把玩家的采样点降采样、居中、按最大跨度归一化到 [-0.5, 0.5],再沿着轨迹生成带状网格。所以形状完全由玩家决定,不需要预制任何刀光模型。
2. 3D 角色动起来了
用 Tripo 生成的模型 + 引擎内置动画系统。这里踩了个大坑:生成的模型是 Mixamo 命名(L_Upperarm),而引擎动画是 Bip001 命名(Bip001 L UpperArm),名字对不上,动画驱动不了模型。
解法是把模型骨骼改名成引擎期望的格式——而且必须同时改 name 和 nameHash,因为引擎内部用 StringHash 索引骨骼,只改 name 是无效的。
3. 走路/跑步动画用 IK 实现
这个模型的腿几乎完全伸直(大腿 0.477m + 小腿 0.702m = 1.179m,而站立时髋到脚只有 1.171m,余量 8mm)。直接转髋关节 40°,脚就会沿腿长划弧抬起 0.33m,直接穿出裙子。
所以改成两骨 IK:先决定"脚踩在哪",再用余弦定理反解髋/膝角度。
上图:用红/绿标记球标定左右手腕骨骼位置,排查剑挂载点。这是在确认「角色右手到底是哪个方向」时拍的。
问题与风险
刀光是一团糊掉的白光,玩家画的形状完全读不出来。
原因有两个,都是根子上的问题:
① 边缘衰减太软,没有边界。 旧 shader 横向衰减写的是 pow(1 - across, edge_soft),edge_soft ≈ 0.85 时几乎是线性衰减——从中心到边缘一路慢慢变淡,整条刀光糊成一坨。
② 拖尾残影把颜色冲成白的。 6~8 层残影共用同一个材质,每层亮度完全一样。半透明叠 6 层,alpha 混合的结果必然趋近白色。这个不解决,光调颜色没用。
上图:改版前的刀光,四个飞行时刻。形状读不出来,就是一团白色光晕。
下期计划
- 刀光改成「刃线 + 刃身 + 速度线」三层结构,边缘从软过渡改成硬边
- 用顶点色把每层拖尾的 fade 传进 shader,解决叠加发白
- 加命中特效


第二期:刀光的"刃感"与命中反馈
本期进展
1. 刀光重做成三层结构
| 层 | 做法 |
|---|---|
| 刃线 | 轮廓处一条高斯细亮线 + 外侧柔光晕,定义"刃",形状靠它读出来 |
| 刃身 | 边界改成 smoothstep 硬边,饱和青蓝(深蓝外缘 → 亮青内层) |
| 速度线 | 沿轨迹流动的高频条纹,只出现在刃身内部 |
关键修复:把每层的 fade 写进顶点色(DefineColor),shader 里乘 COLOR.r。顶点色是唯一能逐层传值、又不用拆材质的通道。而且RGB 也要乘——只乘 alpha 的话,多层叠加后仍会趋近白。
另外把刃身亮度压下来、白核收窄:场景开了 Bloom + ACES,亮度一高就被冲白,只有刃线和中轴该发光。
2. 命中冲击波环
刀光撞到敌人时,在命中点炸开一圈径向光:白核 → 扩张亮环 → 大而淡地消失。击杀时环放大 1.6 倍。
这里用了和拖尾同样的技巧——顶点色传年龄。池里 8 个环共用同一个材质,uniform 是材质级的、改一个会影响全部,只有顶点色能逐对象传值。
上图:冲击波环的三帧演化——白核爆点、扩张的亮环、淡出。
问题与风险
挥砍动作"没有惯性"。
速度曲线用的是对称的 smoothstep:起手和收尾一样慢,到顶时速度刚好降到 0 但立刻开始回落,看着像"弹"回去的,没有挥完"定住"的那一下。
改成三段非对称曲线后好多了:出刀 ease-out(起步最快)、中间定住约 96ms、收刀 ease-in-out 慢慢落回。
上图:挥砍动作的胶片图,逐帧对比姿态。第 5、6 格姿态几乎相同,就是"顿住"的那一拍。
下期计划
- 攻击姿势的轨迹还在调,目标是干净的前半圆
- 刀光与攻击动作的时序对齐


第三期:攻击轨迹与发布素材
本期进展
1. 攻击轨迹改用「绕固定轴旋转」
之前试过两种插值,都不对:
| 方案 | 问题 |
|---|---|
| 角度线性插值 | 「角度 → 手的位置」是强非线性的,角度走直线、手在空间里就是扭的。实测 x 序列会先往左又弹回右,路径/直线比 3.84 |
| 三关键帧 + slerp | 插值本身没问题,但关键帧本身是坏的:「正前方」和「左前上」两个姿态的右手落点几乎重合(相差 0.13),后半段等于没动 |
最后改成绕一条固定轴做连续旋转——这也正是挥砍的物理本质(肩关节绕一个轴转)。轴和角度是扫出来的:9 条候选轴 × 3 个总角度,逐个读右手世界坐标,按「x 单调」和「z 前鼓尽量小」两个指标挑。
一个教训:验证必须用游戏相机(角色身后、pitch 20°)。我中途一度用正上方俯视去验证,把"手往前伸"误读成了"抬手",白调了一轮。
2. 出刀爆发
在刀光起点炸开一道向外扩散的月牙,0.3 秒内边扩散边淡出。踩了两个坑:
- SetNumGeometries(2) 会让整条刀光都不渲染——这个引擎的 CustomGeometry 多几何体路径不可靠。改成把爆发和刀身塞进同一次 BeginGeometry/Commit
- 顶点色传错了:我把 burstAge 当淡出系数传,但 age=0(刚出刀)时系数为 0 → 起手全透明。应该传 1 - burstAge
3. 发布素材
实机截图、图标、宣传图、横竖版封面都已生成。截图是从真实游戏画面抓的——写了个拍摄脚本跑真实场景、每 14 帧自动甩一道刀波,从 10 个候选帧里挑刀光最完整的 4 张。
上图:现在的刀光——带亮边的青蓝刃光,形状清晰,拖尾层次分明。
问题与风险
中段遮挡。 从游戏相机(身后)看,挥砍中段有 3~4 帧剑会被角色身体挡住——因为手往身前鼓了 z = +0.36,正好跑到身体前面去了。这是当前版本的已知取舍,如果后续要全程可见,需要把终点改成一个"不那么靠前"的斜上方姿态。
发布配置里的一处坑。 项目的 i18n 是关闭状态(enabled: false),但引擎的 i18n.lua 始终声明了对 i18n/zh_CN.json 和 i18n/en.json 的引用。构建从不产出这两个文件 → 运行时 DownloadManager 解析失败 → 预览客户端拿到空数据崩溃。解法是开启 i18n 让构建产出翻译表(源语言回退到原文,显示不受影响)。
上图:实机截图,大弧刀光 + 拖尾 + 出刀爆发同时出现在画面里。
下期计划
- 挥砍中段遮挡:调整终点姿态,让剑全程露在身体轮廓外
- 剑气质感升级:参考《晶核》的剑气,加"平行细光丝"和白色尾迹烟雾
- 敌人 AI 与战斗节奏调整(目前 7 个敌人会持续围殴,主角掉血过快)
- #聚光灯gamejam开发者日志









