Animation动画:
我感觉这个动画编辑器并没有Animator好用,但是向我们这种程序员小白,只会程序的,如果想自己做一点东西,只能网上找资源,大部分都是旧版的资源,带的都是Animation动画,所以这里先记录一下Animation的使用心得:
这是unity中一个资源(一个角色),自带攻击,站立,行走,奔跑等的动作,这就需要将我们要用到的动画资源放到Animations容器中,而Animation一栏则是默认播放的动画;
Animation:默认开始播放的动画
Size:动画组
Play automatically:默认播放
Animate Physics:动画物理
Culling Type:Animation组件的剔除(启用剔除后,如果Unity认为动画结果对用户不可见,则它可能会停止进行动画处理)
Wrap mode:播放的状态:
代码中:
差值过度:animation.CrossFale(“动画名”);
用代码控制动画的播放:
对象=GetComponent();
对象.Play(“动画名”);//好像可以放到updata中,是循环播放
利用了简单状态机:枚举+调用
例子:
enumstat
{
//跑
run,
//攻击
att,
//站立
idle
}
publicclassanim : MonoBehaviour
{
//刚体
private Rigidbody rigbody;
//动画器
private Animation trg_anm;
//状态枚举
private stat stat_play;
// Start is called before the first frame update
voidStart()
{
//获取组件
rigbody = GetComponent<Rigidbody>();
trg_anm = GetComponent<Animation>();
}
// Update is called once per frame
voidUpdate()
{
//这个最好不要这样写跳跃,这只是演示而已
if (Input.GetKeyDown(KeyCode.Space))
{
changt_stat(stat.idle);
rigbody.AddForce(Vector3.up * 500);
}
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.S))
{
changt_stat(stat.run);
}
elseif (Input.GetKey(KeyCode.K))
{
changt_stat(stat.att);
}
else
{
changt_stat(stat.idle);
}
float axisval = Input.GetAxis("Vertical");
float axisher = Input.GetAxis("Horizontal");
transform.Rotate(Vector3.up * axisher* 120*Time.deltaTime);
transform.Translate(Vector3.forward * axisval * 5* Time.deltaTime);
}
void changt_stat(stat sta)
{
if (stat_play == sta)
{
return;
}
stat_play = sta;
switch(stat_play)
{
case stat.att:
{
//播放当前动画(动画名字name)
trg_anm.Play("K,P attack 1");
break;
}
case stat.idle:
{
trg_anm.Play("K,M,P idle 1");
break;
}
case stat.run:
{
trg_anm.Play("K,M,P run");
break;
}
}
}
}
Animator动画器:
这个比起animation就复杂了,但也更强大了:
Animator一般用于骨骼动画人型
ps:一定要改成humanoid:人型或者是generic:非人型(动物)
动画器中的参数:
Controller:动画器
Avatar:骨骼
Apply root motion:是否采用动画自带的移动
Updata Mode:
–>Normal:正常的动画器更新
–>AnimatePhysics:在物理循环期间更新动画器,以使动画系统与物理引擎同步。
–>UnscaledTime:动画更新独立于Time.timeScale
Culling Mode:Animator的剔除模式
–>AlwaysAnimate:始终为整个角色设置动画。即使在屏幕外,对象也会设置动画
–>CullUpdateTransforms:当渲染器不可见时,将禁用重定向,IK和“变换”写入。
–>CullCompletely:当渲染器不可见时,将完全禁用动画。
具体的可以查看官方文档:https://docs.unity3d.com/ScriptReference/AnimatorUpdateMode.html
创建动画器--------------------------------------------->
然后打开我们在网上找到的资源:点击人物的动作:出现这个页面
选择rig–使用humanoid人型骨骼
–》这样就把animation动画变成了animator动画了(滑稽)
ps:庆幸的是,更改了动画Rig后动画能正常播放(由于是介绍基础,就先这样用吧)
打开Animator:
是否循环播放这个动画:loop time
Loop pose:平滑优化
Cycle offset:偏移时间:从哪一时间开始播放,以下截图是默认从0开始播放
也可以进行动画片段裁剪:
创建一个动画片段,拖动动画的时间线,设置好开始时间和结束时间,在拖动过程中,会出现动画曲线,绿色代表最好的动画剪切点
Animator动画是采用变量进行控制动画的状态的:
点击动画:
mirror:镜像
Motion:默认开始动画
代码中:
private Animator trg_aor;
int att_id;
trg_aor = GetComponent();
方法一:直接获取变量名id:id参数为上面截图中的自定义条件关键字
Ps:这种方法准确性比较高。
att_id = Animator.StringToHash(“att”);
trg_aor.SetFloat(run_id, 变量);
方法二:参数为上面截图中的自定义条件关键字,变量
trg_aor.SetFloat(“att”, 变量);
Animator animator;
animator.setfloat(id,速度变化量/角度变化量,增量值,时间差) //具有缓冲效果让动画更加平滑
混合动画:创建混合树
在动画器中右键单击CreateFrom new blend tree
单击创建的混合动画组,进入下面界面:
1D:一般用于站立,行走的动画(线性动作)
2D:转向等非线性动作
2D simple Directional:固定的方向,例如:上下左右四方向
2D Freeform Directional:自由的方向
动画混合器:可以进行两个动画之间无缝连接
只需要利用变量进行控制动画的转变就可以了
下图中为1d展示,
2d展示需要两个变量,我是用来控制的人物水平面移动想x,y的速度关联动画;
如果动画有自带的位移,就选择:自动设置角度和角速度
ps:如果没有,就只能自己调试,自己设置posx和posy:
2D freeform Cartesian :用于线速度和角速度的动画蒙皮:Skinned Mesh Renderer
只显示蒙皮动画
动画的层级和权重:
获取动画的层级,设置权重,设置遮罩:
下列代码为设置第一层动画权重为1
anim.SetLayerWeight(1, 1);
.
动画遮罩:
当前层级动画无法控制角色的遮罩部分身体:
下图中:创建了一个遮罩器,将角色身体下半部分点成了红色,这样,下半身相关的动画就无法操控了,比如奔跑,只会有上半身手臂摇摆的动画,
ik也被禁用了,同理
ik动画比较简单,可以网上查一下资料,这里我就大概说一下:
比如说手臂相关的ik,持枪的手臂,当我举枪射击时,手臂关节持平,收枪于胸口时,手臂弯曲,ik就可以达到这个效果,他会根据当前手臂需要摆放的点,进行计算手臂所有骨骼,调整为适合当前动作的坐标。(“IK是Inverse Kinematic的缩写,也就是反向动力学。是根据骨骼的终节点来推算其他父节点的位置的一种方法。比如通过手的位置推算手腕、胳膊肘的骨骼的位置。”)
当权重为1时,才会使用ik动画,所以必须设置权重
必须先将layer的ik pass选项勾选
所有IK动画代码逻辑必须写在OnAnimatorIK这个系统自带的内置函数中
当权重为1时,才会使用ik动画,所以必须设置权重AvatarIKGoal:人物中相应的骨骼
PS:设置简单ik动画,可以在人物身上放一个空的gameobject,调整位置,再将这个空的gameobject的坐标设置成ik动画的指定坐标;
骨骼动画:(重定向)
在动画中调用回调函数:
也可以在动画里面创建回调:
ps:必须是自己物体身上挂载的脚本的回调函数
创建自定义动画:
选择物体,打开动画器:
物体上面挂载的是animator,那么创建的就是animator动画,如果是animation,那么创建的就是animation动画;
以上,就是我学的动画相关的,基本上都是比较浅的,如果有问题,希望大佬指出。