XREditorWorkQueue.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using UnityEditor;
  5. using UnityEngine;
  6. namespace UnityEditor.XR.Management
  7. {
  8. internal class EditorWorkQueueBase
  9. {
  10. const string k_DefaultSessionStateString = "0BADF00D";
  11. internal static bool SessionStateHasStoredData(string queueName)
  12. {
  13. return SessionState.GetString(queueName, k_DefaultSessionStateString) != EditorWorkQueueBase.k_DefaultSessionStateString;
  14. }
  15. }
  16. internal class EditorWorkQueue<T> : EditorWorkQueueBase
  17. {
  18. [Serializable]
  19. struct Queue
  20. {
  21. [SerializeField]
  22. public List<T> workItems;
  23. }
  24. public string QueueName { get; set; }
  25. private static Lazy<EditorWorkQueue<T>> s_Instance = new Lazy<EditorWorkQueue<T>>();
  26. public static EditorWorkQueue<T> Instance => s_Instance.Value;
  27. public bool HasWorkItems => EditorWorkQueueBase.SessionStateHasStoredData(QueueName);
  28. public Action<T> ProcessItemCallback { get; set; }
  29. public void StartQueue()
  30. {
  31. EditorApplication.update += ProcessWorkQueue;
  32. }
  33. public void QueueWorkItem(T workItem)
  34. {
  35. Queue queue = new Queue();
  36. queue.workItems = new List<T>();
  37. if (EditorWorkQueueBase.SessionStateHasStoredData(QueueName))
  38. {
  39. string fromJson = SessionState.GetString(QueueName, "{}");
  40. JsonUtility.FromJsonOverwrite(fromJson, queue);
  41. }
  42. if (queue.workItems == null)
  43. {
  44. queue.workItems = new List<T>();
  45. }
  46. queue.workItems.Add(workItem);
  47. string json = JsonUtility.ToJson(queue);
  48. SessionState.SetString(QueueName, json);
  49. StartQueue();
  50. }
  51. private static void ProcessWorkQueue()
  52. {
  53. EditorApplication.update -= ProcessWorkQueue;
  54. if (!Instance.HasWorkItems)
  55. return;
  56. T workItem = GetNextWorkItem();
  57. if (Instance.ProcessItemCallback != null)
  58. Instance.ProcessItemCallback(workItem);
  59. if (Instance.HasWorkItems)
  60. EditorApplication.update += ProcessWorkQueue;
  61. }
  62. private static T GetNextWorkItem()
  63. {
  64. T ret = default(T);
  65. if (!Instance.HasWorkItems)
  66. {
  67. return ret;
  68. }
  69. string fromJson = SessionState.GetString(Instance.QueueName, "{}");
  70. SessionState.EraseString(Instance.QueueName);
  71. Queue queue = JsonUtility.FromJson<Queue>(fromJson);
  72. if (queue.workItems.Count <= 0)
  73. {
  74. return ret;
  75. }
  76. ret = queue.workItems[0];
  77. queue.workItems.Remove(ret);
  78. if (queue.workItems.Count > 0)
  79. {
  80. string json = JsonUtility.ToJson(queue);
  81. SessionState.SetString(Instance.QueueName, json);
  82. }
  83. return ret;
  84. }
  85. }
  86. }