这应该很简单!
我试图在我的角色上实例化一个粒子效果,我需要它在角色局部空间的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获取游戏对象的本地位置。