【问题标题】:Rotate positions of three game object when clicking a UI button单击 UI 按钮时旋转三个游戏对象的位置
【发布时间】:2021-03-02 14:40:20
【问题描述】:

正如标题所说,我有一个包含三个对象的场景,一个立方体、一个球体和一个圆柱体,如下图所示。

我想要实现的是,当我按下“旋转”按钮时,三个对象以逆时针方向旋转,因此圆柱体移动到立方体所在的位置,立方体移动到球体所在的位置,并且球体去圆柱体所在的地方。如果我再次单击该按钮,它们会再次旋转,依此类推。到目前为止,我设法让它们围绕它们以初始位置形成的“三角形”中心的一个空对象旋转。

这是我第一次单击“旋转”按钮时发生的情况:

如您所见,对象会旋转,但它们与之前处于该位置的对象的坐标不同,因此我正在考虑让它们交换坐标。我怎样才能做到这一点或让它们按我的意愿旋转?

这是我目前写的代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class RotateObject : MonoBehaviour {

    //rotating objects
    [SerializeField]
    private GameObject cube;

    [SerializeField]
    private GameObject sphere;

    [SerializeField]
    private GameObject cylinder;

    private Renderer cubeRenderer;
    private Renderer sphereRenderer;
    private Renderer cylinderRenderer;

    //rotation target
    public GameObject target;

    private void Start() {

        cubeRenderer = cube.GetComponent<Renderer>();
        sphereRenderer = sphere.GetComponent<Renderer>();
        cylinderRenderer = cylinder.GetComponent<Renderer>();
        gameObject.GetComponent<Button>().onClick.AddListener(Rotate);
    }

    void Rotate() {

        //rotate objects by 120 degrees
        cube.transform.RotateAround(target.transform.position, Vector3.up, -120);
        sphere.transform.RotateAround(target.transform.position, Vector3.up, -120);
        cylinder.transform.RotateAround(target.transform.position, Vector3.up, -120);
    }

}

提前感谢您帮助我!

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    使对象围绕一个点旋转的最简单方法是将它/它们作为该点的子级,然后旋转该点本身。

    Object Hierarchy

    要放在父对象上的Rotator脚本:

    public class RotateObjects : MonoBehaviour
    {
        [SerializeField] Button rotateButton;
    
        // Start is called before the first frame update
        void Start()
        {
            rotateButton.onClick.RemoveAllListeners();
            rotateButton.onClick.AddListener(RotateClockwise);
        }
    
        void RotateClockwise()
        {
            float newRotation = (360 / transform.childCount);
            transform.Rotate(new Vector3(0, newRotation, 0));
        }
    }
    

    【讨论】:

    • 感谢您的回答,我试过了,但它确实与我的脚本完全相同,只是它沿顺时针方向移动,我想要实现的是三个对象必须“交换坐标”基本上与它们旁边的对象以逆时针方向。通过旋转它们我没有实现这一点,因为它们稍微放错了位置:我认为这个问题可能需要一个“几何”解决方案,因为这三个对象不能构成一个完美的三角形。
    • 是的,对不起,它确实是顺时针方向,逆时针方向设置 newRotation 为负,当你做 transform.Rotate 时。我还应该注意到,需要设置父对象的初始旋转,以便您的对象之一处于您希望它所在的位置。这确实需要您手动将子对象放置在父对象周围的正确间距中,但是因为它会根据孩子的数量计算 newRotation,您可以增加或减少对象的数量,而无需更改脚本。
    • 别担心,我确实成功了,问题是它们旋转的空不在它们形成的三角形的中心,再次感谢您的帮助!跨度>
    【解决方案2】:

    您正在围绕一个对象旋转。就像地球绕着太阳转一样;这意味着它将改变它的位置。使用

    transform.rotation = new Quaternion(rotx, roty, rotz, rotw);
    

    transform.Rotate(rotx, roty, rotz);
    

    形状不是围绕一个点旋转,而是自转。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多