You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 07:31:09