Запустить lerp через таймер - PullRequest
0 голосов
/ 04 октября 2018

Во-первых, я не использую какой-либо игровой движок, я модифицирую игру на C #, и я НЕ использую UnityEngine API, поэтому у меня нет функций Update ().

Так что япытаясь выяснить, как я мог бы создать таймер, какой-то стандартный встроенный таймер C #, который увеличил бы расстояние рычага на заданной скорости.

model.rotationM = Vector3.Lerp(model.rotation, model.rotationM, (float)0.016);
NAPI.Entity.SetEntityRotation(model.handle, model.rotationM);

Я хотел бы обернуть это в таймер, который каждыйНа 100 мс он будет увеличивать плавание в конце lerp на некоторое заданное значение в течение некоторого времени, так что я установил float speed = 5f; Я хочу увеличивать это расстояние lerp каждые 100 мс в течение 5 секунд, пока он не достигнет своей цели.

Возможно ли это сделать?

1 Ответ

0 голосов
/ 04 октября 2018

Я создал пример класса таймера, который будет постепенно увеличивать значение на заданную величину, пока не достигнет 100% (1,0):

public class LerpTimer : IDisposable
{
    private readonly Timer _timer;
    private readonly float _incrementPercentage = 0;
    public event EventHandler<float> DoLerp;
    public event EventHandler Complete;
    private bool _isDisposed = false;
    private float _current;

    public LerpTimer(double frequencyMs, float incrementPercentage)
    {
        if (frequencyMs <= 0)
        {
            throw new ArgumentOutOfRangeException(nameof(frequencyMs), "Frequency must be greater than 1ms.");
        }

        if (incrementPercentage < 0 || incrementPercentage > 1)
        {
            throw new ArgumentOutOfRangeException(nameof(incrementPercentage), "Increment percentage must be a value between 0 and 1");
        }
        _timer = new Timer(frequencyMs);
        _timer.Elapsed += _timer_Elapsed;
        _incrementPercentage = incrementPercentage;
    }

    private void _timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        if (_isDisposed)
        {
            return;
        }

        if (this.Current < 1)
        {
            this.Current = Math.Min(1, this.Current + _incrementPercentage);
            this.DoLerp?.Invoke(this, this.Current);
        }

        if (this.Current >= 1)
        {
            this._timer.Stop();
            this.Complete?.Invoke(this, EventArgs.Empty);
        }
    }

    public float Current
    {
        get
        { 
            if (_isDisposed)
            {
                throw new ObjectDisposedException(nameof(LerpTimer));
            }
            return _current;
        }
        set => _current = value;
    }

    public void Start()
    {
        if (_isDisposed)
        {
            throw new ObjectDisposedException(nameof(LerpTimer));
        }

        if (_timer.Enabled)
        {
            throw new InvalidOperationException("Timer already running.");
        }
        this.Current = 0;
        _timer.Start();
    }

    public void Stop()
    {
        if (_isDisposed)
        {
            throw new ObjectDisposedException(nameof(LerpTimer));
        }

        if (!_timer.Enabled)
        {
            throw new InvalidOperationException("Timer not running.");
        }
        _timer.Stop();
    }

    public void Dispose()
    {
        _isDisposed = true;
        _timer?.Dispose();
    }
}

Пример использования:

var lerpTimer = new LerpTimer(100, 0.016f);
lerpTimer.DoLerp += (sender, value) => {
    model.rotationM = Vector3.Lerp(startRotation, endRotation, value);
    NAPI.Entity.SetEntityRotation(model.handle, model.rotationM);
};
lerpTimer.Start();

Таким образом, вы бы назвали это один раз, и затем он продолжал бы, пока не достигнет 100% (endRotation).

Это не обязательно код, который вы должны использовать, но он должен проиллюстрировать, как вы можете использовать таймер для увеличениязначение со временем.


Отредактируйте, чтобы придать некоторую ясность тому, что делает функция lerp:

double lerp(double start, double end, double percentage)
{
    return start + ((end - start) * percentage);
}

Представьте, что мы вызываем это каждые 10% от 4 до 125. Мы получимследующие результаты:

0%    4
10%   16.1
20%   28.2
30%   40.3
40%   52.4
50%   64.5
60%   76.6
70%   88.7
80%   100.8
90%   112.9
100%  125

Попробуйте онлайн

...