Bootstrap

Mecanim动画系统

Mecanim 新特性

针对人形角色提供了一种特殊的工作流,包含 Avatar 的创建和对肌肉的调节。

动画重定向的能力,可以非常方便地把动画从一个角色模型应用到其他角色模型上。

提供了可视化 Animator 视窗,可以直观地通过动画参数和 Transition(动画过渡线)等管理各个动画间的过度。

Mecanim 动画系统常见术语

Animator (Mecanim 动画系统组件)

AnimatorController 动画控制器(动画控制器资源相当于一个容器,我们可以通过创建多个动画节点,并形成动画状态机,来处理各个动画之间的过度以及播放逻辑)

Avatar(将角色的骨骼转换为 Mecanim 可识别的骨骼)

Retargeting(角色之间动画的互用也可以说是动画重定向)

使用步骤

  1. .选择到模型源文件查看在这里插入图片描述

  2. 将动画模式调整为 Mecanim 可识别样式在这里插入图片描述(人类,动画可以复用)在这里插入图片描述(非人类,动画不能复用)

Animation 动画样式为在这里插入图片描述

  1. 点击 Apply按钮 应用到模型

  2. 在这里插入图片描述(若为对勾显示则骨骼匹配成功,若为叉号显示则需要重新匹配)

  3. 创建在这里插入图片描述在这里插入图片描述

给到角色上在这里插入图片描述

  1. 找到window下Animator 面板 将需要的动画拖到面板中即可。

注:需要重新匹配点击Configure在这里插入图片描述进入此界面在这里插入图片描述
找到在这里插入图片描述在这里插入图片描述
如果还未解决 × ,点击Clear按钮,重新进行红色的123步骤。

动画状态机动画切换

在Animationar窗口中,在这里插入图片描述此颜色的动画状态,说明此动画为默认动画(此处跳舞为默认动画)

  1. 若想实现角色从待机切换到跳舞效果,先将待机动画拖拽到 Animator 面板(或者右键创建 Empty,将右边属性 motion 选择待机动画)-> 将待机动画设置为默认动画(在待机动画状态右键选择在这里插入图片描述
    ) -> 在这里插入图片描述待机动画即为默认动画 -> 在待机动画状态右键选择在这里插入图片描述 -> 在这里插入图片描述

  2. 添加动画参数
    在这里插入图片描述

  3. 选择动画过渡线设置条件
    在这里插入图片描述

private Animator anim;
private void Start()
{
    anim = this.GetComponent<Animator>();
}
private void Update()
{
    //if(anim != null)
    if(anim)
    {        
        anim.SetBool("AttackBool",Input.GetKeyDown(KeyCode.Space));
    }
}

练习

private Animator anim;
private void Start()
{
    anim = this.GetComponent<Animator>();
}
private void Update()
{
    //练习:待机(没有点任何按钮)跑(点击垂直轴)
    if(anim)
    {
        anim.SetFloat("WSFloat",Mathf.Abs(Input.GetAxis("Vertical")));
        anim.SetFloat("ADFloat",Mathf.Abs(Input.GetAxis("Horizontal")));
        //anim.SetBool("WSFloat",Input.GetAxis("Vertical") != 0)
    }
}

在这里插入图片描述

自定义按键

面板位置:Edit-Project Settings-Input Manager

在Input Manager中添加自定义按键

//使用自定义按键
Input.GetButton("Speed");//Speed是自定义按键名

在这里插入图片描述

注:如果Positive Button等属性不能正常赋值,可能是 值 不规范。

Mecanim BlendTree(混合树)

待机->跑 0、左-1 右 1 跑(水平轴)

(可实现一个动画状态有多个动画效果,如跑,既可以前跑也可以左右跑)

在这里插入图片描述

在这里插入图片描述

Mecanim BlendTree 2D

在这里插入图片描述

通过 2 个动画参数控制动画切换
InputWS InputAD 分别对应 POSX 与 POSY 两个数值

myAnim.SetFloat("InputWS",Input.GetAxis("Vertical"));
myAnim.SetFloat("InputAD",Input.GetAxis("Horizontal"));

Mecanim 层设置,用于角色动画混合效果(如:边跑边攻击

在这里插入图片描述

//设置层的权重
anim.SetLayerWeight(LayerIndex:layerIndex,Value:value);
//读取层的权重
float a = anim.GetLayerWeight(layerIndex:layerIndex);

动画事件

找到角色源文件->找到需要的动画->在这里插入图片描述

在这里插入图片描述

此脚本给在角色上,当攻击动画将要播放完时调用 AttackBool();

public void AttackBool(Texture myTex)
{
    myBool = false;
    print("传入的数值" + myTex.name);
}

代码添加事件

//代码添加事件
private void Start()
{
    //获取默认层播放的动画
    AnimatorClipInfo[] clipInfo = anim.GetCurrentAnimatorClipInfo(0);
    
    var animEvent = new AnimationEvent();
    //动画播放第5秒添加事件
    animEvent.time = 5;
    animEvent.functionName = "AnimEventFunc";
    
    clipInfo[0].clip.AddEvent(animEvent);
}
private void AnimEventFunc()
{
    print("执行AnimEventFunc方法")}

判断动画是否在播放

Animator anim ;
int idle = Animator.StringToHash("Base layer.Idle");//默认层的待机动画 哈希值
AnimatorStateInfo currentBaseStage;//当前播放的动画

void Start() 
{ 
    anim = GetComponent<Animator>();
}

void Update()
{
    currentBaseStage = anim.GetCurrentAnimatorStateInfo(0);//当前播放的动画
    if (currentBaseStage.nameHash == idle && !anim.IsInTransition(0))//正在播放待机动画,并且没有动画衔接
    { 
        anim.SetBool("hit", false);
    }
}

播放视频

Video Player组件

1.安装QuickTIme播放器。(unity2021.3.29版似乎可以不安装,经测试,安装后卸载,依然可以播放视频)

2.不能使用FLV格式视频。(理由:QuickTIme不支持FLV格式的视频)

在这里插入图片描述

视频播放器 (Video Player) 组件 - Unity 手册

调整视频速度

播放视频声音

;