团结.在本地空间实例化对象



这应该很简单!

我试图在我的角色上实例化一个粒子效果,我需要它在角色局部空间的Z轴上为+1。也就是说,字符前面总是+1。

这是我当前的代码:

public void PlayEffect()
{
Instantiate(slashEffect, wielder.transform.position + new Vector3 (0, 1, 1), wielder.transform.rotation) ;
}

目前这导致它总是在世界空间中生成z+1,这意味着有时它在我的角色前面,有时在我后面,这取决于我面对的方向。

正确的做法是什么?:)

您可以使用Transform.TransformPoint

将位置从局部空间转换到世界空间。

像如。

public void PlayEffect()
{
Instantiate(slashEffect, wielder.transform.TransformPoint(new Vector3 (0, 1, 1)), wielder.transform.rotation) ;
}

这将0, 1, 1作为wielder的局部空间中的向量,这意味着,如果你要创建一个子对象并将其设置为其局部位置,这就是你的对象将在世界空间中生成的位置。

注意,这也考虑了wielder的缩放!

如果您不想考虑缩放,不如使用Quaternion操作符*,如

public void PlayEffect()
{
Instantiate(slashEffect, wielder.transform.position + wielder.transform.rotation * new Vector3(0, 1, 1), wielder.transform.rotation) ;
}

它的作用是使用世界空间偏移向量0, 1, 1,然后根据wielder在世界空间中的旋转旋转该向量,而不改变其大小。

我们可以试试:

public void PlayEffect()
{
Instantiate(slashEffect, wielder.transform.localPosition + new Vector3 (0, 1, 1), wielder.transform.rotation) ;
}

变换。localPosition获取游戏对象的本地位置。

最新更新