【问题标题】:Unity. Instantiate object in Local Space统一。在局部空间中实例化对象
【发布时间】:2021-11-12 07:38:07
【问题描述】:

这应该很简单!

我正在尝试在我的角色上实例化粒子效果,我需要它在角色本地空间的 Z 轴上为 +1。也就是说,它总是在角色前面+1。

这是我当前的代码:

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

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

这样做的正确方法是什么? :)

【问题讨论】:

    标签: c# unity3d coordinates


    【解决方案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 operator * 之类的

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

    这样做是使用世界空间偏移矢量0, 1, 1,然后根据世界空间中的wielder 旋转旋转该矢量而不改变其大小。

    【讨论】:

      【解决方案2】:

      我们的你可以试试:

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

      因为 transform.localPosition 获取该游戏对象的本地位置。

      【讨论】:

      • 那不符合要求。这使用本地位置(在父对象空间中),就像它是世界位置一样,然后将世界增量向量(0,1,1)添加到已经错误的位置......;)OP想要在相对于持有者对象的世界空间,考虑到它的方向
      • @derHugo 嗯...我当时想错了...谢谢伙计
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多