/// <summary> /// アニメーションクリップに、指定されたマテリアルを追加します。 /// </summary> /// <param name="avatar"></param> /// <param name="animationClip"></param> /// <param name="name"></param> /// <param name="binding"></param> /// <param name="secondsList"></param> private static void SetBlendShapeCurve( AnimationClip animationClip, GameObject avatar, string vrmBlendShapeName, IEnumerable <MaterialValueBinding> bindings, IEnumerable <float> secondsList ) { var materials = avatar.transform.Find(VRChatUtility.AutoBlinkMeshPath) .GetComponent <SkinnedMeshRenderer>().sharedMaterials; var materialIndex = materials.ToList().FindIndex(m => m.name == bindings.First().MaterialName); var material = Duplicator.DuplicateAssetToFolder <Material>( source: materials[materialIndex], prefabInstance: avatar, fileName: $"{materials[materialIndex].name}-{vrmBlendShapeName}.mat" ); VRMUtility.Bake(material, bindings); AnimationUtility.SetObjectReferenceCurve( animationClip, new EditorCurveBinding() { path = VRChatUtility.AutoBlinkMeshPath, type = typeof(SkinnedMeshRenderer), propertyName = $"m_Materials.Array.data[{materialIndex}]", }, secondsList .Select(seconds => new ObjectReferenceKeyframe() { time = seconds, value = material }).ToArray() ); }