Animation动画详解

Unity的Animation动画

  • Animation动画制作
    • 创建Animation
    • Animation组件
      • 调用Animation需要进行的操作
  • Animation代码调用
    • 如何Animation内部添加回调函数
  • Animation常用的方法

Animation动画制作

目前的animation大多使用于前端的部分效果动画,比如界面打开关闭界面的效果。

创建Animation

选中待提添加动画的物体,Window—>Animation(Ctrl+6),弹出下图视图窗口。
注意:如果选中的物体无Animation/Animator组件,会自动添加Animator组件。如使用旧版Animation动画,可先添加Animation组件后再进行此操作。 Animation动画详解_第1张图片单击Create按钮,在弹出的对话框中为待新建的Animation动画命名并选择保存路径,单击保存。
Animation动画详解_第2张图片保存后Animation视图变为可编辑状态。同时在对应路径会生成Animation文件。
如未在物体添加Animator组件,会自动在物体检视视图添加此组件,并生成同名Animator文件。
通过Add Property添加制作动画Animation动画详解_第3张图片
更改不同属性相应的参数,即可制作动画。
在录制状态下,可以通过直接设置更改场景视图或检视视图的属性参数来制作动画。
设置精灵切换时,可以直接将精灵拖拽到对应帧的位置即可。
当前动画名字,下拉可以创建新的Animation动画。
在这里插入图片描述 添加事件。
在这里插入图片描述 添加关键帧。

Animation组件

Animation动画详解_第4张图片

Animation 组件含义
Animation 默认动画
Animations 动画(所有动画,size:动画个数,element:第一动画,第二动画。。。。)
Play Automatically 自动播放
Animate Physics 动画物理
Culling Type 剔除类型
Always Animate 总是动画化(总是播放动画)
Based On Renderers 看不到此物体时,则不播放此物体动画

调用Animation需要进行的操作

找到此动画,选择Debug属性
Animation动画详解_第5张图片legacy选择对勾属性;
wrap Mode 根据自我选择来设置不同类型;
Animation动画详解_第6张图片

Animation代码调用

using UnityEngine;
public class Anim1 : MonoBehaviour
{
    public Animation Animation;
    public void Start()
    {
        //获取动画组件
        Animation = transform.GetComponent<Animation>();
    }
    public void Update()
    {
        if (Input.GetKey(KeyCode.A))
            Animation.Play();//播放默认动画
        if (Input.GetKey(KeyCode.Space))
        {   //播放名字为animation2的动画
            Animation.Play("animation2");
            //到播名字为animation2的动画
            Animation["animation2"].time = Animation["animation2"].length;//获取动画长度
            Animation["animation2"].speed = -1.0f;
            Animation.CrossFade("animation2");
        }
    }
    //动画内部添加的回调函数
    public void line()
    {
        Debug.LogWarning("tyuiop[");
    }
}

如何Animation内部添加回调函数

Animation动画详解_第7张图片第一步:点击创建回调函数;
第二步:创建的回调函数移动到动画的位置;
第三步:输入需要回调的函数名字,和输入参数;
**如果有回调函数;回调函数名字必须是绑定动画的GameObject的脚步中的方法 **

