From 464a5c895326a89840ed2ba4acd604e5bd8bafbc Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 14 Jun 2023 16:45:42 +0900 Subject: [PATCH] VrmAnimationInstance --- .../Components/VrmAnimationInstance.meta | 8 ++++ .../VrmAnimationInstance.cs | 30 +++++++++++++++ .../VrmAnimationInstance.cs.meta | 11 ++++++ .../VRM10Viewer/Motions/VrmAnimation.cs | 38 ++++++------------- 4 files changed, 61 insertions(+), 26 deletions(-) create mode 100644 Assets/VRM10/Runtime/Components/VrmAnimationInstance.meta create mode 100644 Assets/VRM10/Runtime/Components/VrmAnimationInstance/VrmAnimationInstance.cs create mode 100644 Assets/VRM10/Runtime/Components/VrmAnimationInstance/VrmAnimationInstance.cs.meta diff --git a/Assets/VRM10/Runtime/Components/VrmAnimationInstance.meta b/Assets/VRM10/Runtime/Components/VrmAnimationInstance.meta new file mode 100644 index 000000000..bf657e5d1 --- /dev/null +++ b/Assets/VRM10/Runtime/Components/VrmAnimationInstance.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a6fde18d19837ab488a01dac4ddc962e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRM10/Runtime/Components/VrmAnimationInstance/VrmAnimationInstance.cs b/Assets/VRM10/Runtime/Components/VrmAnimationInstance/VrmAnimationInstance.cs new file mode 100644 index 000000000..0b29d09b9 --- /dev/null +++ b/Assets/VRM10/Runtime/Components/VrmAnimationInstance/VrmAnimationInstance.cs @@ -0,0 +1,30 @@ +using UniHumanoid; +using UnityEngine; + +namespace UniVRM10 +{ + public class VrmAnimationInstance : MonoBehaviour + { + public SkinnedMeshRenderer BoxMan; + public (INormalizedPoseProvider, ITPoseProvider) ControlRig; + + public void Initialize() + { + var humanoid = gameObject.AddComponent(); + if (humanoid.AssignBonesFromAnimator()) + { + // require: transform is T-Pose + var provider = new InitRotationPoseProvider(transform, humanoid); + ControlRig = (provider, provider); + + // create SkinnedMesh for bone visualize + var animator = GetComponent(); + BoxMan = SkeletonMeshUtility.CreateRenderer(animator); + var material = new Material(Shader.Find("Standard")); + BoxMan.sharedMaterial = material; + var mesh = BoxMan.sharedMesh; + mesh.name = "box-man"; + } + } + } +} diff --git a/Assets/VRM10/Runtime/Components/VrmAnimationInstance/VrmAnimationInstance.cs.meta b/Assets/VRM10/Runtime/Components/VrmAnimationInstance/VrmAnimationInstance.cs.meta new file mode 100644 index 000000000..81ed9bff9 --- /dev/null +++ b/Assets/VRM10/Runtime/Components/VrmAnimationInstance/VrmAnimationInstance.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 69dfb9ffd7c663f4cadc81e38a377672 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/VRM10_Samples/VRM10Viewer/Motions/VrmAnimation.cs b/Assets/VRM10_Samples/VRM10Viewer/Motions/VrmAnimation.cs index d2cd6c63b..f1b2b02ca 100644 --- a/Assets/VRM10_Samples/VRM10Viewer/Motions/VrmAnimation.cs +++ b/Assets/VRM10_Samples/VRM10Viewer/Motions/VrmAnimation.cs @@ -9,50 +9,33 @@ namespace UniVRM10.VRM10Viewer { public class VrmAnimation : IMotion { - private RuntimeGltfInstance m_instance; - public SkinnedMeshRenderer m_boxMan; - public SkinnedMeshRenderer BoxMan => m_boxMan; - private (INormalizedPoseProvider, ITPoseProvider) m_controlRig; - (INormalizedPoseProvider, ITPoseProvider) IMotion.ControlRig => m_controlRig; + private readonly VrmAnimationInstance m_instance; + + (INormalizedPoseProvider, ITPoseProvider) IMotion.ControlRig => m_instance.ControlRig; public IDictionary ExpressionMap { get; } = new Dictionary(); - public VrmAnimation(RuntimeGltfInstance instance) + public VrmAnimation(VrmAnimationInstance instance) { m_instance = instance; if (instance.GetComponent() is Animation animation) { animation.Play(); } - - var humanoid = instance.gameObject.AddComponent(); - if (humanoid.AssignBonesFromAnimator()) - { - var provider = new InitRotationPoseProvider(instance.transform, humanoid); - m_controlRig = (provider, provider); - - // create SkinnedMesh for bone visualize - var animator = instance.GetComponent(); - m_boxMan = SkeletonMeshUtility.CreateRenderer(animator); - var material = new Material(Shader.Find("Standard")); - BoxMan.sharedMaterial = material; - var mesh = BoxMan.sharedMesh; - mesh.name = "box-man"; - } } public void ShowBoxMan(bool enable) { - if (m_boxMan != null) + if (m_instance.BoxMan != null) { - m_boxMan.enabled = enable; + m_instance.BoxMan.enabled = enable; } } public void Dispose() { - if (m_boxMan != null) + if (m_instance.BoxMan != null) { - GameObject.Destroy(m_boxMan.gameObject); + GameObject.Destroy(m_instance.BoxMan.gameObject); } } @@ -64,7 +47,10 @@ namespace UniVRM10.VRM10Viewer loader.InvertAxis = Axes.X; var instance = await loader.LoadAsync(new ImmediateCaller()); - var animation = new VrmAnimation(instance); + var animationInstance = instance.gameObject.AddComponent(); + animationInstance.Initialize(); + + var animation = new VrmAnimation(animationInstance); foreach (var (preset, transform) in loader.GetExpressions()) { animation.ExpressionMap.Add(preset, transform);