Unity Timeline Begin play / reverse timeline extension && Singletone method

Code is made by modifiying this code. 


PlayfromBegin & Reverse code
TimelineExtension.cs
Engine timeline customization

Code (C#): TimelineExtensions
  1. using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;

    public static class TimelineExtensions
    {
        private static readonly WaitForEndOfFrame _frameWait = new WaitForEndOfFrame();
        public static void BeginPlay(this UnityEngine.Playables.PlayableDirector timeline)
        {
            ExtensionObject.Instance.StartCoroutine(PlayfromBegin(timeline));
        }   
        public static void ReversePlay(this UnityEngine.Playables.PlayableDirector timeline)
        {
            ExtensionObject.Instance.StartCoroutine(Reverse(timeline));
        }

        private static IEnumerator PlayfromBegin(UnityEngine.Playables.PlayableDirector timeline)
        {
            UnityEngine.Playables.DirectorUpdateMode defaultUpdateMode = timeline.timeUpdateMode;
            timeline.timeUpdateMode = UnityEngine.Playables.DirectorUpdateMode.Manual;

            timeline.time = 0;
            timeline.Evaluate();

            yield return _frameWait;

            //float dt = (float)timeline.duration;
            float dt = 0;
            while (dt < (float)timeline.duration)
            {
                dt += Time.deltaTime / (float)timeline.duration;
                timeline.time = Mathf.Max(dt, 0);
                timeline.Evaluate();

                yield return _frameWait;
            }
            timeline.time = timeline.duration;
            timeline.Evaluate();
            timeline.timeUpdateMode = defaultUpdateMode;
            timeline.Stop();

        }

        private static IEnumerator Reverse(UnityEngine.Playables.PlayableDirector timeline)
        {
            UnityEngine.Playables.DirectorUpdateMode defaultUpdateMode = timeline.timeUpdateMode;
            timeline.timeUpdateMode = UnityEngine.Playables.DirectorUpdateMode.Manual;

            if (timeline.time.ApproxEquals(timeline.duration) || timeline.time.ApproxEquals(0))
            {
                timeline.time = timeline.duration;
            }

            timeline.Evaluate();

            yield return _frameWait;

            float dt = (float)timeline.duration;
            while (dt > 0)
            {
                dt -= Time.deltaTime / (float)timeline.duration;
                timeline.time = Mathf.Max(dt, 0);
                timeline.Evaluate();

                yield return _frameWait;
            }

            timeline.time = 0;
            timeline.Evaluate();
            timeline.timeUpdateMode = defaultUpdateMode;
            timeline.Stop();
        }

        public static bool ApproxEquals(this double num, float other)
        {
            return Mathf.Approximately((float)num, other);
        }

        public static bool ApproxEquals(this double num, double other)
        {
            return Mathf.Approximately((float)num, (float)other);
        }
    }

FunctionLibrary.cs

Function Library

Code (C#): FunctionLibrary
  1.     private static readonly WaitForEndOfFrame _frameWait = new WaitForEndOfFrame();

        /// <summary>
        /// Timeliner Iterator Function, USE ExtensionObject.Instance.StartCoroutine() for Singleton design
        /// </summary>
        /// <param name="action"> (x)=>y=x</param>
        /// <param name="from"></param>
        /// <param name="to"></param>
        /// <param name="time"></param>
        /// <returns></returns>
        public static IEnumerator TimelinerLinear(System.Action<float> action, System.Action<bool> over, float from, float to, float time, bool bTrue) {

            float t = 0;
            while (t < 1) {
                t += Time.deltaTime/time;
                action(Mathf.Lerp(from, to, t));
                yield return _frameWait;
            }
            action(to);
            over(bTrue);
        }

        public static IEnumerator TimelinerSine(System.Action<float> action, float from, float to, float time)
        {

            float t = 0;
            float f = 0;
            while (t < 1)
            {
                t += Time.deltaTime / time;
                f = Mathf.Sin(t *Mathf.PI);
                action(Mathf.Lerp(from, to, f));
                yield return _frameWait;
            }
            action(from);
        }

Singletone.cs

Singletone method

Code (C#): Singletone method
  1. using UnityEngine;

    public class ExtensionObject : MonoBehaviour
    {
        public static ExtensionObject Instance => _instance;
        private static ExtensionObject _instance = null;

        [RuntimeInitializeOnLoadMethod]
        private static void Init()
        {
            GameObject extensionObject = new GameObject("ExtensionObject");
            extensionObject.AddComponent<ExtensionObject>();
        }

        private void Awake()
        {
           if (_instance != null)
            {
                Destroy(this.gameObject);
                return;
            }

            _instance = this;
            DontDestroyOnLoad(this);
        }
    }


댓글

이 블로그의 인기 게시물

About AActor!!! "UObject" has no member "BeginPlay"

UNREAL Android build information

Shader informations nice blog ~ ~