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
- 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
- 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
- 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);}}
댓글
댓글 쓰기