【问题标题】:How to Set object rotation limits around a pivot in Unity3d C#?如何在 Unity3d C# 中围绕枢轴设置对象旋转限制?
【发布时间】:2020-12-05 00:54:39
【问题描述】:

我正在开发一个曲折游戏,如下所示: [1]:https://i.stack.imgur.com/miKmH.jpg [ZigZagGame][1].

目标是让球沿着路径(之字折线)通过,方法是围绕我放置在之字折线另一端的枢轴旋转路径(上、下、左和右),使用鼠标拖。我想限制路径的方向。这是我要实现的代码:`

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

public class RotationCheminOnDragMouse : MonoBehaviour
{
  float speed = 1.2f;

private void OnMouseDrag()
  {
      float rotx = Input.GetAxis("Mouse X") * speed * Mathf.Deg2Rad;
      float roty = Input.GetAxis("Mouse Y") * speed * Mathf.Deg2Rad;

      Vector3 backAngle = Vector3.back;
      Vector3 leftAngle = Vector3.left;

      transform.RotateAround(backAngle, -rotx);
      transform.RotateAround(leftAngle, roty);

  }

  private void Update()
  {
      if (Input.GetMouseButtonDown(0))
      {
          OnMouseDrag();
      }

  }


}

` 那么我该如何设置这些限制呢?知道我不明白如何在 C# 中管理统一的角度。我希望你能帮我解决这个问题。并提前感谢您的任何回复。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您可能正在使用 Mathf.Clamp,或者 Mathf.Clamp 仅用于此目的,以限制旋转。

    【讨论】:

    • 其实Mathf.Clamp是用来将单个float值钳制在上下界之间...
    • 你的意思是我必须限制例如 backAngle 或 backAngle.x backAngle.y 和 backAngle.z?我曾尝试使用 Mathf.Clamp 但对象不会围绕枢轴旋转。它围绕枢轴平移
    【解决方案2】:

    你应该记录你已经旋转了多少,然后限制新的旋转,例如

    public class RotationCheminOnDragMouse : MonoBehaviour
    {
        float speed = 1.2f;
    
        [SerializeField] float minY = -45;
        [SerializeField] float maxY = 45;
        [SerializeField] float minX = -45;
        [SerializeField] float maxX = 45;
    
        private Vector2 alreadyRotated;
    
        private void OnMouseDrag()
        {
            var rotx = Input.GetAxis("Mouse X") * speed * Mathf.Deg2Rad;
            var roty = Input.GetAxis("Mouse Y") * speed * Mathf.Deg2Rad;
    
            // Now here you limit how much you can rotate
            if(rotX < 0)
            {
                rotx = Mathf.Max(rotx, minX - alreadyRotated.x));
            }
            else if(rotX > 0)
            {
                rotx = Maths.Min(rotx, maxX - alreadyRotated.x));
            }
    
            if(rotY < 0)
            {
                roty = Mathf.Max(roty, minY - alreadyRotated.y));
            }
            else if(rotY > 0)
            {
                roty = Maths.Min(roty, maxY - alreadyRotated.y));
            }
    
            transform.RotateAround(Vector3.forward, rotx);
            transform.RotateAround(Vector3.left, roty);
    
            alreadyRotated += new Vector2 (rotX, rotY);
        }
    
        private void Update()
        {
            if (Input.GetMouseButtonDown(0))
            {
                OnMouseDrag();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-10
      • 2018-08-03
      相关资源
      最近更新 更多