From 21155c332fb66da67c342e2fdd270be054d18ddb Mon Sep 17 00:00:00 2001 From: notargs Date: Thu, 26 Jun 2025 21:23:16 +0900 Subject: [PATCH] =?UTF-8?q?RuntimeImport=E3=81=AE=E9=9A=9B=E3=81=AFmateria?= =?UTF-8?q?l=E3=82=92=E8=A4=87=E8=A3=BD=E3=81=97=E3=81=AA=E3=81=84?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GltfScriptedImporterBase.cs | 2 +- .../Components/Expression/ExpressionMerger.cs | 4 +- .../Expression/MaterialValueBindingMerger.cs | 45 ++++++++++++------- .../Components/Vrm10Instance/Vrm10Instance.cs | 5 ++- .../Components/Vrm10Runtime/Vrm10Runtime.cs | 4 +- .../Vrm10Runtime/Vrm10RuntimeExpression.cs | 4 +- 6 files changed, 41 insertions(+), 23 deletions(-) diff --git a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GltfScriptedImporterBase.cs b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GltfScriptedImporterBase.cs index d7588cbcf..83dd81993 100644 --- a/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GltfScriptedImporterBase.cs +++ b/Assets/UniGLTF/Editor/UniGLTF/ScriptedImporter/GltfScriptedImporterBase.cs @@ -61,7 +61,7 @@ namespace UniGLTF context.AddObjectToAsset(k.Name, o); }); var root = loaded.Root; - GameObject.DestroyImmediate(loaded); + DestroyImmediate(loaded); context.AddObjectToAsset(root.name, root); context.SetMainObject(root); diff --git a/Assets/VRM10/Runtime/Components/Expression/ExpressionMerger.cs b/Assets/VRM10/Runtime/Components/Expression/ExpressionMerger.cs index 8fe59c146..e178df0c5 100644 --- a/Assets/VRM10/Runtime/Components/Expression/ExpressionMerger.cs +++ b/Assets/VRM10/Runtime/Components/Expression/ExpressionMerger.cs @@ -25,7 +25,7 @@ namespace UniVRM10 MaterialValueBindingMerger m_materialValueBindingMerger; - public ExpressionMerger(VRM10ObjectExpression expressions, Transform root) + public ExpressionMerger(VRM10ObjectExpression expressions, Transform root, bool isPrefabInstance) { m_clipMap = expressions.Clips.ToDictionary( x => expressions.CreateKey(x.Clip), @@ -34,7 +34,7 @@ namespace UniVRM10 ); m_valueMap = new Dictionary(ExpressionKey.Comparer); m_morphTargetBindingMerger = new MorphTargetBindingMerger(m_clipMap, root); - m_materialValueBindingMerger = new MaterialValueBindingMerger(m_clipMap, root); + m_materialValueBindingMerger = new MaterialValueBindingMerger(m_clipMap, root, isPrefabInstance); } /// diff --git a/Assets/VRM10/Runtime/Components/Expression/MaterialValueBindingMerger.cs b/Assets/VRM10/Runtime/Components/Expression/MaterialValueBindingMerger.cs index ee1c75cd9..d754cffe0 100644 --- a/Assets/VRM10/Runtime/Components/Expression/MaterialValueBindingMerger.cs +++ b/Assets/VRM10/Runtime/Components/Expression/MaterialValueBindingMerger.cs @@ -53,29 +53,44 @@ namespace UniVRM10 /// Dictionary m_materialMap = new Dictionary(); - void InitializeMaterialMap(Dictionary clipMap, Transform root) + void InitializeMaterialMap(Dictionary clipMap, Transform root, bool isPrefabInstance) { - Dictionary materialNameMap = new Dictionary(); + var materialNameMap = new Dictionary(); foreach (var renderer in root.GetComponentsInChildren()) { // VFXRendererなど、Materialが設定できないRendererが存在する if (renderer is not SkinnedMeshRenderer && renderer is not MeshRenderer) continue; - var sharedMaterials = renderer.sharedMaterials; - var materials = renderer.materials; - for (var i = 0; i < materials.Length; i++) + if (isPrefabInstance) { - var sharedMaterial = sharedMaterials[i]; - var material = materials[i]; + // EditorImportされたPrefabのInstanceとして生成されている場合、Materialを複製する + var sharedMaterials = renderer.sharedMaterials; + var materials = renderer.materials; + for (var i = 0; i < materials.Length; i++) + { + var sharedMaterial = sharedMaterials[i]; + var material = materials[i]; - if (!sharedMaterial || !material) continue; + if (!sharedMaterial || !material) continue; - // 複製されたマテリアルはこのクラス内で破棄 - if (sharedMaterial != material) _clonedMaterials.Add(material); + // 複製されたマテリアルはこのクラス内で破棄 + if (sharedMaterial != material) _clonedMaterials.Add(material); - // 複製前の名前を記録しておく - // なお、Vrm10Runtimeのインスタンスが作られるより先にユーザーによってMaterialが複製されるパターンは想定しない - materialNameMap.TryAdd(sharedMaterial.name, material); + // 複製前の名前を記録しておく + // なお、Vrm10Runtimeのインスタンスが作られるより先にユーザーによってMaterialが複製されるパターンは想定しない + materialNameMap.TryAdd(sharedMaterial.name, material); + } + } + else + { + // PrefabのInstanceでない(RuntimeImportされている)ならMaterialは複製しない + foreach (var material in renderer.sharedMaterials) + { + if (material) + { + materialNameMap.TryAdd(material.name, material); + } + } } } @@ -299,9 +314,9 @@ namespace UniVRM10 } #endregion - public MaterialValueBindingMerger(Dictionary clipMap, Transform root) + public MaterialValueBindingMerger(Dictionary clipMap, Transform root, bool isPrefabInstance) { - InitializeMaterialMap(clipMap, root); + InitializeMaterialMap(clipMap, root, isPrefabInstance); } public void Dispose() diff --git a/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10Instance.cs b/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10Instance.cs index f27be9aea..5b4d46531 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10Instance.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Instance/Vrm10Instance.cs @@ -141,8 +141,11 @@ namespace UniVRM10 } var initPose = RuntimeGltfInstance.SafeGetInitialPose(transform); + + // NOTE: RuntimeGltfInstanceがないかどうかでPrefabのインスタンスであるか(EditorImportされているか)が判別できる + var isPrefabInstance = !GetComponent(); - return new Vrm10Runtime(this, useControlRig, m_springBoneRuntime, initPose); + return new Vrm10Runtime(this, useControlRig, m_springBoneRuntime, initPose, isPrefabInstance); } public Vrm10Runtime Runtime diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs index c6e8661e2..5a800d2e1 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10Runtime.cs @@ -52,7 +52,7 @@ namespace UniVRM10 IReadOnlyDictionary _initPose; public Vrm10Runtime(Vrm10Instance instance, bool useControlRig, IVrm10SpringBoneRuntime springBoneRuntime, - IReadOnlyDictionary initPose) + IReadOnlyDictionary initPose, bool isPrefabInstance) { if (!Application.isPlaying) { @@ -77,7 +77,7 @@ namespace UniVRM10 } Constraints = instance.GetComponentsInChildren(); LookAt = new Vrm10RuntimeLookAt(instance, instance.Humanoid, ControlRig); - Expression = new Vrm10RuntimeExpression(instance, LookAt.EyeDirectionApplicable); + Expression = new Vrm10RuntimeExpression(instance, LookAt.EyeDirectionApplicable, isPrefabInstance); SpringBone = springBoneRuntime; } diff --git a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeExpression.cs b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeExpression.cs index 62603029d..902654f35 100644 --- a/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeExpression.cs +++ b/Assets/VRM10/Runtime/Components/Vrm10Runtime/Vrm10RuntimeExpression.cs @@ -23,9 +23,9 @@ namespace UniVRM10 public float LookAtOverrideRate { get; private set; } public float MouthOverrideRate { get; private set; } - internal Vrm10RuntimeExpression(Vrm10Instance target, ILookAtEyeDirectionApplicable eyeDirectionApplicable) + internal Vrm10RuntimeExpression(Vrm10Instance target, ILookAtEyeDirectionApplicable eyeDirectionApplicable, bool isPrefabInstance) { - _merger = new ExpressionMerger(target.Vrm.Expression, target.transform); + _merger = new ExpressionMerger(target.Vrm.Expression, target.transform, isPrefabInstance); _keys = target.Vrm.Expression.Clips .Select(x => target.Vrm.Expression.CreateKey(x.Clip)) .ToList();