为什么Unity中正弦运动路径的变量运算顺序会影响运行效果
问题原理说明
这个问题和Unity引擎编译、运行机制无关,是两个代码的数学逻辑完全不同,核心是标量与Vector3乘法的作用对象差异导致的效果偏差。
正确代码的运算逻辑
你给出的可实现预期效果的代码:
pos -= Time.deltaTime * moveSpeed * transform.right; transform.position = magnitude * pos + axis * Mathf.Sin(Time.time * frequency);
式子拆分为两个独立的计算部分:
magnitude * pos:用标量magnitude对累积位移向量pos做缩放,得到沿transform.right方向的基础匀速运动位置axis * Mathf.Sin(Time.time * frequency):用随时间变化的正弦标量对指定轴向向量axis做缩放,得到仅在axis方向的往复波动偏移量
两部分相加的效果是:物体沿主方向匀速移动的同时,在指定轴向叠加往复波动,符合你预期的运动轨迹。
错误代码的运算逻辑
调整后的代码逻辑完全改变:
pos -= Time.deltaTime * moveSpeed * transform.right; transform.position = magnitude * Mathf.Sin(Time.time * frequency) * pos + axis;
标量乘法满足交换律,所以运算等价于:(magnitude * 正弦波动值) * pos + axis
- 正弦波动值直接作用在基础位移向量
pos上:相当于你沿transform.right的移动速度会随正弦值不断变化,甚至会出现方向反转,完全破坏了原有的匀速基础运动 - 最后仅加了固定的
axis向量:原本的轴向波动效果完全消失,仅相当于给整个运动加了一个固定的坐标偏移
自然无法得到预期的运动效果。
补充注意点
Unity中标量与Vector3相乘时,会对向量的X、Y、Z三个分量分别乘该标量,属于对整个向量的全局缩放,调整标量的相乘对象就会改变对应的作用维度,写代码时需要明确你要控制波动的轴向再做运算。
内容的提问来源于stack exchange,提问作者Cameron Shore
相关产品推荐
相关产品推荐

