【问题标题】:How can rotate using the mouse empty GameObject or Cube and it's childs all together?如何使用鼠标旋转空 GameObject 或 Cube 和它的孩子一起?
【发布时间】:2016-11-21 20:31:23
【问题描述】:

在层次结构中,我有一个 Cube,我将其重命名为 Unit。 作为孩子,我有一个空的游戏对象,将其重命名为电梯。 然后作为电梯的孩子,我有一个立方体将其重命名为平台,作为平台的孩子,我有另一个立方体将其重命名为 OnTop Detector。

然后作为电梯的孩子,我还有一个 Platform1(立方体)和一个按钮(胶囊)。

这是显示它的屏幕截图:

现在我想在原版中做的一般是使用我的脚本来旋转电梯和所有它的孩子和孩子的孩子使用鼠标。

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

问题是在电梯上我有一个动画组件,里面有两个动画剪辑。并且动画会覆盖旋转。

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

我还希望 Unity(Cube) 不会被看到并且不会发生碰撞,如果我在上面移动玩家,它不会像它不存在一样,但我希望能够使用它来旋转所有子对象。

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

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

这是我的脚本:

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 的子项后,它们不会像第一个屏幕截图中那样缩放:

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

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

    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);
        }
    }
    

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

    【讨论】:

    • 好的,它似乎可以正常工作,但存在一些问题:首先要使其正常工作,我将 Platform1 和 Button 移动为 Platform 的子级。然后我将脚本附加到平台。现在我有两个问题: 1. 当我将 Platform1 和 Button 移动为 Platform 的子级时,它们没有像以前那样在场景中缩放。 2.如果我用鼠标旋转按钮或平台1,我怎么能做到这一点,它也会旋转它们?
    • 我在我的问题中添加了另一个屏幕截图,显示了它现在的样子这是我关于缩放的第一个问题。所以总的来说,为所有孩子循环的想法是可行的,但如果我想用鼠标从 Button 或 Platform1 而不仅仅是从 Platform 旋转它怎么办?
    • 尝试将foreach更改为foreach(var child in transform),然后在对孩子进行任何操作之前,使用if(child is Button),然后将其作为按钮进行操作,将其用作Button(child),然后使用@987654325 @ 将其转换为 (transform)child
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多