u3d010 动画系统_学习记录

目录

1.Animation 动画窗口

2.Animator 动画状态机

3.ui按钮动画

4.动画模型导入

5.动画分割

6.动画播放控制

7.骨骼映射

8.动画重定向(人形动作通用)

9.动画混合树

10.MatchTarget 到达目标

11.动画曲线(动画控制变量)

12.Avatar Mask 骨骼动画遮罩

13.IK动画


1.Animation 动画窗口

快捷键:Ctrl+6

选择物体后点击Create创建动画

可控制游戏物体上组件的变化

两种编辑模式

线的3种模式

返回顶部目录


2.Animator 动画状态机

挂在游戏物体上

可通过代码控制内部动画播放

返回顶部目录


3.ui按钮动画

返回顶部目录

 


4.动画模型导入

旧版本

适用大部分

只用于人形(可通过动画控制运动)

模型比例

动画

在骨骼映射好后

动画赋值统一骨骼

若骨骼不一样则单独映射

返回顶部目录


5.动画分割

Loop Time循环播放

Loop Pose平滑

点击Apply应用后,会生成分割好的动画

旋转不影响

高度不影响

平移不影响

Offset为位置偏移

Mirror镜像

返回顶部目录


6.动画播放控制

转换动画

添加转换条件变量(可通过脚本控制)

播放结束后转换

    
	private Animator air;

	void Start () {
		air = GetComponent<Animator>();
        //获取动画组件
	}
	
	void Update () {
		float v = Input.GetAxisRaw("Vertical");
		air.SetInteger("Vertical",(int)v);//设置变量值

		transform.Translate(Vector3.forward*v*Time.deltaTime*4);
	}

哈希值(把字符串转ID)

private Animator player1;

private int speedzID = Animator.StringToHash("speedz");
//把字符串转换为哈希值



player1 = GetComponent<Animator>();//获得动画组件

player1.SetFloat(speedzID,z);//然后赋值到动画
player1.GetFloat(speedzID);//提取数值
//防止出错方便管理

检测动画播放状态

if(player1.GetCurrentAnimatorStateInfo(0).IsName("Vault")){
    //检测动画状态机(0)是否在播放.名字为“Vault”的动画
}

if(player1.IsInTransition(0)==false){
    //检测动画状态机(0)是否在切换动画
}

返回顶部目录


7.骨骼映射

自动映射

或者拖拽映射

返回顶部目录

 


8.动画重定向(人形动作通用)

把新人物模型进行骨骼映射

然后人物使用新映射出来的骨骼,再使用之前人物的动画状态机,就可以了

返回顶部目录


9.动画混合树

在状态机中鼠标右键

进入编辑选择模式

2D simple Directional 二维每个空间方向只能有一个动作
2D Freedom Directional 二维每个空间方向可以有多个动作,但是必须一个是初始状态(0,0)位置。
2D Freedom Cartesian 二维中各个方向可以随便设定动作,常用

混合模式选择

控制变量设置

切换阀值设置

动画添加

时钟为动画的播放速度

根据某轴速度自动匹配切换阀值

根据动画切换平滑度自动匹配播放速度

返回顶部目录


10.MatchTarget 到达目标

player1.MatchTarget(matchTarget,Quaternion.identity,AvatarTarget.LeftHand,new MatchTargetWeightMask(Vector3.one,0),0.32f,0.4f);

//位置,旋转,部位,(位置权重,旋转权重),差值开始时间,差值结束时间
//差值时间结束后部位才会到达指定位置

返回顶部目录


11.动画曲线(动画控制变量)

命名

在创建一个相同的动画变量

动画的播放进度就能改变变量的值,通过脚本检测,用于触发其它事件

返回顶部目录


12.Avatar Mask 骨骼动画遮罩

新建层

设置里面

权重

添加骨骼遮罩(点击选择遮罩部分)

模式(重写、附加)

IK动作

返回顶部目录


13.IK动画

private void OnAnimatorIK(int layerIndex) {//每帧都会调用
    if(layerIndex==1&&player1.GetBool(HoldLogID)){//判断动画层
    //(每个开启IK的层都会调用)

	player1.SetIKPosition(AvatarIKGoal.LeftHand,Log2.transform.position);//位置
	player1.SetIKRotation(AvatarIKGoal.LeftHand,Log2.transform.rotation);//旋转
        //(部位,指定位置)
			
	player1.SetIKPositionWeight(AvatarIKGoal.LeftHand,1);//IK位置权重
	player1.SetIKRotationWeight(AvatarIKGoal.LeftHand,1);//IK旋转权重
//===================================================================
	player1.SetIKPosition(AvatarIKGoal.RightHand,Log1.transform.position);//位置
	player1.SetIKRotation(AvatarIKGoal.RightHand,Log1.transform.rotation);//旋转
			
	player1.SetIKPositionWeight(AvatarIKGoal.RightHand,1);//IK位置权重
	player1.SetIKRotationWeight(AvatarIKGoal.RightHand,1);//IK旋转权重			

    }
		
}

返回顶部目录

猜你喜欢

转载自blog.csdn.net/qq_40346899/article/details/83507162