Как закрепить камеру в Unity3D

#c# #unity3d

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

Ответ №1:

Вы забыли получить значение 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. Когда вы говорите «Это не работает», попробуйте объяснить, что не работает 😉

2. Он привязался к одной позиции и застрял. Даже не вращается ни одна точка.

3. После отладки — отладка. Log (rotationX); Он выдает 3 вывода 0 0.006 45

Ответ №2:

Вот код 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;
}  

Используйте инструмент обратного IL, такой как (ВНЕШНЯЯ ССЫЛКА) ILSPY, если вы не уверены, как работает вызов в .NET (Unity / Mono / etc).

Исходя из опубликованного вами кода, и понимание Mathf.Clamp должно работать так, как задумано, проблема, скорее всего, заложена в вашем коде, по крайней мере, в какой-то момент, например, здесь:

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

Если это все еще не решило проблему, используйте Debug.Log для просмотра значений переменных, чтобы найти, где вы допустили ошибку (ошибки).
Если вы не можете разобраться таким образом, у вас будет четкое представление о том, что именно вы не можете сделать, и вы можете опубликовать гораздо более чистый вопрос и ожидать четкого ответа.

Надеюсь, это поможет!

Комментарии:

1. Я не хочу использовать внешние инструменты, кстати, я исправил код, его «Y» вместо «X». Спасибо за быстрый ответ. 🙂

2. Внешний инструмент, о котором я говорю, действительно является внешним. Это вообще не влияет на Unity… И снова, если исправления, которое я опубликовал, все еще недостаточно, используйте Debug . Войдите в свой код, чтобы увидеть, что вы на самом деле делаете, а не то, что вы хотите. Как, опять же, Mathf. Clamp работает по назначению — даже в вашем коде…

Ответ №3:

Хорошо, я это исправил. Вот полный код.

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