TransitionManager.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. namespace MaskTransitions
  2. {
  3. using DG.Tweening;
  4. using System.Collections;
  5. using UnityEngine;
  6. using UnityEngine.SceneManagement;
  7. using UnityEngine.UI;
  8. public class TransitionManager : MonoBehaviour
  9. {
  10. public static TransitionManager Instance;
  11. private float screenWidth;
  12. private float screenHeight;
  13. [HideInInspector] public static float maxSize;
  14. private float individualTransitionTime;
  15. [Header("Transition Properties")]
  16. public Sprite transitionImage;
  17. public Color transitionColor;
  18. public bool rotation;
  19. [Tooltip("Time taken for one half of the transition to complete")]
  20. public float transitionTime;
  21. [Header("Image Components")]
  22. [SerializeField] private RectTransform parentMaskRect;
  23. [SerializeField] private RectTransform maskRect;
  24. [SerializeField] private RectTransform transitionCanvas;
  25. [SerializeField] private Image parentMaskImage;
  26. [SerializeField] private CutoutMaskUI cutoutMask;
  27. private void Awake()
  28. {
  29. if (Instance == null)
  30. Instance = this;
  31. else
  32. Destroy(gameObject);
  33. DontDestroyOnLoad(gameObject);
  34. }
  35. private void Start()
  36. {
  37. // Assign the transition sprite and color
  38. parentMaskImage.sprite = transitionImage;
  39. cutoutMask.sprite = transitionImage;
  40. cutoutMask.color = transitionColor;
  41. individualTransitionTime = transitionTime / 2;
  42. SetupMaxSize();
  43. }
  44. #region Setup
  45. void SetupMaxSize()
  46. {
  47. screenWidth = transitionCanvas.rect.width;
  48. screenHeight = transitionCanvas.rect.height;
  49. maxSize = Mathf.Max(screenWidth, screenHeight);
  50. maxSize += maxSize / 4;
  51. }
  52. void StartAnimation(float? totalTime = null)
  53. {
  54. float animationTime = totalTime ?? individualTransitionTime;
  55. maskRect.sizeDelta = Vector2.zero;
  56. parentMaskRect.sizeDelta = Vector2.zero;
  57. maskRect.DOSizeDelta(new Vector2(maxSize, maxSize), animationTime).SetEase(Ease.InOutQuad);
  58. if (rotation)
  59. maskRect.DORotate(new Vector3(0, 0, 180), animationTime, RotateMode.FastBeyond360).SetEase(Ease.InOutQuad);
  60. }
  61. Tween StartAnimationForLoad(float? totalTime = null)
  62. {
  63. float animationTime = totalTime ?? individualTransitionTime;
  64. maskRect.sizeDelta = Vector2.zero;
  65. parentMaskRect.sizeDelta = Vector2.zero;
  66. maskRect.rotation = Quaternion.identity;
  67. Tween blueTweenSize = maskRect.DOSizeDelta(new Vector2(maxSize, maxSize), animationTime).SetEase(Ease.InOutQuad);
  68. Sequence animationSequence = DOTween.Sequence().Join(blueTweenSize);
  69. if (rotation)
  70. {
  71. Tween blueTweenRotate = maskRect.DORotate(new Vector3(0, 0, 180), animationTime).SetEase(Ease.InOutQuad);
  72. animationSequence.Join(blueTweenRotate);
  73. }
  74. return animationSequence;
  75. }
  76. void EndAnimation(float? totalTime = null)
  77. {
  78. float animationTime = totalTime ?? individualTransitionTime;
  79. maskRect.sizeDelta = new Vector2(maxSize, maxSize);
  80. parentMaskRect.sizeDelta = Vector2.zero;
  81. parentMaskRect.rotation = Quaternion.identity;
  82. parentMaskRect.DOSizeDelta(new Vector2(maxSize, maxSize), animationTime).SetEase(Ease.InOutQuad);
  83. if (rotation)
  84. parentMaskRect.DORotate(new Vector3(0, 0, 180), animationTime).SetEase(Ease.InOutQuad);
  85. }
  86. #endregion
  87. #region Transition Without Scene Load
  88. public void PlayTransition(float transitionTime, float startDelay = 0f)
  89. {
  90. StartCoroutine(PlayTransitionWithDelay(transitionTime, startDelay));
  91. }
  92. IEnumerator PlayTransitionWithDelay(float transitionTime, float startDelay)
  93. {
  94. float dividedTime = transitionTime / 3;
  95. //Optional Delay
  96. yield return new WaitForSeconds(startDelay);
  97. StartAnimation(dividedTime);
  98. yield return new WaitForSeconds(dividedTime);
  99. EndAnimation(dividedTime);
  100. }
  101. #endregion
  102. #region Transition With Scene Load
  103. public void LoadLevel(string sceneName, float delay = 0f)
  104. {
  105. StartCoroutine(LoadLevelWithWait(sceneName, delay));
  106. }
  107. IEnumerator LoadLevelWithWait(string sceneName, float delay)
  108. {
  109. yield return new WaitForSeconds(delay);
  110. Tween animationTween = StartAnimationForLoad();
  111. // Wait for the animation to complete
  112. yield return animationTween.WaitForCompletion();
  113. AsyncOperation asyncLoad = SceneManager.LoadSceneAsync(sceneName);
  114. while (!asyncLoad.isDone)
  115. {
  116. yield return null;
  117. }
  118. EndAnimation();
  119. }
  120. #endregion
  121. #region Play Partial Transitions
  122. public void PlayStartHalfTransition(float transitionTime, float startDelay = 0f)
  123. {
  124. StartCoroutine(PlayStartHalfTransitionWithDelay(transitionTime, startDelay));
  125. }
  126. public void PlayEndHalfTransition(float transitionTime, float startDelay = 0f)
  127. {
  128. StartCoroutine(PlayEndHalfTransitionWithDelay(transitionTime, startDelay));
  129. }
  130. IEnumerator PlayStartHalfTransitionWithDelay(float transitionTime, float startDelay)
  131. {
  132. yield return new WaitForSeconds(startDelay);
  133. StartAnimation(transitionTime);
  134. }
  135. IEnumerator PlayEndHalfTransitionWithDelay(float transitionTime, float startDelay)
  136. {
  137. yield return new WaitForSeconds(startDelay);
  138. EndAnimation(transitionTime);
  139. }
  140. #endregion
  141. }
  142. }