如何使用鼠标空GameObject或Cube及其所有孩子一起旋转?

时间:2016-11-21 11:15:45

标签: c# unity3d

在Hierarchy中我有一个Cube,我将它重命名为Unit。 作为孩子,我有一个空GameObject将其重命名为Elevator。 然后作为电梯的孩子,我有一个立方体重命名为平台和平台的孩子我有另一个立方体重命名为OnTop探测器。

然后作为Elevator的孩子,我还有一个Platform1(立方体)和一个Button(Capsule)。

这是显示它的屏幕截图:

Screenshot

现在我原本想要做的就是使用我的脚本使用鼠标旋转Elevator以及所有孩子和孩子的孩子。

如果我将脚本附加到Elevator的每个和任何子节点,我可以旋转这个特定的对象没问题。但我想将它们全部旋转为一个单元,我想旋转电梯。

问题是在Elevator上我有动画组件,里面有两个动画片段。动画会覆盖旋转。

所以我试图做的是添加另一个名为Unit的Cube,并将脚本附加到它,这样我就可以全部旋转。现在的问题是场景中的对象不像以前那样缩放。

我还想知道Unity(立方体)不会被看到而且不会发生碰撞,如果我移动播放器就不存在但是我希望能够用它来旋转所有的子对象。

这是我添加单位(立方体)之前的样子:

Screenshot1

但是一旦我拖动电梯并使其成为单位的孩子,整个场景就会像第一个截图中那样混乱。

这是我的剧本:

using UnityEngine;
using System.Collections;

public class ObjectRotate : MonoBehaviour {

    public float multiplier = 10f;

    void OnMouseDrag()
    {
        transform.Rotate(Input.GetAxis("Mouse Y") * multiplier, -Input.GetAxis("Mouse X") * multiplier, 0, Space.World);
    }
}

脚本可以正常旋转每个单独的对象,但可以将它们全部旋转为一个单元。

更新

将Button和Platform1移动为Platform的子项之后,就像在第一个屏幕截图中一样,它们不像以前一样缩放:

Screenshot2

1 个答案:

答案 0 :(得分:0)

您需要使用循环找到每个孩子的孩子

void OnMouseDrag()
{
    RotateChildren(transform);
    transform.Rotate(Input.GetAxis("Mouse Y") * multiplier, -Input.GetAxis("Mouse X") * multiplier, 0, Space.World);
}

private void RotateChildren(Transform transform)
{
    foreach(Transform child in transform)
    {
        if(child.childCount > 0)
        {
            RotateChildren(child);
        }
        transform.Rotate(Input.GetAxis("Mouse Y") * multiplier, -Input.GetAxis("Mouse X") * multiplier, 0, Space.World);
    }
}

在此给定示例中,如果给定子对象中有更多子项,则该方法会调用自身。