Гладкая точная камера Unity, движущаяся с инерцией
Я пытаюсь написать скрипт камеры, но он работает не так, как задумано.
void LateUpdate(){
if (Input.GetMouseButtonDown(0)
{
_lastPosition = Input.mousePosition;
}
if (Input.GetMouseButton(0))
{
var delta = _lastPosition - Input.mousePosition;
var deltaxz = new Vector3(delta.x, 0f, delta.y);
transform.Translate(deltaxz * Time.deltaTime, Space.World);
_lastPosition = Input.mousePosition;
}
}
Я написал этот код для перемещения камеры, но мышь странно двигает камеру. Если я перемещаю мышь слишком быстро, она движется быстро. Если медленно, камера движется медленнее, чем мышь.
я думаю что ScreenToWorldPoint
может помочь, но камера в стиле RTS, я хочу переместить ее, как будто я двигаю землю "перетащить" \
2 ответа
Вы должны попробовать использовать Vector3.Lerp(_lastPosition, deltaxz, someValue * Time.deltaTime)
Это то, что я использую, чтобы сделать движения более плавными, и это довольно хорошо, просто отрегулируйте некоторое значение в зависимости от того, какую скорость вы хотите
Это из-за deltaTime (это всегда около 0.01f-0.02f = плохая точность на большом количестве итераций). Вы можете использовать обходной путь Lerp для плавного перемещения, как Jichael, но с небольшими изменениями (он работает с transform.positon напрямую), полный код:
//new:
public float Sensitivity;
private Vector3 _lastPosition;
private void LateUpdate()
{
if (Input.GetMouseButtonDown(0))
{
_lastPosition = Input.mousePosition;
}
if (Input.GetMouseButton(0))
{
var delta = (_lastPosition - Input.mousePosition);
var deltaxz = new Vector3(delta.x, 0f, delta.y);
//new:
transform.position = Vector3.Lerp(transform.position, transform.position + deltaxz, Sensitivity * Time.deltaTime);
_lastPosition = Input.mousePosition;
}
}
PS почему вы используете LateUpdate?