繁体   English   中英

如何在 Unity3d ZD7EFA19FBE7D3972FD5ADB6024223D74?

[英]How to Set object rotation limits around a pivot in Unity3d C#?

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

目标是让球沿着路径 (ZigZag) 传递,通过围绕 pivot 旋转路径(上、下、左和右),我使用鼠标拖动将 pivot 放在 ZigZag 的另一端。 我想限制路径的方向。 这是我要实现的代码:`

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 # 中的统一角度。 我希望你能帮我解决这个问题。 并提前感谢您的任何回复。

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

您应该跟踪您已经旋转了多少,然后限制新的旋转,例如

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM