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