Unity中transform.position为何返回预制件本地位置而非场景位置?
问题:获取门的场景世界位置失败,返回预制件本地位置
遍历房间子物体时,doorTransform.position返回的是门在房间预制件内的本地位置,而非其在场景中的世界位置,不符合需求。
原代码
foreach (var room in rooms) { foreach (Transform child in room.transform) { if (child.gameObject.layer == LayerMask.NameToLayer("Door")) { // 将子物体添加到列表 Transform doorTransform = child.transform; GameObject door = child.gameObject; Doors.Add(door); DoorsPos.Add(new Vector2(doorTransform.position.x, doorTransform.position.z)); Debug.Log($"门位置: {doorTransform.position}"); } } }
已尝试的修改
foreach (var room in rooms) { foreach (Transform child in room.transform) { if (child.gameObject.layer == LayerMask.NameToLayer("Door")) { // 将子物体添加到列表 Transform doorTransform = child.transform; GameObject door = child.gameObject; Vector3 DoorPos = room.transform.TransformPoint(doorTransform.localPosition); Doors.Add(door); DoorsPos.Add(new Vector2(DoorPos.x, DoorPos.z)); Debug.Log($"门位置: {DoorPos}"); } } }
解决方案及说明
核心问题排查
Transform.position本身就是GameObject在场景中的世界空间位置,出现返回预制件本地位置的情况,大概率是因为rooms列表中的对象不是场景内已实例化的房间GameObject,而是预制件资源文件(预制件资源的transform属性仅对应预制件内部的本地坐标系)。
修正代码
如果rooms是场景中已实例化的房间对象列表,直接使用child.position即可获取正确世界位置,简化代码如下:
foreach (var room in rooms) { foreach (Transform child in room.transform) { if (child.gameObject.layer == LayerMask.NameToLayer("Door")) { Doors.Add(child.gameObject); Vector3 worldDoorPos = child.position; DoorsPos.Add(new Vector2(worldDoorPos.x, worldDoorPos.z)); Debug.Log($"门的世界位置: {worldDoorPos}"); } } }
额外注意事项
- 若
rooms确实是预制件资源:必须先将预制件实例化到场景中(比如用Instantiate(room)),再从实例化后的对象中获取门的位置。 - 检查门的GameObject是否处于激活状态(未激活对象仍能获取position,但父级未激活时可能出现异常)。
- 多层嵌套父物体不影响
position的世界位置获取,无需额外转换。
内容的提问来源于stack exchange,提问作者JustARandomOnInternet
相关产品推荐
相关产品推荐

