Unity中获取子物体transform.position返回数值偏小是什么原因?
问题原因排查与解决方案
首先需要先明确Unity坐标的基础规则:Inspector面板中父子结构下的子物体Position字段,默认显示的是子物体相对于父物体的本地坐标transform.localPosition,而你调用的ob.transform.position是子物体的世界坐标。只有满足父物体世界坐标为(0,0,0)、父物体无旋转、父物体全局缩放为(1,1,1)三个条件时,两者数值才会完全相等。
你遇到的数值为预期1/60的问题,可按以下优先级排查:
- 父物体缩放异常
父子变换的计算逻辑为:子物体世界坐标 = 父物体世界坐标 + 父物体旋转 * (父物体全局缩放 * 子物体本地坐标)。如果父物体(或者父物体的上层任意父节点)的localScale被设置为1/60左右的数值,子物体的世界坐标偏移就会对应缩放为本地坐标的1/60,是该问题最常见的诱因。 - 坐标赋值逻辑错误
检查代码中给子物体设置坐标的逻辑,是否误将Time.deltaTime(默认帧率下数值约为1/60)乘入了坐标赋值参数,导致子物体实际localPosition本身就只有预期值的1/60。可直接对比Inspector显示的子物体Position值和你预期的数值,如果两者不一致即可确认是该问题。 - 外部模型导入设置错误
如果父子物体是从外部导入的模型资源,检查模型导入设置面板中的Scale Factor参数是否被设置为1/60,该参数会直接修改模型根节点的默认缩放系数,最终体现为坐标换算的比例偏差。
排查校验方法:父物体未旋转时,打印
ob.transform.localPosition和Inspector显示的子物体Position值对比,如果完全一致,说明你之前混淆了世界坐标position和本地坐标localPosition的区别,直接使用localPosition即可拿到你预期的数值。
内容的提问来源于stack exchange,提问作者Felix
相关产品推荐
相关产品推荐

