如何理解Unity中this.transform.position = target.TransformPoint(_camOffset)代码?
核心原理澄清
1. TransformPoint的本质作用
Transform.TransformPoint的核心功能是将相对于当前Transform自身坐标系的局部坐标点,转换为世界坐标系下的坐标点,它的完整计算逻辑包含三步,和Transform是否有父物体没有直接关联:
- 对传入的偏移向量按Transform的局部缩放系数做缩放
- 对缩放后的向量应用Transform的旋转属性,得到世界坐标系下的偏移方向
- 最后叠加Transform的世界坐标位置,输出最终的世界坐标点
2. 「target无父物体」不代表可以省略TransformPoint
target没有父物体只会让它自身的localPosition和position(世界坐标)数值相等,但完全不影响TransformPoint的必要性:
- 只要target存在旋转、非(1,1,1)的缩放,
target.TransformPoint(_camOffset)的结果就和target.position + _camOffset完全不同 - 举个实际示例:target无父物体,世界坐标为(0,0,0),Y轴旋转90度,缩放为(1,1,1),传入偏移为(0,0,-10)
- 直接赋值
transform.position = target.position + _camOffset得到的结果是(0,0,-10)(对应世界坐标系Z轴负方向) - 用
target.TransformPoint(_camOffset)得到的结果是(-10,0,0)(对应target自身坐标系Z轴负方向,因旋转对应世界X轴负方向)
- 直接赋值
3. 你的代码逻辑说明
你当前的摄像机跟随代码使用TransformPoint是完全正确的,这个写法实现的效果是:摄像机永远保持在角色自身坐标系的指定偏移位置,不管角色怎么旋转、移动,摄像机都会始终处于角色的后上方,配合LookAt实现符合直觉的第三人称跟随效果。
如果你改成直接transform.position = target.position + _camOffset,偏移会固定为世界坐标系方向,角色转向后摄像机就会偏移到角色侧面甚至正面,失去跟随效果。
内容的提问来源于stack exchange,提问作者Boyce Chen
相关产品推荐
相关产品推荐

