/// <summary> /// 単一アニメーションループ用に、空のコントローラーとアニメーションクリップを作成します。 /// </summary> /// <remarks> /// 保存先にすでにアニメーションクリップが存在する場合、空にして返します。 /// </remarks> /// <param name="avatar"></param> /// <param name="name"></param> private static AnimatorController CreateSingleAnimatorController(GameObject avatar, string name) { var path = Duplicator .DetermineAssetPath(prefabInstance: avatar, type: typeof(AnimatorController), fileName: name); var controllerPath = path + ".controller"; var clipPath = path + ".anim"; var controller = AssetDatabase.LoadAssetAtPath <AnimatorController>(controllerPath); var clip = AssetDatabase.LoadAssetAtPath <AnimationClip>(clipPath); if (controller && clip) { clip.ClearCurves(); return(controller); } AssetDatabase.MoveAssetToTrash(controllerPath); AssetDatabase.MoveAssetToTrash(clipPath); clip = new AnimationClip(); AnimationClipSettings settings = AnimationUtility.GetAnimationClipSettings(clip); settings.loopTime = true; AnimationUtility.SetAnimationClipSettings(clip, settings); AssetDatabase.CreateAsset(clip, clipPath); return(AnimatorController.CreateAnimatorControllerAtPathWithClip(controllerPath, clip)); }
/// <summary> /// 表情の設定を行うアニメーションクリップを作成します。 /// </summary> /// <param name="avatar"></param> /// <param name="vrmBlendShape"></param> /// <param name="clips"></param> /// <returns></returns> private static AnimationClip CreateFeeling( GameObject avatar, VRMBlendShapeClip clip, ref IEnumerable <VRMBlendShapeClip> clips ) { var fileName = clip.Preset + ".anim"; #if VRC_SDK_VRCSDK2 var anim = Duplicator.DuplicateAssetToFolder <AnimationClip>( source: UnityPath.FromUnityPath(Converter.RootFolderPath).Child("animations") .Child(BlendShapeReplacer.MappingBlendShapeToVRChatAnim[clip.Preset] + ".anim") .LoadAsset <AnimationClip>(), prefabInstance: avatar, fileName ); Transform transform = avatar.transform.Find(VRChatUtility.AutoBlinkMeshPath); if (transform.GetComponent <Animator>()) { var curve = new AnimationCurve(); foreach (var(seconds, value) in BlendShapeReplacer.NeutralAndBlinkStopperWeights) { curve.AddKey(new Keyframe(seconds, value)); } anim.SetCurve( VRChatUtility.AutoBlinkMeshPath, typeof(Behaviour), "m_Enabled", curve ); clips = BlendShapeReplacer.DuplicateShapeKeyToUnique(avatar, clip, clips); } #else var anim = new AnimationClip(); AssetDatabase.CreateAsset( anim, Duplicator.DetermineAssetPath(prefabInstance: avatar, typeof(AnimationClip), fileName) ); clips = BlendShapeReplacer.DuplicateShapeKeyToUnique(avatar, clip, clips); #endif SetBlendShapeCurves( avatar, animationClip: anim, clip: clip, keys: new Dictionary <float, float> { { 0, 1 }, { anim.length, 1 }, } ); return(anim); }