diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/PlayerLoopHelper.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/PlayerLoopHelper.cs index 1e2512c..063908e 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/PlayerLoopHelper.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/PlayerLoopHelper.cs @@ -101,7 +101,9 @@ namespace Cysharp.Threading.Tasks [Flags] public enum InjectPlayerLoopTimings { - // Preset + /// + /// Preset: All loops(default). + /// All = Initialization | LastInitialization | EarlyUpdate | LastEarlyUpdate | @@ -114,6 +116,9 @@ namespace Cysharp.Threading.Tasks TimeUpdate | LastTimeUpdate, #endif + /// + /// Preset: All without last except LastPostLateUpdate. + /// Standard = Initialization | EarlyUpdate | @@ -126,6 +131,9 @@ namespace Cysharp.Threading.Tasks TimeUpdate, #endif + /// + /// Preset: Minimum pattern, Update | FixedUpdate | LastPostLateUpdate + /// Minimum = Update | FixedUpdate | LastPostLateUpdate, @@ -167,6 +175,9 @@ namespace Cysharp.Threading.Tasks public static class PlayerLoopHelper { + static readonly ContinuationQueue ThrowMarkerContinuationQueue = new ContinuationQueue(PlayerLoopTiming.Initialization); + static readonly PlayerLoopRunner ThrowMarkerPlayerLoopRunner = new PlayerLoopRunner(PlayerLoopTiming.Initialization); + public static SynchronizationContext UnitySynchronizationContext => unitySynchronizationContetext; public static int MainThreadId => mainThreadId; internal static string ApplicationDataPath => applicationDataPath; @@ -220,10 +231,7 @@ namespace Cysharp.Threading.Tasks }; // Remove items from previous initializations. - var source = loopSystem.subSystemList - .Where(ls => ls.type != loopRunnerYieldType && ls.type != loopRunnerType) - .ToArray(); - + var source = RemoveRunner(loopSystem, loopRunnerYieldType, loopRunnerType); var dest = new PlayerLoopSystem[source.Length + 2]; Array.Copy(source, 0, dest, injectOnFirst ? 2 : 0, source.Length); @@ -241,6 +249,13 @@ namespace Cysharp.Threading.Tasks return dest; } + static PlayerLoopSystem[] RemoveRunner(PlayerLoopSystem loopSystem, Type loopRunnerYieldType, Type loopRunnerType) + { + return loopSystem.subSystemList + .Where(ls => ls.type != loopRunnerYieldType && ls.type != loopRunnerType) + .ToArray(); + } + static PlayerLoopSystem[] InsertUniTaskSynchronizationContext(PlayerLoopSystem loopSystem) { var loop = new PlayerLoopSystem @@ -357,6 +372,22 @@ namespace Cysharp.Threading.Tasks throw new Exception("Target PlayerLoopSystem does not found. Type:" + systemType.FullName); } + static void InsertLoop(PlayerLoopSystem[] copyList, InjectPlayerLoopTimings injectTimings, Type loopType, InjectPlayerLoopTimings targetTimings, + int index, bool injectOnFirst, Type loopRunnerYieldType, Type loopRunnerType, PlayerLoopTiming playerLoopTiming) + { + var i = FindLoopSystemIndex(copyList, loopType); + if ((injectTimings & targetTimings) == targetTimings) + { + copyList[i].subSystemList = InsertRunner(copyList[i], injectOnFirst, + loopRunnerYieldType, yielders[index] = new ContinuationQueue(playerLoopTiming), + loopRunnerType, runners[index] = new PlayerLoopRunner(playerLoopTiming)); + } + else + { + copyList[i].subSystemList = RemoveRunner(copyList[i], loopRunnerYieldType, loopRunnerType); + } + } + public static void Initialize(ref PlayerLoopSystem playerLoop, InjectPlayerLoopTimings injectTimings = InjectPlayerLoopTimings.All) { #if UNITY_2020_2_OR_NEWER @@ -369,60 +400,82 @@ namespace Cysharp.Threading.Tasks var copyList = playerLoop.subSystemList.ToArray(); - var i = FindLoopSystemIndex(copyList, typeof(PlayerLoopType.Initialization)); - if (injectTimings | InjectPlayerLoopTimings. + // Initialization + InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.Initialization), + InjectPlayerLoopTimings.Initialization, 0, true, + typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldInitialization), typeof(UniTaskLoopRunners.UniTaskLoopRunnerInitialization), PlayerLoopTiming.Initialization); + + InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.Initialization), + InjectPlayerLoopTimings.LastInitialization, 1, false, + typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldInitialization), typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastInitialization), PlayerLoopTiming.LastInitialization); - copyList[i].subSystemList = InsertRunner(copyList[i], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldInitialization), yielders[0] = new ContinuationQueue(PlayerLoopTiming.Initialization), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldInitialization), yielders[1] = new ContinuationQueue(PlayerLoopTiming.LastInitialization), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerInitialization), runners[0] = new PlayerLoopRunner(PlayerLoopTiming.Initialization), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastInitialization), runners[1] = new PlayerLoopRunner(PlayerLoopTiming.LastInitialization)); // EarlyUpdate - i = FindLoopSystemIndex(copyList, typeof(PlayerLoopType.EarlyUpdate)); - copyList[i].subSystemList = InsertRunner(copyList[i], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldEarlyUpdate), yielders[2] = new ContinuationQueue(PlayerLoopTiming.EarlyUpdate), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldEarlyUpdate), yielders[3] = new ContinuationQueue(PlayerLoopTiming.LastEarlyUpdate), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerEarlyUpdate), runners[2] = new PlayerLoopRunner(PlayerLoopTiming.EarlyUpdate), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastEarlyUpdate), runners[3] = new PlayerLoopRunner(PlayerLoopTiming.LastEarlyUpdate)); + InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.EarlyUpdate), + InjectPlayerLoopTimings.EarlyUpdate, 2, true, + typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldEarlyUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerEarlyUpdate), PlayerLoopTiming.EarlyUpdate); + + InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.EarlyUpdate), + InjectPlayerLoopTimings.LastEarlyUpdate, 3, false, + typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldEarlyUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastEarlyUpdate), PlayerLoopTiming.LastEarlyUpdate); + // FixedUpdate - i = FindLoopSystemIndex(copyList, typeof(PlayerLoopType.FixedUpdate)); - copyList[i].subSystemList = InsertRunner(copyList[i], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldFixedUpdate), yielders[4] = new ContinuationQueue(PlayerLoopTiming.FixedUpdate), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldFixedUpdate), yielders[5] = new ContinuationQueue(PlayerLoopTiming.LastFixedUpdate), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerFixedUpdate), runners[4] = new PlayerLoopRunner(PlayerLoopTiming.FixedUpdate), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastFixedUpdate), runners[5] = new PlayerLoopRunner(PlayerLoopTiming.LastFixedUpdate)); + InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.FixedUpdate), + InjectPlayerLoopTimings.FixedUpdate, 4, true, + typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldFixedUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerFixedUpdate), PlayerLoopTiming.FixedUpdate); + + InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.FixedUpdate), + InjectPlayerLoopTimings.LastFixedUpdate, 5, false, + typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldFixedUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastFixedUpdate), PlayerLoopTiming.LastFixedUpdate); + // PreUpdate - i = FindLoopSystemIndex(copyList, typeof(PlayerLoopType.PreUpdate)); - copyList[i].subSystemList = InsertRunner(copyList[i], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldPreUpdate), yielders[6] = new ContinuationQueue(PlayerLoopTiming.PreUpdate), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldPreUpdate), yielders[7] = new ContinuationQueue(PlayerLoopTiming.LastPreUpdate), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerPreUpdate), runners[6] = new PlayerLoopRunner(PlayerLoopTiming.PreUpdate), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastPreUpdate), runners[7] = new PlayerLoopRunner(PlayerLoopTiming.LastPreUpdate)); + InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.PreUpdate), + InjectPlayerLoopTimings.PreUpdate, 6, true, + typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldPreUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerPreUpdate), PlayerLoopTiming.PreUpdate); + + InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.PreUpdate), + InjectPlayerLoopTimings.LastPreUpdate, 7, false, + typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldPreUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastPreUpdate), PlayerLoopTiming.LastPreUpdate); + // Update - i = FindLoopSystemIndex(copyList, typeof(PlayerLoopType.Update)); - copyList[i].subSystemList = InsertRunner(copyList[i], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldUpdate), yielders[8] = new ContinuationQueue(PlayerLoopTiming.Update), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldUpdate), yielders[9] = new ContinuationQueue(PlayerLoopTiming.LastUpdate), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerUpdate), runners[8] = new PlayerLoopRunner(PlayerLoopTiming.Update), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastUpdate), runners[9] = new PlayerLoopRunner(PlayerLoopTiming.LastUpdate)); + InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.Update), + InjectPlayerLoopTimings.Update, 8, true, + typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerUpdate), PlayerLoopTiming.Update); + + InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.Update), + InjectPlayerLoopTimings.LastUpdate, 9, false, + typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastUpdate), PlayerLoopTiming.LastUpdate); + // PreLateUpdate - i = FindLoopSystemIndex(copyList, typeof(PlayerLoopType.PreLateUpdate)); - copyList[i].subSystemList = InsertRunner(copyList[i], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldPreLateUpdate), yielders[10] = new ContinuationQueue(PlayerLoopTiming.PreLateUpdate), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldPreLateUpdate), yielders[11] = new ContinuationQueue(PlayerLoopTiming.LastPreLateUpdate), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerPreLateUpdate), runners[10] = new PlayerLoopRunner(PlayerLoopTiming.PreLateUpdate), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastPreLateUpdate), runners[11] = new PlayerLoopRunner(PlayerLoopTiming.LastPreLateUpdate)); + InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.PreLateUpdate), + InjectPlayerLoopTimings.PreLateUpdate, 10, true, + typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldPreLateUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerPreLateUpdate), PlayerLoopTiming.PreLateUpdate); + + InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.PreLateUpdate), + InjectPlayerLoopTimings.LastPreLateUpdate, 11, false, + typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldPreLateUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastPreLateUpdate), PlayerLoopTiming.LastPreLateUpdate); + // PostLateUpdate - i = FindLoopSystemIndex(copyList, typeof(PlayerLoopType.PostLateUpdate)); - copyList[i].subSystemList = InsertRunner(copyList[i], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldPostLateUpdate), yielders[12] = new ContinuationQueue(PlayerLoopTiming.PostLateUpdate), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldPostLateUpdate), yielders[13] = new ContinuationQueue(PlayerLoopTiming.LastPostLateUpdate), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerPostLateUpdate), runners[12] = new PlayerLoopRunner(PlayerLoopTiming.PostLateUpdate), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastPostLateUpdate), runners[13] = new PlayerLoopRunner(PlayerLoopTiming.LastPostLateUpdate)); + InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.PostLateUpdate), + InjectPlayerLoopTimings.PostLateUpdate, 12, true, + typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldPostLateUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerPostLateUpdate), PlayerLoopTiming.PostLateUpdate); + + InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.PostLateUpdate), + InjectPlayerLoopTimings.LastPostLateUpdate, 13, false, + typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldPostLateUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastPostLateUpdate), PlayerLoopTiming.LastPostLateUpdate); + #if UNITY_2020_2_OR_NEWER // TimeUpdate - i = FindLoopSystemIndex(copyList, typeof(PlayerLoopType.TimeUpdate)); - copyList[i].subSystemList = InsertRunner(copyList[i], typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldTimeUpdate), yielders[14] = new ContinuationQueue(PlayerLoopTiming.TimeUpdate), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldTimeUpdate), yielders[15] = new ContinuationQueue(PlayerLoopTiming.LastTimeUpdate), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerTimeUpdate), runners[14] = new PlayerLoopRunner(PlayerLoopTiming.TimeUpdate), - typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastTimeUpdate), runners[15] = new PlayerLoopRunner(PlayerLoopTiming.LastTimeUpdate)); + InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.TimeUpdate), + InjectPlayerLoopTimings.TimeUpdate, 14, true, + typeof(UniTaskLoopRunners.UniTaskLoopRunnerYieldTimeUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerTimeUpdate), PlayerLoopTiming.TimeUpdate); + + InsertLoop(copyList, injectTimings, typeof(PlayerLoopType.TimeUpdate), + InjectPlayerLoopTimings.LastTimeUpdate, 15, false, + typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastYieldTimeUpdate), typeof(UniTaskLoopRunners.UniTaskLoopRunnerLastTimeUpdate), PlayerLoopTiming.LastTimeUpdate); #endif // Insert UniTaskSynchronizationContext to Update loop - i = FindLoopSystemIndex(copyList, typeof(PlayerLoopType.Update)); + var i = FindLoopSystemIndex(copyList, typeof(PlayerLoopType.Update)); copyList[i].subSystemList = InsertUniTaskSynchronizationContext(copyList[i]); playerLoop.subSystemList = copyList; @@ -431,12 +484,27 @@ namespace Cysharp.Threading.Tasks public static void AddAction(PlayerLoopTiming timing, IPlayerLoopItem action) { - runners[(int)timing].AddAction(action); + var runner = runners[(int)timing]; + if (runner == null) + { + ThrowInvalidLoopTiming(timing); + } + runner.AddAction(action); + } + + static void ThrowInvalidLoopTiming(PlayerLoopTiming playerLoopTiming) + { + throw new InvalidOperationException("Target playerLoopTiming is not injected. Please check PlayerLoopHelper.Initialize. PlayerLoopTiming:" + playerLoopTiming); } public static void AddContinuation(PlayerLoopTiming timing, Action continuation) { - yielders[(int)timing].Enqueue(continuation); + var q = yielders[(int)timing]; + if (q == null) + { + ThrowInvalidLoopTiming(timing); + } + q.Enqueue(continuation); } // Diagnostics helper diff --git a/src/UniTask/Assets/Scenes/EditorTest1.cs b/src/UniTask/Assets/Scenes/EditorTest1.cs index 95a810b..4872b8f 100644 --- a/src/UniTask/Assets/Scenes/EditorTest1.cs +++ b/src/UniTask/Assets/Scenes/EditorTest1.cs @@ -11,29 +11,29 @@ public class Test1 public static async UniTaskVoid TestFunc() { await DoSomeThing(); - string[] scenes = new string[] - { - "Assets/Scenes/SandboxMain.unity", - }; + //string[] scenes = new string[] + //{ + // "Assets/Scenes/SandboxMain.unity", + //}; - try - { - Debug.Log("Build Begin"); - BuildPipeline.BuildPlayer(scenes, Application.dataPath + "../target", BuildTarget.StandaloneWindows, BuildOptions.CompressWithLz4); - Debug.Log("Build After"); - } - catch (Exception e) - { - Debug.LogError(e.Message); - } + //try + //{ + // Debug.Log("Build Begin"); + // BuildPipeline.BuildPlayer(scenes, Application.dataPath + "../target", BuildTarget.StandaloneWindows, BuildOptions.CompressWithLz4); + // Debug.Log("Build After"); + //} + //catch (Exception e) + //{ + // Debug.LogError(e.Message); + //} } public static async UniTask DoSomeThing() { Debug.Log("Dosomething"); - await UniTask.Delay(1500, DelayType.Realtime); + await UniTask.Delay(1500, DelayType.DeltaTime); Debug.Log("Dosomething 2"); - await UniTask.Delay(1000, DelayType.Realtime); + await UniTask.Delay(1000, DelayType.DeltaTime); Debug.Log("Dosomething 3"); } } diff --git a/src/UniTask/Assets/Scenes/SandboxMain.cs b/src/UniTask/Assets/Scenes/SandboxMain.cs index 516f7f9..2ef7faa 100644 --- a/src/UniTask/Assets/Scenes/SandboxMain.cs +++ b/src/UniTask/Assets/Scenes/SandboxMain.cs @@ -549,19 +549,51 @@ public class SandboxMain : MonoBehaviour async UniTaskVoid Start() { + var defaultLoop = PlayerLoop.GetDefaultPlayerLoop(); + PlayerLoopHelper.Initialize(ref defaultLoop, InjectPlayerLoopTimings.All); + var cts = new CancellationTokenSource(); - TestAsync(cts.Token).Forget(); + // TestAsync(cts.Token).Forget(); okButton.onClick.AddListener(UniTask.UnityAction(async () => { - cts.Cancel(); + PlayerLoopHelper.DumpCurrentPlayerLoop(); await UniTask.Yield(); })); + cancelButton.onClick.AddListener(UniTask.UnityAction(async () => + { + await UniTask.Yield(PlayerLoopTiming.Initialization); + + RunCheck(PlayerLoopTiming.Initialization).Forget(); + RunCheck(PlayerLoopTiming.LastInitialization).Forget(); + RunCheck(PlayerLoopTiming.EarlyUpdate).Forget(); + RunCheck(PlayerLoopTiming.LastEarlyUpdate).Forget(); + RunCheck(PlayerLoopTiming.FixedUpdate).Forget(); + RunCheck(PlayerLoopTiming.LastFixedUpdate).Forget(); + RunCheck(PlayerLoopTiming.PreUpdate).Forget(); + RunCheck(PlayerLoopTiming.LastPreUpdate).Forget(); + RunCheck(PlayerLoopTiming.Update).Forget(); + RunCheck(PlayerLoopTiming.LastUpdate).Forget(); + RunCheck(PlayerLoopTiming.PreLateUpdate).Forget(); + RunCheck(PlayerLoopTiming.LastPreLateUpdate).Forget(); + RunCheck(PlayerLoopTiming.PostLateUpdate).Forget(); + RunCheck(PlayerLoopTiming.LastPostLateUpdate).Forget(); + + })); + await UniTask.Yield(); } + async UniTaskVoid RunCheck(PlayerLoopTiming timing) + { + //await UniTask.Yield(timing); + //UnityEngine.Debug.Log("Yield:" + timing); + await UniTask.DelayFrame(1, timing); + UnityEngine.Debug.Log("Delay:" + timing); + } + private void Application_logMessageReceived2(string condition, string stackTrace, LogType type) { throw new NotImplementedException(); diff --git a/src/UniTask/Assets/TempAsm/FooMonoBehaviour.cs b/src/UniTask/Assets/TempAsm/FooMonoBehaviour.cs index 6c62ccb..3173c0c 100644 --- a/src/UniTask/Assets/TempAsm/FooMonoBehaviour.cs +++ b/src/UniTask/Assets/TempAsm/FooMonoBehaviour.cs @@ -12,16 +12,16 @@ public class FooMonoBehaviour : MonoBehaviour } - private async UniTask Download(UnityWebRequest req, string filePath) - { - _ = req.SendWebRequest(); + //private async UniTask Download(UnityWebRequest req, string filePath) + //{ + // _ = req.SendWebRequest(); - // var aaa = await foo; - // Debug.Log(aaa); - await UniTask.Yield(); - //File.WriteAllText(filePath, req.downloadHandler.text ?? string.Empty); - } + // // var aaa = await foo; + // // Debug.Log(aaa); + // await UniTask.Yield(); + // //File.WriteAllText(filePath, req.downloadHandler.text ?? string.Empty); + //} } diff --git a/src/UniTask/ProjectSettings/ProjectVersion.txt b/src/UniTask/ProjectSettings/ProjectVersion.txt index 0560e11..a328ffd 100644 --- a/src/UniTask/ProjectSettings/ProjectVersion.txt +++ b/src/UniTask/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2020.2.0f1 -m_EditorVersionWithRevision: 2020.2.0f1 (3721df5a8b28) +m_EditorVersion: 2020.2.1f1 +m_EditorVersionWithRevision: 2020.2.1f1 (270dd8c3da1c)