Animation常用的方法

        // Animation
        animation.AddClip(new AnimationClip(), "NewAnimName");
        animation.AddClip(new AnimationClip(), "NewAnimName", 1/*首帧*/, 2/*尾帧*/);
        animation.AddClip(new AnimationClip(), "NewAnimName", 1, 2, true/*是否应该在最后插入一个额外的帧匹配第一帧?如果你在制作一个循环的动画,那么可以打开这个选项*/);
        animation.clip = null;  // 默认动画
        // 淡入淡出切换动画
        animation.CrossFade("AnimName");
        animation.CrossFade("AnimName", 1f/*混合时长*/);
        animation.CrossFade("AnimName", 1f, PlayMode.StopAll/*立即开始播放重复的动画状态*/);
        animation.CrossFade("AnimName", 1f, PlayMode.StopSameLayer/*停止相同动画层级的动画*/);
        animation.CrossFadeQueued("AnimName");
        animation.CrossFadeQueued("AnimName", 1f/*混合时长*/);
        animation.CrossFadeQueued("AnimName", 1f, QueueMode.CompleteOthers/*等待其它动画停止后淡入淡出*/);
        animation.CrossFadeQueued("AnimName", 1f, QueueMode.CompleteOthers, PlayMode.StopAll/*立即开始播放重复的动画状态*/);
        animation.CrossFadeQueued("AnimName", 1f, QueueMode.CompleteOthers, PlayMode.StopSameLayer/*停止相同动画层级的动画*/);
        animation.CrossFadeQueued("AnimName", 1f, QueueMode.PlayNow/*立即开始播放重复的动画状态*/);
        animation.CrossFadeQueued("AnimName", 1f, QueueMode.PlayNow, PlayMode.StopAll);
        animation.CrossFadeQueued("AnimName", 1f, QueueMode.PlayNow, PlayMode.StopSameLayer);
        animation.cullingType = AnimationCullingType.AlwaysAnimate; // 不管在不在视窗内都播放
        animation.cullingType = AnimationCullingType.BasedOnRenderers;  // 只在渲染该物体时才播放
        animation.enabled = false;
        animation.GetClip("AnimName");
        animation.GetClipCount();
        animation.IsPlaying("AnimName");
        bool bIsPlaying = animation.isPlaying;
        Bounds bounds = animation.localBounds;
        animation.Play(PlayMode.StopAll/*停止其它*/);   // 播放默认动画
        animation.Play(PlayMode.StopSameLayer/*停止相同动画层级的动画*/);  // 播放默认动画
        animation.Play("AnimName");
        animation.Play("AnimName", PlayMode.StopAll/*停止其它*/);
        animation.Play("AnimName", PlayMode.StopSameLayer/*停止相同动画层级的动画*/);
        animation.playAutomatically = false;    // 是否应该在启动时自动开始播放
        animation.PlayQueued("AnimName");//动画不能有循环的动画
        animation.PlayQueued("AnimName", QueueMode.CompleteOthers/*等待其它动画停止后淡入淡出*/);
        animation.PlayQueued("AnimName", QueueMode.PlayNow/*等待其它动画停止后立即开始播放*/);
        animation.RemoveClip("AnimName");
        animation.Rewind(); // 倒播所有动画
        animation.Rewind("AnimName");   // 倒播名为name的动画
        animation.SyncLayer(1); // 同步某层中所有动画的播放速度
        // 如何处理超出剪辑播放范围的时间
        animation.wrapMode = WrapMode.Clamp;/*停在尾帧*/
        animation.wrapMode = WrapMode.ClampForever/*停在尾帧并保持播放*/;
        animation.wrapMode = WrapMode.Default/*从动画剪辑中读取循环模式(默认是Once)*/;
        animation.wrapMode = WrapMode.Loop/*循环播放*/;
        animation.wrapMode = WrapMode.Once/*播完停止*/;
        animation.wrapMode = WrapMode.PingPong/*往复式循环播放*/;
        AnimationState MyAnimationState = animation["AnimName"];
        AnimationClip MyAnimationClip = animationState.clip;
        AnimationClip MyAnimationClip2 = animation.GetClip("AnimName");
        animationState.AddMixingTransform(transform);   // 给某个节点及其子节点播放动画 animation["wave_hand"].AddMixingTransform(transform.Find("root/upper_body/left_shoulder"));
        animationState.AddMixingTransform(transform, true/*是否影响子节点*/);
        animationState.RemoveMixingTransform(transform);
        animationState.blendMode = AnimationBlendMode.Additive; // 叠加混合
        animationState.blendMode = AnimationBlendMode.Blend;    // 混合
        animationState.enabled = false;
        animationState.layer = 1;   // 动画层级高代表权重高
        float fLength = animationState.length;  // 时长(秒)
        animationState.name = "AnimStateName";
        animationState.normalizedSpeed = 1f;    // 同步播放速度 请用SyncLayer代替
        animationState.normalizedTime = 1f; // 把时间标准化为0f ~ 1f
        animationState.speed = 1f;
        animationState.time = 1f;   // 当前时间
        animationState.weight = 1f; // 权重
        // 结束方式
        animationState.wrapMode = WrapMode.Clamp;/*停在尾帧*/
        animationState.wrapMode = WrapMode.ClampForever;/*停在尾帧并保持播放*/
        animationState.wrapMode = WrapMode.Default;/*从动画剪辑中读取循环模式(默认是Once)*/
        animationState.wrapMode = WrapMode.Loop;/*循环播放*/
        animationState.wrapMode = WrapMode.Once;/*播完停止*/
        animationState.wrapMode = WrapMode.PingPong;/*往复式循环播放*/

你可能感兴趣的:(游戏开发)