如何在Unity3D中夹紧相机

本文关键字:相机 Unity3D | 更新日期: 2023-09-27 18:11:25

我的代码不工作,我正试图夹紧相机,但它不工作。如何夹紧相机?

using UnityEngine;
using System.Collections;
public class MoveCamera : MonoBehaviour 
{
    public float sensitivity = 4.0f;        
    private Vector3 mouseOrigin;
    private bool isRotating;
    private float speed = 2.0f;
    private float minX = -45.0f;
    private float maxX = 45.0f;
    private float minY = -10.0f;
    private float maxY = 10.0f;
    float rotationY = 0.0f;
    float rotationX = 0.0f;
    void Update () 
    {
            if (Input.GetMouseButtonDown (0)) {
                mouseOrigin = Input.mousePosition;
                isRotating = true;
            }
            if (!Input.GetMouseButton (0))
                isRotating = false;
            if (isRotating) {
                Vector3 pos = Camera.main.ScreenToViewportPoint (Input.mousePosition - mouseOrigin);
                transform.RotateAround (transform.position, transform.right, -pos.y * sensitivity);
                transform.RotateAround (transform.position, Vector3.up, pos.x * sensitivity);
                rotationY = Mathf.Clamp (rotationY, minY, maxY);
                rotationX = Mathf.Clamp (rotationX, minX, maxX);
                transform.localEulerAngles = new Vector3 (-rotationY, rotationX, 0);
            }
    }
}

如何在Unity3D中夹紧相机

您忘记在旋转后从变换中获取rotationX和rotationY的值。试试这个:

if (isRotating) {
    Vector3 pos = Camera.main.ScreenToViewportPoint (Input.mousePosition - mouseOrigin);
    transform.RotateAround (transform.position, transform.right, -pos.y * sensitivity);
    transform.RotateAround (transform.position, Vector3.up, pos.x * sensitivity);
    rotationY = Mathf.Clamp (transform.localEulerAngles.y, minY, maxY);
    rotationX = Mathf.Clamp (transform.localEulerAngles.x, minX, maxX);
    transform.localEulerAngles = new Vector3 (-rotationY, rotationX, 0);
}

Mathf.Clamp

public static float Clamp(float value, float min, float max) {
    if (value < min) {
        value = min;
    } else if (value > max) {
        value = max;
    }
    return value;
}
的代码

如果你不确定一个调用在。net (Unity/Mono/etc)中是如何工作的,可以使用IL反向工具,如(EXTERNAL LINK)ILSPY。
根据你发布的代码和理解Mathf.Clamp应该按预期工作,问题很可能在你的代码中,至少在一个点上,例如:


rotationY = Mathf.Clamp (rotationX, minY, maxY); //note it's rotation "X" instead of "Y"
rotationX = Mathf.Clamp (rotationX, minX, maxX);

如果这仍然没有解决问题,使用Debug.Log来查看变量值,以找到您犯错误的地方。
如果你不能这样整理,你会清楚地知道你到底不能做什么,然后可以发布一个更清晰的问题,并期望得到一个清晰的答案。

希望这对你有帮助!

好的,所以我修复了它。这里是完整的代码。

using UnityEngine;
using System.Collections;
public class MoveCamera : MonoBehaviour 
{
    public float sensitivity = 4.0f;        
    private Vector3 mouseOrigin;
    private bool isRotating;
    public GameObject cam;
    void Start()
    {
    }
    protected float ClampAngle(float angle, float min, float max) {
        angle = NormalizeAngle(angle);
        if (angle > 180) {
            angle -= 360;
        } else if (angle < -180) {
            angle += 360;
        }
        min = NormalizeAngle(min);
        if (min > 180) {
            min -= 360;
        } else if (min < -180) {
            min += 360;
        }
        max = NormalizeAngle(max);
        if (max > 180) {
            max -= 360;
        } else if (max < -180) {
            max += 360;
        }
        return Mathf.Clamp(angle, min, max);
    }
    protected float NormalizeAngle(float angle) {
        while (angle > 360)
            angle -= 360;
        while (angle < 0)
            angle += 360;
        return angle;
    }

    void Update () 
    {
        if (Input.GetMouseButtonDown (0)) {
            mouseOrigin = Input.mousePosition;
            isRotating = true;
        }
        if (!Input.GetMouseButton (0))
            isRotating = false;
        if (isRotating) {
            cam.transform.localEulerAngles = new Vector3(0, ClampAngle(cam.transform.localEulerAngles.y, -45, 45), 0);
            Vector3 pos = Camera.main.ScreenToViewportPoint (Input.mousePosition - mouseOrigin);
            transform.RotateAround (transform.position, transform.right, -pos.y * sensitivity);
            transform.RotateAround (transform.position, Vector3.up, pos.x * sensitivity);
        }
    }
}