/// <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);
        }