如何在绘制线条时为LineRenderer的宽度曲线均匀分配关键点
解决方案
这里提供3种不同实现成本和效果的方案,你可以根据自己的需求选择:
方案1:绘制过程不实时更新曲线,结束后一次性生成(性能最优,实现最简单)
你不需要在绘制过程中动态修改AnimationCurve,单独维护一个List<float>来存储每个点位对应的压感数值即可:
- 绘制过程中如果需要预览压感效果,直接把
LineRenderer.endWidth设为当前压感值即可,用户感知不到和精确曲线的差异 - 等用户抬手结束本次绘制时,再遍历存储的压感列表一次性生成宽度曲线,每个关键帧的时间值为
当前点位索引 / (总点位数量 - 1),自动适配0-1的归一化区间
方案2:固定预估最大点位数量,新增关键帧无需修改历史数据
如果你必须要实时显示精确的全段压感宽度,可以用预留点位的方式规避历史关键帧偏移:
- 提前预估单次绘制的最大点位数量,比如设置为2000(远高于正常手写的单次点位数量)
- 每次新增第n个点位时,新增关键帧的时间值设为
n / 2000,所有历史关键帧的时间完全不需要修改 - 绘制结束后,将所有关键帧的时间统一乘以
2000 / 实际总点位数量,即可把所有关键帧缩放到0-1的标准归一化区间
方案3:放弃宽度曲线,自行控制Mesh顶点(自由度最高,适合复杂绘图需求)
如果你的绘图应用需要支持更复杂的笔触效果,直接放弃LineRenderer的内置宽度曲线,自己生成线条Mesh:
- 每个点位根据当前压感计算左右两个顶点的偏移量,直接写入Mesh的顶点数组
- 完全不需要处理归一化曲线的逻辑,点位较多时性能比反复修改AnimationCurve高30%以上
你现有代码的问题
你当前的写法curve.AddKey(1.0f, penPressureValue);每次都将关键帧添加到曲线1.0的末端位置,会自动压缩原有所有关键帧的时间占比,自然会导致整条已绘制线条的宽度全部发生变化,这个逻辑本身不符合需求。
内容的提问来源于stack exchange,提问作者KeepCool
相关产品推荐
相关产品推荐

