Доброго времени суток, друзья.
Я тут пытаюсь TD игру написать (Unity), и сейчас вот делаю камеру.
Собственно камера закреплена и движется только вдоль оси Х.
Движется нормально, но я тут пытался добавить ей инертности, что-то как-то не получилось.
Пытался сделать двумя способами:
1. Смотреть на сколько сдвинулась камера за последний кадр ("расстояние" между апдейтами) и присваивать это значение скорости.
Не получилось, было ощущение что играешь в боулинг. То есть чтобы камера нормально скользила надо резко дёрнуть её в конце )))
2. Смотреть время и точку касания, время и точку отпускания, и скорости присваивать значение (точка отпускания - точка касания) / (время)
По идее должно было получиться, но получилась странная фигня.
Ниже прикладываю текущий скрипт, отвечающий за поведение камеры. Там есть всё, кроме присваивания значение скорости (переменная velocity).
using UnityEngine; using System.Collections; public class view_drag : MonoBehaviour { Vector3 hit_position = Vector3.zero; Vector3 current_position = Vector3.zero; Vector3 camera_position = Vector3.zero; float z = 0.0f; bool on_inertion = false; float velocity = 0.0f; float inert_time = 0.0f; float max_inert_time = 1.5f; void Start () { } void Update ( ) { if ( Input.GetMouseButtonDown ( 0)) { hit_position = Input.mousePosition; camera_position = transform.position; } if ( Input.GetMouseButton ( 0)) { current_position = Input.mousePosition; LeftMouseDrag ( ); } if ( Input.GetMouseButtonUp ( 0)) { on_inertion = true; } if ( on_inertion) { if ( inert_time < max_inert_time) { transform.position += new Vector3 ( velocity, 0, 0); inert_time += Time.deltaTime; velocity = Mathf.Lerp ( velocity, 0, inert_time / max_inert_time); } else { inert_time = 0; on_inertion = false; } } } void LeftMouseDrag( ) { current_position.z = hit_position.z = camera_position.y; Vector3 direction = Camera.main.ScreenToWorldPoint( current_position) - Camera.main.ScreenToWorldPoint( hit_position); direction = direction * -1; transform.position += new Vector3 ( direction.x, 0, 0); hit_position = current_position; } }
Заранее всем спасибо.
Господи, как же давно я не был на геймдеве...ощущение как будто вернулся домой после долгих скитаний =)
KaronatoR
> Собственно камера закреплена и движется только вдоль оси Х.
> Движется нормально, но я тут пытался добавить ей инертности, что-то как-то не
> получилось.
в код особо не смотрел, но попробуй оперировать не скоростью, а ускорением, при этом чтобы камера не разбалтывалась слишком сильно ввести ограничения.
Aroch
> в код особо не смотрел, но попробуй оперировать не скоростью, а ускорением,
самый правильный способ.
Mephistopheles
Aroch
Братцы а чуть подробнее можно?
Как ускорение влияет на скорость понятно (лол), но вот чем определяется ускорение?
KaronatoR
> но вот чем определяется ускорение?
не ожидал такого вопроса)
http://ru.wikipedia.org/wiki/Ускорение
Переусложняете, товарищи. Я использую такой вариант:
1. Инпут пользователя управляет не самой камерой, а пустым вспомогательным объектом.
2. Камера висит на сцене сама по себе, но к ней прикручен подобный скрипт (написал в блокноте, надеюсь, что скомпилируется):
using UnityEngine; public class SmoothFollow: MonoBehaviour { public Transform target; public float smoothTime = .1f; private Vector3 currentVelocity; private void Update() { transform.position = Vector3.SmoothDamp( transform.position, target.position, ref currentVelocity, smoothTime); } }
Если камере в поле target указать этот вспомогательный объект, она начнёт ездить вместе с ним, но с плавными ускорениями и замедлениями. Поле smoothTime регулирует плавность хода.
alexzzzz
> Переусложняете, товарищи. Я использую такой вариант:
Ну так это конкретная реализация того способа что предлагаем мы)
alexzzzz
I like it! Приду домой, попробую и отпишусь =)
Mephistopheles
Как бе я не имел ввиду, что такое ускорение, а скорее то, как его связать с пользовательским вводом.
Юзер нажал кнопку "вперёд" - увеличиваем плавно скорость камеры в направлении вперёд (с учётом deltaTime) до некоторого предела. Юзер не жмёт кнопку - уменьшаем скорость пока она больше нуля
Тема в архиве.