// Author: Daniele Giardini - http://www.demigiant.com // Created: 2018/07/13 using DG.Tweening.Core; using DG.Tweening.Plugins.Core.PathCore; using DG.Tweening.Plugins.Options; using System; using System.Reflection; using UnityEngine; #pragma warning disable 1591 namespace DG.Tweening { /// /// Utility functions that deal with available Modules. /// Modules defines: /// - DOTAUDIO /// - DOTPHYSICS /// - DOTPHYSICS2D /// - DOTSPRITE /// - DOTUI /// Extra defines set and used for implementation of external assets: /// - DOTWEEN_TMP ► TextMesh Pro /// - DOTWEEN_TK2D ► 2D Toolkit /// public static class DOTweenModuleUtils { static bool _initialized; #region Reflection /// /// Called via Reflection by DOTweenComponent on Awake /// #if UNITY_2018_1_OR_NEWER [UnityEngine.Scripting.Preserve] #endif public static void Init() { if (_initialized) return; _initialized = true; DOTweenExternalCommand.SetOrientationOnPath += Physics.SetOrientationOnPath; #if UNITY_EDITOR #if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1 UnityEditor.EditorApplication.playmodeStateChanged += PlaymodeStateChanged; #else UnityEditor.EditorApplication.playModeStateChanged += PlaymodeStateChanged; #endif #endif } #if UNITY_2018_1_OR_NEWER #pragma warning disable [UnityEngine.Scripting.Preserve] // Just used to preserve methods when building, never called static void Preserver() { Assembly[] loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); MethodInfo mi = typeof(MonoBehaviour).GetMethod("Stub"); } #pragma warning restore #endif #endregion #if UNITY_EDITOR // Fires OnApplicationPause in DOTweenComponent even when Editor is paused (otherwise it's only fired at runtime) #if UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1 static void PlaymodeStateChanged() #else static void PlaymodeStateChanged(UnityEditor.PlayModeStateChange state) #endif { if (DOTween.instance == null) return; DOTween.instance.OnApplicationPause(UnityEditor.EditorApplication.isPaused); } #endif // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ // ███ INTERNAL CLASSES ████████████████████████████████████████████████████████████████████████████████████████████████ // █████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ public static class Physics { // Called via DOTweenExternalCommand callback public static void SetOrientationOnPath(PathOptions options, Tween t, Quaternion newRot, Transform trans) { #if true // PHYSICS_MARKER if (options.isRigidbody) ((Rigidbody)t.target).rotation = newRot; else trans.rotation = newRot; #else trans.rotation = newRot; #endif } // Returns FALSE if the DOTween's Physics2D Module is disabled, or if there's no Rigidbody2D attached public static bool HasRigidbody2D(Component target) { #if true // PHYSICS2D_MARKER return target.GetComponent() != null; #else return false; #endif } #region Called via Reflection // Called via Reflection by DOTweenPathInspector // Returns FALSE if the DOTween's Physics Module is disabled, or if there's no rigidbody attached #if UNITY_2018_1_OR_NEWER [UnityEngine.Scripting.Preserve] #endif public static bool HasRigidbody(Component target) { #if true // PHYSICS_MARKER return target.GetComponent() != null; #else return false; #endif } // Called via Reflection by DOTweenPath #if UNITY_2018_1_OR_NEWER [UnityEngine.Scripting.Preserve] #endif public static TweenerCore CreateDOTweenPathTween( MonoBehaviour target, bool tweenRigidbody, bool isLocal, Path path, float duration, PathMode pathMode ) { TweenerCore t = null; bool rBodyFoundAndTweened = false; #if true // PHYSICS_MARKER if (tweenRigidbody) { Rigidbody rBody = target.GetComponent(); if (rBody != null) { rBodyFoundAndTweened = true; t = isLocal ? rBody.DOLocalPath(path, duration, pathMode) : rBody.DOPath(path, duration, pathMode); } } #endif #if true // PHYSICS2D_MARKER if (!rBodyFoundAndTweened && tweenRigidbody) { Rigidbody2D rBody2D = target.GetComponent(); if (rBody2D != null) { rBodyFoundAndTweened = true; t = isLocal ? rBody2D.DOLocalPath(path, duration, pathMode) : rBody2D.DOPath(path, duration, pathMode); } } #endif if (!rBodyFoundAndTweened) { t = isLocal ? target.transform.DOLocalPath(path, duration, pathMode) : target.transform.DOPath(path, duration, pathMode); } return t; } #endregion } } }