根据父位置实例化子对象

问题描述 投票:0回答:2

我有一个游戏对象 ABC,我将在其确切位置生成另一个游戏对象(占位符)作为其子对象。

public new GameObject gameObject; 
public GameObject placeholder;

void Start()
{
        Instantiate(placeholder, new Vector3(0, 0, 0), Quaternion.Euler(0, 0, 0), gameObject.transform);
}

代码应该在 ABC 位置的 (0,0,0) 处生成占位符,没有旋转。对吧?

但我得到的恰恰相反,ABC 位于 -30、-15、0,而占位符位置为 30、15、0。

我做错了什么吗?请告知,在此先感谢。

有什么我从代码中弄错的概念吗?

c# unity3d
2个回答
1
投票

你传递给实例化的位置是一个世界位置,所以他们把你的对象放在 v3.zero 上,你在实例化后看到的位置是相对于父级的值

只需使用父位置而不是零来实例化,这将是相对于父位置的零


0
投票

代码应该在 ABC 位置的 (0,0,0) 处生成占位符,没有旋转。对吧?

错了,根据文件.

如果指定位置和旋转,它们将用作对象在世界空间中的位置和旋转。

因此占位符将在世界位置 (0,0,0) 生成,不幸的是没有好的方法来实现这一点,您可以先生成占位符,然后更改它的父级。

var ph = Instantiate(placeholder, new Vector3(0, 0, 0), Quaternion.Euler(0, 0, 0));
ph.transform.SetParent(gameObject.transform, worldPositionStays: false);

另一种方法是使用父母的世界位置和旋转。

var parent = gameObject.transform;
Instantiate(placeholder, parent.position, parent.rotation, parent);
© www.soinside.com 2019 - 2024. All rights reserved.