Mecanim 新特性
针对人形角色提供了一种特殊的工作流,包含 Avatar 的创建和对肌肉的调节。
动画重定向的能力,可以非常方便地把动画从一个角色模型应用到其他角色模型上。
提供了可视化 Animator 视窗,可以直观地通过动画参数和 Transition(动画过渡线)等管理各个动画间的过度。
Mecanim 动画系统常见术语
Animator (Mecanim 动画系统组件)
AnimatorController 动画控制器(动画控制器资源相当于一个容器,我们可以通过创建多个动画节点,并形成动画状态机,来处理各个动画之间的过度以及播放逻辑)
Avatar(将角色的骨骼转换为 Mecanim 可识别的骨骼)
Retargeting(角色之间动画的互用也可以说是动画重定向)
使用步骤
-
.选择到模型源文件查看
-
将动画模式调整为 Mecanim 可识别样式(人类,动画可以复用)(非人类,动画不能复用)
Animation 动画样式为
-
点击 Apply按钮 应用到模型
-
(若为对勾显示则骨骼匹配成功,若为叉号显示则需要重新匹配)
-
创建
给到角色上
- 找到window下Animator 面板 将需要的动画拖到面板中即可。
注:需要重新匹配点击Configure进入此界面
找到
如果还未解决 × ,点击Clear按钮,重新进行红色的123步骤。
动画状态机动画切换
在Animationar窗口中,此颜色的动画状态,说明此动画为默认动画(此处跳舞为默认动画)
-
若想实现角色从待机切换到跳舞效果,先将待机动画拖拽到 Animator 面板(或者右键创建 Empty,将右边属性 motion 选择待机动画)-> 将待机动画设置为默认动画(在待机动画状态右键选择
) -> 待机动画即为默认动画 -> 在待机动画状态右键选择 -> -
添加动画参数
-
选择动画过渡线设置条件
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 手册
调整视频速度
播放视频声音