public static AnimationClip RequireClip(this Animation argAnimation, AnimationClip argMasterClip,
            string argClipName, int argStart, int argEnd, bool argAddLoopFrame, WrapMode wrapMode, int layer, float speed)
        {
            AnimationState state = argAnimation[argClipName];
            if (state == null)
                argAnimation.AddClip(argMasterClip, argClipName, argStart, argEnd, argAddLoopFrame);

            state = argAnimation[argClipName];
            state.speed = 1;
            state.wrapMode = wrapMode;
            state.layer = layer;
            return state.clip;
        }
        public static void CrossFade(this Animation argAnimation,
            string argClipName, int argStart, int argEnd, bool argAddLoopFrame)
        {
            AnimationState state = argAnimation[argClipName];
            if (state != null)
            {
                string animationName = argAnimation.UniqueName(argClipName);
                argAnimation.AddClip(state.clip, animationName,
                    argStart, argEnd, argAddLoopFrame);

                argAnimation.CrossFade(animationName);
            }
        }
    /// <summary>
    /// Play an animation clip.
    /// </summary>
    /// <param name="animation">Animation component instance.</param>
    /// <param name="clip">Clip to play. If not in animation then it will be added.</param>
    /// <param name="reverse">Should the animation be played in reverse?</param>
    /// <returns>Animation clip in seconds.</returns>
    public static float Play(this Animation animation, AnimationClip clip, bool reverse = false)
    {
        if (clip == null) return 0f;

        string clipName = clip.name;
        if (animation.GetClip(clipName) == null)
        {
            animation.AddClip(clip, clipName);
        }
        animation[clipName].normalizedSpeed = reverse ? -1f : 1f;
        animation[clipName].normalizedTime = reverse ? 1f : 0f;
        animation.Play(clipName);
        return clip.length;
    }