RuntimeImportの際はmaterialを複製しないように修正

This commit is contained in:
notargs
2025-06-26 21:23:16 +09:00
parent 70c0c40fb8
commit 21155c332f
6 changed files with 41 additions and 23 deletions

View File

@@ -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);

View File

@@ -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, float>(ExpressionKey.Comparer);
m_morphTargetBindingMerger = new MorphTargetBindingMerger(m_clipMap, root);
m_materialValueBindingMerger = new MaterialValueBindingMerger(m_clipMap, root);
m_materialValueBindingMerger = new MaterialValueBindingMerger(m_clipMap, root, isPrefabInstance);
}
/// <summary>

View File

@@ -53,29 +53,44 @@ namespace UniVRM10
/// </summary>
Dictionary<string, PreviewMaterialItem> m_materialMap = new Dictionary<string, PreviewMaterialItem>();
void InitializeMaterialMap(Dictionary<ExpressionKey, VRM10Expression> clipMap, Transform root)
void InitializeMaterialMap(Dictionary<ExpressionKey, VRM10Expression> clipMap, Transform root, bool isPrefabInstance)
{
Dictionary<string, Material> materialNameMap = new Dictionary<string, Material>();
var materialNameMap = new Dictionary<string, Material>();
foreach (var renderer in root.GetComponentsInChildren<Renderer>())
{
// 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<ExpressionKey, VRM10Expression> clipMap, Transform root)
public MaterialValueBindingMerger(Dictionary<ExpressionKey, VRM10Expression> clipMap, Transform root, bool isPrefabInstance)
{
InitializeMaterialMap(clipMap, root);
InitializeMaterialMap(clipMap, root, isPrefabInstance);
}
public void Dispose()

View File

@@ -141,8 +141,11 @@ namespace UniVRM10
}
var initPose = RuntimeGltfInstance.SafeGetInitialPose(transform);
// NOTE: RuntimeGltfInstanceがないかどうかでPrefabのインスタンスであるかEditorImportされているかが判別できる
var isPrefabInstance = !GetComponent<RuntimeGltfInstance>();
return new Vrm10Runtime(this, useControlRig, m_springBoneRuntime, initPose);
return new Vrm10Runtime(this, useControlRig, m_springBoneRuntime, initPose, isPrefabInstance);
}
public Vrm10Runtime Runtime

View File

@@ -52,7 +52,7 @@ namespace UniVRM10
IReadOnlyDictionary<Transform, TransformState> _initPose;
public Vrm10Runtime(Vrm10Instance instance, bool useControlRig, IVrm10SpringBoneRuntime springBoneRuntime,
IReadOnlyDictionary<Transform, TransformState> initPose)
IReadOnlyDictionary<Transform, TransformState> initPose, bool isPrefabInstance)
{
if (!Application.isPlaying)
{
@@ -77,7 +77,7 @@ namespace UniVRM10
}
Constraints = instance.GetComponentsInChildren<IVrm10Constraint>();
LookAt = new Vrm10RuntimeLookAt(instance, instance.Humanoid, ControlRig);
Expression = new Vrm10RuntimeExpression(instance, LookAt.EyeDirectionApplicable);
Expression = new Vrm10RuntimeExpression(instance, LookAt.EyeDirectionApplicable, isPrefabInstance);
SpringBone = springBoneRuntime;
}

View File

@@ -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();