首页 > 解决方案 > 如何复制父对象的旋转保持自旋转,因为它在unity3d中

问题描述

我正在尝试在 3d 平面内实例化一个 3d 平面游戏对象,但是父 3d 平面的旋转可以是任何东西,子平面应该与父 3d 平面完全平行,但它也应该保持自己的旋转。

我尝试了以下脚本,但它不起作用

child.rotation = child.rotation * parent.rotation;

在这里,我有一个子平面游戏对象名称为 B(旋转:-90、0、0),我正在制作另一个更大的平面游戏对象(旋转:任何东西)作为其父级。但是子平面有时会平行于其父平面,有时当父平面处于某个不同的角度/旋转时则不会。

说明:在下面的屏幕截图中,我在编辑器中手动设置了子平面旋转,只需将所需角度旋转 90/180 度,当将该对象从世界拖动到子对象(本地)时,比例会自动调整。

我尝试了下面的代码片段来实现需要,但没有奏效。

var chile = Instantiate(Resources.Load<GameObject>(prefabsPath), parent);
var t = child.transform;
t.position = pos;
t.rotation = parent.rotation;

我也试过

t.forward = parent.forward;

还有这个

child.SetParent(parent); // wasn't passing parent in Instantiate

以上一个在相应的缩放方面工作得很好,但我仍然无法修复旋转。

在此处输入图像描述

@derHego 回答,子平面像下面这样被拉伸,我尝试将子平面附加到不同大小的父平面上,我发现它根据父级比例被拉伸,如果父级的 y 大于 x,那么子级的 y 也变得大于它的 x 与父级中的比率相同。我该如何解决?

在此处输入图像描述

标签: c#unity3d

解决方案


我假设您希望两个平面都面对例如它们的局部Y轴在同一方向上,而它们仍然可能围绕该面法线相互旋转。

根据您的飞机所面对的方向,您可以使用例如

child.up = parent.up;

Y在这种情况下,为了使两个平面平行(=指向同一个方向),我假设您的默认平面平放在地板上,因此它朝上


例如

public class Example : MonoBehaviour
{
    public Transform child;

    private void Start()
    {
        child.up = transform.up;
    }
}

在此处输入图像描述

(绿色平面为父级,白色平面为子级)


更新后看起来实际上你可以简单地做

var child = Instantiate(prefab);

child.rotation = parent.rotation;

var scale = child.lossyScale;
child.SetParent(parent);

var invertParentScale = new Vector3(1 / parent.lossyScale.x, 1 / parent.lossyScale.y, 1 / parent.lossyScale.z)
child.localScale = Vector3.Scale(scale, invertParentScale);

推荐阅读