unity3d 基于父位置示例化子

txu3uszq  于 2023-03-30  发布在  其他
关注(0)|答案(2)|浏览(148)

我有一个游戏对象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。
我做错了什么吗?请好心建议,提前感谢。
有没有可能我的代码出错了?

xdnvmnnf

xdnvmnnf1#

你传递给示例化的位置是一个世界位置,所以他们把你的对象放在www.example.com上v3.zero,你在示例化后看到的位置是相对于parent的值。
只使用父位置而不是零进行示例化,这将是相对于父位置的零

jjhzyzn0

jjhzyzn02#

代码应该在ABC位置的(0,0,0)处生成占位符,没有旋转,对吗?
这是错误的,根据document
如果指定了位置和旋转,则它们将用作对象在世界空间中的位置和旋转。
因此占位符将在世界位置(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);

相关问题