Страница 1 из 1

Как работает Mathf.SmoothDamp?

СообщениеДобавлено: 12 окт 2017, 15:07
kaleka
В общем такая проблема: требуется чтобы значение X изменялось от 0 до 5 в течение 3 секунд. По идее для этого я должен воспользоваться Mathf.SmoothDamp и если посмотреть мануал, то все очевидно. Но задав начальное значение, конечное значение и время за которое должен осуществиться переход я получаю совершено непредсказуемый результат, который не понятно как вообще получается (видео по ссылке). Может кто-нибудь объяснить по какому закону меняется значение ref currentVelocity? Можно ли сделать скорость постоянной?

Скрипт используемый в тесте:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour {

        public float x;
        public float velocity;
        public float smoothTime;
        public float y;

        void Start () {

        }
       
        void Update () {
                x = Mathf.SmoothDamp (x, y, ref velocity, smoothTime);
        }
}



Ссылка на видео (изменение параметров отражено в инспекторе):
https://yadi.sk/i/p41946oD3Nh4Fy

Re: Как работает Mathf.SmoothDamp?

СообщениеДобавлено: 12 окт 2017, 15:27
Tolking
x = Mathf.SmoothDamp (x, y, ref velocity, smoothTime);

это не от 0 до 5 это от x до y... :)
ведет себя так же как lerp в аналогичной ситуации. Хотя написано все верно...

Попробуй вызывать с дельтатайм вариант (полный)

P.S. Или используй Lerp - он понятнее, хоть и немного менее удобный...
P.S. Постоянную скорость за кадр - прибавляй каждый кадр скорость за кадр. Постоянную скорость за секунду - прибавляй каждый кадр скорость за секунду умноженную на время кадра (Time.deltaTime)

Re: Как работает Mathf.SmoothDamp?

СообщениеДобавлено: 12 окт 2017, 16:36
kaleka
Tolking писал(а):x = Mathf.SmoothDamp (x, y, ref velocity, smoothTime);

это не от 0 до 5 это от x до y... :)
ведет себя так же как lerp в аналогичной ситуации. Хотя написано все верно...

Попробуй вызывать с дельтатайм вариант (полный)

P.S. Или используй Lerp - он понятнее, хоть и немного менее удобный...
P.S. Постоянную скорость за кадр - прибавляй каждый кадр скорость за кадр. Постоянную скорость за секунду - прибавляй каждый кадр скорость за секунду умноженную на время кадра (Time.deltaTime)


Там на видео параметры в инспекторе заданы) x = 0, y = 5

Вопрос тогда как помощью Lerp осуществить задуманное, он вроде среднее значение считает между max и min?

Re: Как работает Mathf.SmoothDamp?

СообщениеДобавлено: 12 окт 2017, 17:03
seaman
среднее значение считает между max и min

Не среднее,а промежуточное.
как помощью Lerp осуществить задуманное

Читаем:
https://poqxert.ru/blog/unity/tutorials ... rpolyaczii

Re: Как работает Mathf.SmoothDamp?

СообщениеДобавлено: 12 окт 2017, 17:06
kaleka
seaman писал(а):
среднее значение считает между max и min

Не среднее,а промежуточное.
как помощью Lerp осуществить задуманное

Читаем:
https://poqxert.ru/blog/unity/tutorials ... rpolyaczii


Я так понял что если мы задаем третий аргумент как Time.time (как в строчке ниже) то можно получить плавное изменение?
float _z = Mathf.Lerp(_startPos, _endPos, Time.time);

Re: Как работает Mathf.SmoothDamp?

СообщениеДобавлено: 12 окт 2017, 17:09
Tolking
Синтаксис:
Используется csharp
public class Test : MonoBehaviour {

        public float x;
        public float smoothTime;
        public float minX;
        public float maxX;

float t=0;
        void Start () {

        }
       
        void Update () {
t+=Time.deltaTime;
                x = Mathf.Lerp (MinX, MaxX, t/smoothTime);
        }
}

 


void Update () {
x = Mathf.Lerp (x, MaxX, Time.deltaTime+smoothTime);
}
- будет почти как твоем примере...

Re: Как работает Mathf.SmoothDamp?

СообщениеДобавлено: 12 окт 2017, 17:11
kaleka
Tolking писал(а):
Синтаксис:
Используется csharp
public class Test : MonoBehaviour {

        public float x;
        public float smoothTime;
        public float minX;
        public float maxX;

float t=0;
        void Start () {

        }
       
        void Update () {
t+=Time.deltaTime;
                x = Mathf.Lerp (MinX, MaxX, t/smoothTime);
        }
}

 


void Update () {
x = Mathf.Lerp (x, MaxX, Time.deltaTime+smoothTime);
}
- будет почти как твоем примере...

Просто все равно получается, что скорость изменения не постоянная, а вначале высокая а к приближению к таргету уменьшается. Думаю может тогда лучше MoveToward попробовать