#c# #unity3d
#c# #unity3d
Вопрос:
Моя сборка страдает от ужасного заикания / задержки при перемещении объектов. На этом форуме мне посоветовали установить для жесткого тела значение «Интерполировать» и использовать LateUpdate в моем скрипте.
Проблема в том…Я не знаю, как? Когда я пытаюсь, я получаю ошибку компилятора или просто не могу переместить cam.
Я нашел другой бесплатный скрипт FPS, который работал, используя camera follow lag, но я тоже не могу понять, как использовать этот код.
Как я могу использовать LateUpdate в моем текущем скрипте?
void Start() {
Cursor.visible = false;
Cursor.lockState = CursorLockMode.Locked;
}
void Update() {
float x = Input.GetAxis("Mouse X") * sensitivity * Time.deltaTime;
float y = Input.GetAxis("Mouse Y") * sensitivity * Time.deltaTime * -1f;
transform.Rotate(0f, x, 0f);
headRotation = y;
headRotation = Mathf.Clamp(headRotation, -headRotationLimit, headRotationLimit);
cam.localEulerAngles = new Vector3(headRotation, 0f, 0f);
}
Комментарии:
1. docs.unity3d.com/ScriptReference/MonoBehaviour . LateUpdate.html
2. Я предполагаю, что вы имеете в виду LateUpdate?
3. Да, сэр, но когда я меняю обновление на LateUpdate, камера по-прежнему не вращается. (без заикания). У меня более 500 кадров в секунду.
4.
Lerp
вращение камеры таким образом сглажено, но вы правы, желая сделать это вLateUpdate
.5. Как это будет выглядеть в коде?
Ответ №1:
Вот отредактированная версия моего метода поворота проигрывателя FPS, используйте это как руководство для того, как это можно сделать, и измените его для своих нужд, включая несколько методов, которые я использую, чтобы ограничить, насколько далеко может поворачиваться камера (игрок может смотреть вверх и вниз)
// Set the Camera in the inspector so that it can be rotated
public Camera camera;
// Rotation variables for both the player and camera
private Quaternion _playerRotation;
private Quaternion _cameraRotation;
// The speed you want to be able to look
private float _lookSpeed = 3f;
// Set the initial rotations to the rotation variables
private void Awake()
{
_playerRotation = transform.localRotation;
_cameraRotation = camera.transform.localRotation;
}
// Method to be called from LateUpdate
private void UpdateRotation()
{
Vector2 input = new Vector2(
Input.GetAxis("Mouse X"),
Input.GetAxis("Mouse Y")
);
if (input != Vector2.zero)
{
_playerRotation *= Quaternion.Euler(0f, _lookSpeed * input.x, 0f);
_cameraRotation *= Quaternion.Euler(_lookSpeed * -input.y, 0f, 0f);
_cameraRotation = ClampRotationAroundXAxis(_cameraRotation, -50f , 75f);
}
transform.localRotation = Quaternion.Slerp(transform.localRotation, _playerRotation, 10f * Time.deltaTime);
camera.transform.localRotation = Quaternion.Slerp(camera.transform.localRotation, _cameraRotation, 10f * Time.deltaTime);
}
// A couple of rotation methods
// I suggest making these extensions for use anywhere in the game and for all rotations
private Quaternion ClampRotationAroundXAxis(Quaternion q, float minX = 0f, float maxX = 0f)
{
if (q.w != 0f)
{
q.x /= q.w;
q.y /= q.w;
q.z /= q.w;
q.w = 1f;
}
q.y = 0f;
q.z = 0f;
if (minX != 0f || maxX != 0f)
{
q = ClampRotationXAxis(q, minX, maxX);
}
return q;
}
private Quaternion ClampRotationXAxis(Quaternion q, float min, float max)
{
if (q.w != 0f)
{
q.x /= q.w;
q.y /= q.w;
q.z /= q.w;
q.w = 1f;
}
float angle = 2f * Mathf.Rad2Deg * Mathf.Atan(q.x);
angle = Mathf.Clamp(angle, min, max);
q.x = Mathf.Tan(0.5f * Mathf.Deg2Rad * angle);
return q;
}
Комментарии:
1. Я получаю ошибку компилятора с вашим скриптом. 63,19 «Quaternion не содержит определения для ClampRotationXAxis и не может быть найден доступный метод расширения ClampRotationXAxis, принимающий первый аргумент типа Quaternion».
2. Извините, я не полностью удалил способ, которым я использовал изменение
ClampRotationXAxis()
расширенияq.ClampRotationXAxis(minX, maxX);
наClampRotationXAxis(q, minX, maxX);
3. Спасибо за ваше время. Скрипт запускается сейчас, но я не могу переместить камеру. Я пробовал подключаться как к самой камере, так и к проигрывателю. Возможно, я что-то упускаю?
4. Эти методы будут использоваться в скрипте, который вы используете для остальных элементов управления проигрывателя на проигрывателе, и добавили ли вы вызов метода rotation в
LateUpdate
?5. Хорошо, я попробую и поиграю с этим. Мои навыки программирования довольно просты. Спасибо.