【问题标题】:Unity2D - transform.position is not equal to the real world positionUnity2D - transform.position 不等于真实世界的位置
【发布时间】:2019-01-05 04:23:52
【问题描述】:

好的,标题可能会让人困惑,因为我不知道怎么写。

我的情况:我有一个带有 4 个子对象的 2d 精灵,每个子对象都围绕着精灵作为周长。所以它看起来像这样:

Spawner2 有一个脚本,其方法如下,在游戏开始时调用。在脚本中,我实例化了一个新的预制件:

public void GenerateBox(int count)
{
    ...
    GameObject spawnedRoom = Instantiate(possibleRooms[chosen], transform.position, Quaterion.identity);
}

但这会在 Spawner1 的位置实例化对象。

所以我尝试调试。我将 Spawner2 从其父级中拉出并查看位置(即 X:1.0062,Y:-0.0038)。我把它放回 2d sprite 中,当我 debug.log 它的位置时,它给了我 X: 0, Y: 1, Z: -9.8。

是因为我的预制吗?有什么问题,我该如何解决?

【问题讨论】:

  • 如果你改用 transform.localPosition 会发生什么?
  • @CareyOn 如果我使用 transform.localPosition,它会在 X 轴上将对象实例化几个单位
  • 如果 Spawner2 的本地位置 Y=1,您的轴心点可能不在 spawnedRoom 的中心,这就是为什么它似乎在错误的位置生成(y 轴上 1 个单位太高) .
  • @Marc2001 Instantiate(..., transform.position, ...); 在代码运行的生成器位置生成了游戏对象。您想在其中一个生成器上生成游戏对象吗?
  • @EhsanMohammadi 我希望它在 Spawner2 生成。

标签: unity3d position parent-child instantiation


【解决方案1】:

改用这个重载方法:

Instantiate(Object original, Vector3 position, Quaternion rotation, Transform parent);

并将 Spawner2 父变换作为最后一个参数传递。现在新对象应该与 Spawner2 放置在同一位置。最后你的函数应该是这样的:

public void GenerateBox(int count)
{
    ...
    GameObject spawnedRoom = Instantiate(possibleRooms[chosen], transform.position, Quaterion.identity, transform.parent);
}

【讨论】:

    【解决方案2】:

    编辑:我开始了一个新项目并做了完全相同的事情,除了现在,预制位置在所有轴上设置为 0。现在一切正常。我猜这是因为预制件的位置。例如,您在 (0, 0, 0) 世界位置处实例化脚本中的预制件,并且预制件位置为 (2, 1, 0),那么预制件将在 (2, 1, 0) 世界位置处生成。这是位置+预制位置

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多