ПрограммированиеФорумОбщее

Инертность камеры (Unity)

#0
7:10, 21 ноя 2013

Доброго времени суток, друзья.
Я тут пытаюсь 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;
  }  
}

Заранее всем спасибо.

Господи, как же давно я не был на геймдеве...ощущение как будто вернулся домой после долгих скитаний =)

#1
11:45, 21 ноя 2013

KaronatoR
> Собственно камера закреплена и движется только вдоль оси Х.
> Движется нормально, но я тут пытался добавить ей инертности, что-то как-то не
> получилось.
в код особо не смотрел, но попробуй оперировать не скоростью, а ускорением, при этом чтобы камера не разбалтывалась слишком сильно ввести ограничения.

#2
12:34, 21 ноя 2013

Aroch
> в код особо не смотрел, но попробуй оперировать не скоростью, а ускорением,
самый правильный способ.

#3
12:35, 21 ноя 2013

Mephistopheles
Aroch

Братцы а чуть подробнее можно?
Как ускорение влияет на скорость понятно (лол), но вот чем определяется ускорение?

#4
14:27, 21 ноя 2013

KaronatoR
> но вот чем определяется ускорение?
не ожидал такого вопроса)
http://ru.wikipedia.org/wiki/Ускорение

#5
15:30, 21 ноя 2013

Переусложняете, товарищи. Я использую такой вариант:

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 регулирует плавность хода.

#6
16:07, 21 ноя 2013

alexzzzz
> Переусложняете, товарищи. Я использую такой вариант:
Ну так это конкретная реализация того способа что предлагаем мы)

#7
16:32, 21 ноя 2013

alexzzzz
I like it! Приду домой, попробую и отпишусь =)

#8
16:33, 21 ноя 2013

Mephistopheles
Как бе я не имел ввиду, что такое ускорение, а скорее то, как его связать с пользовательским вводом.

#9
19:35, 21 ноя 2013

Юзер нажал кнопку "вперёд" - увеличиваем плавно скорость камеры в направлении вперёд (с учётом deltaTime) до некоторого предела. Юзер не жмёт кнопку - уменьшаем скорость пока она больше нуля

ПрограммированиеФорумОбщее

Тема в архиве.