No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

UnityLifecycleManager.cs 2.9KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using System;
  2. using System.Collections;
  3. using UnityEngine.Events;
  4. namespace UnityEngine.Advertisements.Utilities
  5. {
  6. /// <summary>
  7. /// A helper class for running coroutines from non <see cref="T:UnityEngine.MonoBehaviour" /> classes.
  8. /// </summary>
  9. internal class UnityLifecycleManager : IUnityLifecycleManager
  10. {
  11. internal const string gameObjectName = "UnityEngine_UnityAds_CoroutineExecutor";
  12. private GameObject m_GameObject;
  13. private CoroutineExecutor m_CoroutineExecutor;
  14. private ApplicationQuit m_ApplicationQuit;
  15. private bool m_Disposed;
  16. public UnityLifecycleManager() {
  17. Initialize();
  18. }
  19. private void Initialize() {
  20. var existingCoroutineExecutorGameObject = GameObject.Find(gameObjectName);
  21. if (existingCoroutineExecutorGameObject != null)
  22. {
  23. m_GameObject = existingCoroutineExecutorGameObject;
  24. m_CoroutineExecutor = m_GameObject.GetComponent<CoroutineExecutor>();
  25. if (m_CoroutineExecutor != null)
  26. {
  27. m_CoroutineExecutor.referenceCount++;
  28. return;
  29. }
  30. else
  31. {
  32. GameObject.DestroyImmediate(m_GameObject);
  33. m_GameObject = null;
  34. }
  35. }
  36. m_GameObject = new GameObject(gameObjectName) { hideFlags = HideFlags.HideInHierarchy | HideFlags.HideInInspector};
  37. m_CoroutineExecutor = m_GameObject.AddComponent<CoroutineExecutor>();
  38. m_ApplicationQuit = m_GameObject.AddComponent<ApplicationQuit>();
  39. m_CoroutineExecutor.referenceCount++;
  40. GameObject.DontDestroyOnLoad(m_GameObject);
  41. }
  42. public Coroutine StartCoroutine(IEnumerator enumerator)
  43. {
  44. if (!m_CoroutineExecutor) {
  45. Initialize();
  46. }
  47. return m_CoroutineExecutor?.StartCoroutine(enumerator);
  48. }
  49. public void Post(Action action)
  50. {
  51. if (!m_CoroutineExecutor) {
  52. Initialize();
  53. }
  54. lock (m_CoroutineExecutor.queue)
  55. {
  56. m_CoroutineExecutor?.queue?.Enqueue(action);
  57. }
  58. }
  59. public void Dispose()
  60. {
  61. if (!m_Disposed)
  62. {
  63. m_Disposed = true;
  64. m_CoroutineExecutor.referenceCount--;
  65. if (m_CoroutineExecutor.referenceCount == 0) {
  66. Object.DestroyImmediate(m_GameObject);
  67. }
  68. m_GameObject = null;
  69. m_CoroutineExecutor = null;
  70. m_ApplicationQuit = null;
  71. }
  72. }
  73. public void SetOnApplicationQuitCallback(UnityAction callback)
  74. {
  75. if (m_ApplicationQuit != null)
  76. {
  77. m_ApplicationQuit.OnApplicationQuitEventHandler += callback;
  78. }
  79. }
  80. }
  81. }