Animation动画:

我感觉这个动画编辑器并没有Animator好用,但是向我们这种程序员小白,只会程序的,如果想自己做一点东西,只能网上找资源,大部分都是旧版的资源,带的都是Animation动画,所以这里先记录一下Animation的使用心得:

unity 模型animation改不了 unity中的animation_权重


这是unity中一个资源(一个角色),自带攻击,站立,行走,奔跑等的动作,这就需要将我们要用到的动画资源放到Animations容器中,而Animation一栏则是默认播放的动画;

Animation:默认开始播放的动画

Size:动画组

Play automatically:默认播放

Animate Physics:动画物理

Culling Type:Animation组件的剔除(启用剔除后,如果Unity认为动画结果对用户不可见,则它可能会停止进行动画处理)

unity 模型animation改不了 unity中的animation_Time_02


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

unity 模型animation改不了 unity中的animation_重定向_03


创建动画器--------------------------------------------->

unity 模型animation改不了 unity中的animation_unity_04


然后打开我们在网上找到的资源:点击人物的动作:出现这个页面

选择rig–使用humanoid人型骨骼

–》这样就把animation动画变成了animator动画了(滑稽)

ps:庆幸的是,更改了动画Rig后动画能正常播放(由于是介绍基础,就先这样用吧)

unity 模型animation改不了 unity中的animation_权重_05


打开Animator:

是否循环播放这个动画:loop time

Loop pose:平滑优化

Cycle offset:偏移时间:从哪一时间开始播放,以下截图是默认从0开始播放

unity 模型animation改不了 unity中的animation_重定向_06


也可以进行动画片段裁剪:

创建一个动画片段,拖动动画的时间线,设置好开始时间和结束时间,在拖动过程中,会出现动画曲线,绿色代表最好的动画剪切点

unity 模型animation改不了 unity中的animation_Time_07


Animator动画是采用变量进行控制动画的状态的:

unity 模型animation改不了 unity中的animation_unity_08


unity 模型animation改不了 unity中的animation_权重_09


点击动画:

unity 模型animation改不了 unity中的animation_Time_10


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,速度变化量/角度变化量,增量值,时间差) //具有缓冲效果让动画更加平滑

unity 模型animation改不了 unity中的animation_权重_11


混合动画:创建混合树

在动画器中右键单击CreateFrom new blend tree

unity 模型animation改不了 unity中的animation_unity_12


单击创建的混合动画组,进入下面界面:

unity 模型animation改不了 unity中的animation_unity_13


1D:一般用于站立,行走的动画(线性动作)

2D:转向等非线性动作

2D simple Directional:固定的方向,例如:上下左右四方向

2D Freeform Directional:自由的方向

动画混合器:可以进行两个动画之间无缝连接

只需要利用变量进行控制动画的转变就可以了

下图中为1d展示,

unity 模型animation改不了 unity中的animation_unity_14


2d展示需要两个变量,我是用来控制的人物水平面移动想x,y的速度关联动画;

unity 模型animation改不了 unity中的animation_重定向_15


如果动画有自带的位移,就选择:自动设置角度和角速度

ps:如果没有,就只能自己调试,自己设置posx和posy:

unity 模型animation改不了 unity中的animation_Time_16


unity 模型animation改不了 unity中的animation_unity_17


2D freeform Cartesian :用于线速度和角速度的动画蒙皮:Skinned Mesh Renderer

只显示蒙皮动画

unity 模型animation改不了 unity中的animation_unity_18


动画的层级和权重:

获取动画的层级,设置权重,设置遮罩:

下列代码为设置第一层动画权重为1

anim.SetLayerWeight(1, 1);

unity 模型animation改不了 unity中的animation_权重_19

.

动画遮罩:

当前层级动画无法控制角色的遮罩部分身体:

下图中:创建了一个遮罩器,将角色身体下半部分点成了红色,这样,下半身相关的动画就无法操控了,比如奔跑,只会有上半身手臂摇摆的动画,

ik也被禁用了,同理

unity 模型animation改不了 unity中的animation_权重_20


ik动画比较简单,可以网上查一下资料,这里我就大概说一下:

比如说手臂相关的ik,持枪的手臂,当我举枪射击时,手臂关节持平,收枪于胸口时,手臂弯曲,ik就可以达到这个效果,他会根据当前手臂需要摆放的点,进行计算手臂所有骨骼,调整为适合当前动作的坐标。(“IK是Inverse Kinematic的缩写,也就是反向动力学。是根据骨骼的终节点来推算其他父节点的位置的一种方法。比如通过手的位置推算手腕、胳膊肘的骨骼的位置。”)

当权重为1时,才会使用ik动画,所以必须设置权重

必须先将layer的ik pass选项勾选

所有IK动画代码逻辑必须写在OnAnimatorIK这个系统自带的内置函数中

unity 模型animation改不了 unity中的animation_Time_21


当权重为1时,才会使用ik动画,所以必须设置权重AvatarIKGoal:人物中相应的骨骼

PS:设置简单ik动画,可以在人物身上放一个空的gameobject,调整位置,再将这个空的gameobject的坐标设置成ik动画的指定坐标;

unity 模型animation改不了 unity中的animation_重定向_22

骨骼动画:(重定向)

unity 模型animation改不了 unity中的animation_重定向_23


unity 模型animation改不了 unity中的animation_Time_24


在动画中调用回调函数:

unity 模型animation改不了 unity中的animation_重定向_25


也可以在动画里面创建回调:

ps:必须是自己物体身上挂载的脚本的回调函数

unity 模型animation改不了 unity中的animation_重定向_26


创建自定义动画:

选择物体,打开动画器:

unity 模型animation改不了 unity中的animation_Time_27


物体上面挂载的是animator,那么创建的就是animator动画,如果是animation,那么创建的就是animation动画;

以上,就是我学的动画相关的,基本上都是比较浅的,如果有问题,希望大佬指出。