Как применить алгоритм Easing в Unity? - PullRequest
0 голосов
/ 28 августа 2018

Я хочу перемещать камеру плавным движением, поэтому я пишу этот сценарий

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraScroll : MonoBehaviour {

    public GameObject targetCamera;

    private bool  isScrolling = false;

    private Vector3 initialPosition;
    private Vector3 scrollTarget;

    private float scrollDuration;
    private float scrollTick;

    private float timeStartedScrolling;


#region Easing

    float EasingInOutSine(float time, float start, float change, float duration) {
        return -change/2 * (Mathf.Cos(Mathf.PI*time/duration) - 1) + start;
    }

    float EasingOutSine(float time, float start, float change, float duration) {
        dynamic td = time/duration;
        return change * Mathf.Sin(td * (Mathf.PI/2)) + start;
    }

    float EasingInOutBack(float time, float start, float change, float duration) {

        float td2 = time/(duration/2.0f);

        float s = 1.70158f;

        if ((td2) < 1.0f) {
            return change/2.0f*(td2*td2*(((s*(1.525f))+1.0f)*td2 - (s*(1.525f)))) + start;
        } else {
            return change/2.0f*((td2-2.0f)*(td2-2.0f)*(((s*(1.525f))+1.0f)*(td2-2.0f) + (s*(1.525f))) + 2) + start;
        }

    }

#endregion


    void Start() {

        if (targetCamera == null) {
            targetCamera = GameObject.Find("Main Camera");
        }

        // Tests

        //Scroll(new Vector3(4.0f, 0.0f, -10f), 2f); // seems to be working?
        //Scroll(new Vector3(4.0f, 0.0f, -10f), 0.3f); // easing gets cut off
        Scroll(new Vector3(4.0f, 0.0f, -10f), 1f); // easing gets cut off

    }



    void Update() {

        if (isScrolling) {

            scrollTick += Time.deltaTime;
            float s = scrollTick / scrollDuration;

            float timeSinceStarted   = Time.time - timeStartedScrolling;
            float percentageComplete = timeSinceStarted / scrollDuration;

            if (percentageComplete > 1.0f) {

                isScrolling = false;
                Debug.Log("Scrolling ended");

            } else {

                                           // time,     start, change,                                  duration
                var easing = EasingInOutSine(Time.time, 0,     Mathf.Clamp01(Time.time*scrollDuration), scrollDuration);

                targetCamera.transform.position = Vector3.Lerp(initialPosition, scrollTarget, easing);



            } 

        }

    }

    void Scroll(Vector3 targetPosition, float duration) {

        scrollDuration = duration;
        scrollTarget = targetPosition;
        initialPosition = targetCamera.transform.position;
        timeStartedScrolling = Time.time;
        isScrolling = true;

    }

}

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

Мне бы хотелось, чтобы в будущем сценарий мог использовать различные алгоритмы замедления и правильно играть с deltaTime, я не уверен, правильно ли я это делаю

1 Ответ

0 голосов
/ 28 августа 2018

Я думаю, вам просто нужно постоянное изменение.

С увеличением изменения эффект замедления будет ослаблен экспоненциальным движением, вызванным увеличением изменения. Этот эффект наиболее очевиден в движениях малой продолжительности, потому что он никогда не достигнет потолка значения медленнее, поэтому он будет ускоряться до конца.

Так как вы используете свой алгоритм замедления для вывода процента, чтобы бросить в lerp, вы, вероятно, захотите использовать изменение 1, чтобы замедление интерполировалось между 0 и 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...