diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/AltTask/Awaitable.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/AltTask/Awaitable.cs index b199f68e4..eb4a16706 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/AltTask/Awaitable.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/AltTask/Awaitable.cs @@ -5,6 +5,16 @@ using System.Threading.Tasks; namespace UniGLTF.AltTask { + /// + /// Importer 向けに Task を wrap した。 + /// + /// * EditorやUnitTestなどで、Unity の MainLoop を進行させずに 非同期を進行させることが目的 + /// + /// Global変数 SynchronizationContext.Current を一時的に変更したいのだが、 + /// システムに予期せぬ副作用を与える可能性があるのでこれを回避。 + /// UniGLTF.AltTask.TaskQueue.Current に同じ機能を与えて、タスクのPost先を制御することにした。 + /// + public interface IAwaiter : INotifyCompletion { bool IsCompleted { get; } @@ -86,18 +96,12 @@ namespace UniGLTF.AltTask }, null); } - public static Awaitable Delay() - { - var task = Task.FromResult(default); - return new Awaitable(task); - } - public static Awaitable Run(Func action) { return new Awaitable(Task.Run(action)); } - public static Awaitable Run(Action action) + public static Awaitable Run(Action action) { return new Awaitable(Task.Run(action)); } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/AltTask/LoopAwaitable.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/AltTask/LoopAwaitable.cs new file mode 100644 index 000000000..f6410a344 --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/AltTask/LoopAwaitable.cs @@ -0,0 +1,17 @@ +using System; + +namespace UniGLTF.AltTask +{ + public static class LoopAwaitable + { + // TODO + // loop スレッド使わないようにしたい + public static Awaitable Create() + { + return Awaitable.Run(() => + { + System.Threading.Thread.Sleep(10); + }); + } + } +} diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/AltTask/LoopAwaitable.cs.meta b/Assets/UniGLTF/Runtime/UniGLTF/IO/AltTask/LoopAwaitable.cs.meta new file mode 100644 index 000000000..125c21d2f --- /dev/null +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/AltTask/LoopAwaitable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: db36517c11c455e4b94d9cbb8c1cc3ff +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs index 96b69ba24..bc9828bfb 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs @@ -391,7 +391,7 @@ namespace UniGLTF Nodes.Add(NodeImporter.ImportNode(GLTF.nodes[i], i).transform); } } - await Awaitable.Delay(); + await LoopAwaitable.Create(); using (MeasureTime("BuildHierarchy")) { @@ -416,7 +416,7 @@ namespace UniGLTF t.SetParent(Root.transform, false); } } - await Awaitable.Delay(); + await LoopAwaitable.Create(); using (MeasureTime("AnimationImporter")) { @@ -434,7 +434,7 @@ namespace UniGLTF protected virtual async Awaitable OnLoadModel() { Root.name = "GLTF"; - await Awaitable.Delay(); + await LoopAwaitable.Create(); } async Awaitable BuildMeshAsync(MeshImporter.MeshContext x, int i) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshImporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshImporter.cs index 5952b9349..ce0bdb40c 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshImporter.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshImporter.cs @@ -660,9 +660,9 @@ namespace UniGLTF if (recalculateTangents) { - await Awaitable.Delay(); + await LoopAwaitable.Create(); mesh.RecalculateTangents(); - await Awaitable.Delay(); + await LoopAwaitable.Create(); } // 先にすべてのマテリアルを作成済みなのでテクスチャーは生成済み。Resultを使ってよい @@ -672,7 +672,7 @@ namespace UniGLTF Materials = meshContext.MaterialIndices.Select(x => ctx.GetMaterial(x)).ToArray() }; - await Awaitable.Delay(); + await LoopAwaitable.Create(); if (meshContext.BlendShapes.Count > 0) { var emptyVertices = new Vector3[mesh.vertexCount]; diff --git a/Assets/VRM/Runtime/IO/VRMImporterContext.cs b/Assets/VRM/Runtime/IO/VRMImporterContext.cs index 3f4029003..a3ae2051c 100644 --- a/Assets/VRM/Runtime/IO/VRMImporterContext.cs +++ b/Assets/VRM/Runtime/IO/VRMImporterContext.cs @@ -61,26 +61,26 @@ namespace VRM { await LoadMetaAsync(); } - await Awaitable.Delay(); + await LoopAwaitable.Create(); using (MeasureTime("VRM LoadHumanoid")) { LoadHumanoid(); } - await Awaitable.Delay(); + await LoopAwaitable.Create(); using (MeasureTime("VRM LoadBlendShapeMaster")) { LoadBlendShapeMaster(); } - await Awaitable.Delay(); + await LoopAwaitable.Create(); using (MeasureTime("VRM LoadSecondary")) { VRMSpringUtility.LoadSecondary(Root.transform, Nodes, VRM.secondaryAnimation); } - await Awaitable.Delay(); + await LoopAwaitable.Create(); using (MeasureTime("VRM LoadFirstPerson")) {