mirror of
https://github.com/vrm-c/UniVRM.git
synced 2026-09-07 19:38:13 -05:00
RuntimeImportの際はmaterialを複製しないように修正
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user