如何在Unity3D中夹紧相机

时间:2016-10-03 07:35:42

标签: c# unity3d

我的代码不能正常工作,我正在试图夹住相机,但它无法正常工作。如何夹紧相机?

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

3 个答案:

答案 0 :(得分:2)

旋转后,您忘记从变换中获取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);
}

答案 1 :(得分: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查看变量值以找出您犯错误的位置。
如果你不能这样理清楚,那么你就会清楚地知道你究竟不能做什么,并且可以发布一个更清晰的问题并期待一个干净的答案。

希望这有帮助!

答案 2 :(得分:0)

好的,我修好了。这是完整的代码。

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