动画预制体----------------------------------------
Inspector_Rig_
Animation Type动画类型
humanoid人形动画
generic一般动画
legacy老版动画
none无动画
AvatarDefinition骨骼结构
Humanoid人形动画 Creat From This Model创建骨骼 configure打钩(完全匹配)
Inspector_Rig_Configure_
Pose姿势
Sample Bind-pose骨骼取样
(sample取样)
Enforce T-pose强制T型
Inspector_Model_
Model
Scale Factor比例
Inspector_Animations_
Mirror镜像
Loop Time循环
--------------------
Animator组件----------------------------------------
Contorller动画控制器
Update Mode动画更新
Culling Mode动画剔除
创建动画控制器:在 Project 视图中点击 Create 然后选择Animator Controller;
双击新建的 Animator Controller 可以打开 Animator 视图
--------------------
Animmator视图----------------------------------------
动画剪辑拖入Animator视图后
右键
Set as Layer Default State默认状态
make transition过渡*(状态机和状态参数)
Animator_Inspector
speed速度
Mirror镜像
Conditions过渡条件
--------------------
方法----------------------------------------
SetFloat/GetFloat 设置/获取float类型参数的值
SetTrigger 设置一次触发
GetCurrentAnimatorStateInfo 获取某一层的状态机信息
IsInTransition 判断是否在执行动画过渡
StringToHash 返回状态机所代表的Hash值
改参
int speedFloat = Animator.stringToHash (“Speed”);
animator.SetFloat (speedFloat, 2.0f);
Animator ani;
ani = GetComponent<Animator>();
ani.SetBool("run",true);
//判断当前状态机里面运行的动画片段的名字
AnimatorStateInfo info = ani.GetCurrentAnimatorStateInfo(0);
Debug.Log(info.IsName("Idle_Glance"));
--------------------
BlendTree----------------------------------------
1D,使用一个参数进行融合
2D 简单定向,所有动作都是不同方向时使用的简单融合
2D 自由定向,也用于混合朝向不同的动作,但它有一个原点动作2D 自由笛卡尔坐标,可以在 X 和 Y 轴使用不同的定义,自由定义动作
Motion动画剪辑 Threshold临界值 O时间缩放 H镜像
--------------------
Mask蒙版&Layer----------------------------------------
Animator_Layers
+添加层(layer)
Animator_Lyaers_设置
mask蒙版
Assets_Create_Avatar Mask(创建身体遮罩)
身体遮罩可以选择想要遮罩的部位
例如:边走边射击,需要在第一动画层设置走的动画,第二个layer选择mask,创建一个只遮罩手臂的身体遮罩,添加射击动画。即可实现边走边射击。
Animator ani;
ani = GetComponent<Animator>();
float ver = Input.GetAxis("Vertical");
ani.SetFloat("speed", ver);
if (Input.GetKeyDown(KeyCode.Space))
{
ani.SetBool("shoot",true);
}
else
{
ani.SetBool("shoot",false);
}
--------------------
Animator_Lyaers_设置_IK Pass(支持IK动画)
代码:
Animator ani;
//是否开启IK动画
bool ikActive = false;
public Transform obj = null;
AnimatorStateInfo info;
public void SetIk()
{
ikActive = false;
}
// Use this for initialization
void Start () {
ani = GetComponent<Animator>();
info = ani.GetCurrentAnimatorStateInfo(0);
}
//IK动画回调方法
private void OnAnimatorIK(int layerIndex)
{
if (ani != null)
{
if (ikActive)
{
//右手 位置权重
ani.SetIKPositionWeight(AvatarIKGoal.RightHand, 1f);
//右手 旋转权重
ani.SetIKRotationWeight(AvatarIKGoal.RightHand, 1f);
//ani.SetLookAtWeight(1);
if (obj != null)
{
ani.SetIKPosition(AvatarIKGoal.RightHand, obj.position);
ani.SetIKRotation(AvatarIKGoal.RightHand, obj.rotation);
//ani.SetLookAtPosition(obj.position);
}
}
else
{
ani.SetIKPositionWeight(AvatarIKGoal.RightHand, 0);
ani.SetIKRotationWeight(AvatarIKGoal.RightHand, 0);
ani.SetLookAtWeight(0);
}
}
}
void Update ()
{
if (Input.GetKeyDown(KeyCode.Space))
{
ani.SetBool("shoot", true);
ikActive = true;
}
else
{
ani.SetBool("shoot", false);
}
//功能类似apply root motion
//勾选Apply Root Motion这个选项,动画就会发生实际的位移,而不是原地踏步。
Debug.Log(ani.GetFloat("walk"));
transform.Translate(Vector3.forward * ani.GetFloat("walk") * Time.deltaTime);
}
--------------------
//判断当前状态机里面运行的动画片段的名字
//层
AnimatorStateInfo info = ani.GetCurrentAnimatorStateInfo(0);
Debug.Log(info.IsName("Idle_Glance"));
在inspector试图中的blend node属性面板中,第一个选项就是以后混合类型,如上一次说的,其中1D混合即使通过唯一-------一个参数来控制字动画的混合,在设定的1D混合类型后,立即需要做的是一件事是就是选择通过哪一个animation parameters来控制混合树,在下一个例子中,将选用direction参数,其值的变化范围是从-1.0向左倾向到1.0向右倾向,而0.0表示直线跑动而不产生倾斜,随后可以通过单击+--add motion field在混合树中添加动画片段,
在inspector试图中blend node属性面板上方的图形表示了混合参数的变化时每个子动画的影响,其中每个子动画用一个蓝色的金字塔形状表达,每个和末个只显示一半,如果单击某个金字塔形状并按下不放时,相应的动画片段会在下端的列表中高亮显示,每个金字塔的顶端代表该动画片段的权重为1,而其他所有的动画的混合权重为0,这样的位置被称为动画混合的临界点(threshold),
2D混合
2D混合通常是指两个参数来控制字动画的混合,2D的混合也可以分为三种不同模式,不同的模式下不同的应用场合,他们的区别在于计算每个片段影响的具体方式,下面来详解一下:
2D simple directional (2D简单定向模式下),这种混合模式适用于所有的动画都具有一定的运动方向,但其中任何两段动画运动方向都不相同的情形,例如,向前走,向后走,向左走和向右走,在次模式下,每一个方向上都不应存在多段动画,例如你想前走和向右跑是不能同时存在的,特别的,此时还可以存在一段处于(0,0)位置的特殊动画,例如idle状态,当然也可以不存在。
2D freeform directional (2D自由定向模式),这种混合模式同样适用于所有的动画都具有一定的运动方向的情形,但是在同一方向上可以存在多段动画,例如向前走和向前跑可以同时存在,特别的,在此模式下,必须存在一段(0,0)位置的动画,例如idle状态。
2D freeform Cartesian(2D自由笛卡尔模式),这种混合模式使用于动画部确定运动方向的情形,例如向左走然后又想右转,向前跑然后右转,在此模式下,X参数和Y参数可以代表不同的含义,例如角速度和线速度。
在设定了2D混合类型下,立即需要做的一件事是选择需要通过两个animation controller 来控制混合树,在下面的例子中,选定的两个参数是veloityX(平移速度)和VelocityY(前进速度),然后可以通过单击+--------add motion field在混合树中添加动画片段
面板顶端的图示表示各个子动画2D混合空间中的位置,每段动画以蓝色的矩形点表示,可以通过单击这个蓝色点选取一段动画。选中后,该动画影响范围将以蓝色的可视化长来表示,
红色的表示两个混合参数的当前值,在单击inspector面板地段的play按钮后,如果在图中拖动红点,就可以观察到两个参数对于混合结果的影响,,每段动画对于当前动画状态的影响权重还可以通过蓝色的点周围蓝色圆圈表示,当用户拖动红点靠近代表某段动画的蓝色点时,则该蓝点周围的圆圈直径将会相应变大,表明该动画的影响权重拙见变大,而其他圆圈则会相应的变小,表明其他的动画的影响权重逐渐变小,甚至完全没有影响。
Inspector_Rig_
Animation Type动画类型
humanoid人形动画
generic一般动画
legacy老版动画
none无动画
AvatarDefinition骨骼结构
Humanoid人形动画 Creat From This Model创建骨骼 configure打钩(完全匹配)
Inspector_Rig_Configure_
Pose姿势
Sample Bind-pose骨骼取样
(sample取样)
Enforce T-pose强制T型
Inspector_Model_
Model
Scale Factor比例
Inspector_Animations_
Mirror镜像
Loop Time循环
--------------------
Animator组件----------------------------------------
Contorller动画控制器
Update Mode动画更新
Culling Mode动画剔除
创建动画控制器:在 Project 视图中点击 Create 然后选择Animator Controller;
双击新建的 Animator Controller 可以打开 Animator 视图
--------------------
Animmator视图----------------------------------------
动画剪辑拖入Animator视图后
右键
Set as Layer Default State默认状态
make transition过渡*(状态机和状态参数)
Animator_Inspector
speed速度
Mirror镜像
Conditions过渡条件
--------------------
方法----------------------------------------
SetFloat/GetFloat 设置/获取float类型参数的值
SetTrigger 设置一次触发
GetCurrentAnimatorStateInfo 获取某一层的状态机信息
IsInTransition 判断是否在执行动画过渡
StringToHash 返回状态机所代表的Hash值
改参
int speedFloat = Animator.stringToHash (“Speed”);
animator.SetFloat (speedFloat, 2.0f);
Animator ani;
ani = GetComponent<Animator>();
ani.SetBool("run",true);
//判断当前状态机里面运行的动画片段的名字
AnimatorStateInfo info = ani.GetCurrentAnimatorStateInfo(0);
Debug.Log(info.IsName("Idle_Glance"));
--------------------
BlendTree----------------------------------------
1D,使用一个参数进行融合
2D 简单定向,所有动作都是不同方向时使用的简单融合
2D 自由定向,也用于混合朝向不同的动作,但它有一个原点动作2D 自由笛卡尔坐标,可以在 X 和 Y 轴使用不同的定义,自由定义动作
Motion动画剪辑 Threshold临界值 O时间缩放 H镜像
--------------------
Mask蒙版&Layer----------------------------------------
Animator_Layers
+添加层(layer)
Animator_Lyaers_设置
mask蒙版
Assets_Create_Avatar Mask(创建身体遮罩)
身体遮罩可以选择想要遮罩的部位
例如:边走边射击,需要在第一动画层设置走的动画,第二个layer选择mask,创建一个只遮罩手臂的身体遮罩,添加射击动画。即可实现边走边射击。
Animator ani;
ani = GetComponent<Animator>();
float ver = Input.GetAxis("Vertical");
ani.SetFloat("speed", ver);
if (Input.GetKeyDown(KeyCode.Space))
{
ani.SetBool("shoot",true);
}
else
{
ani.SetBool("shoot",false);
}
--------------------
Animator_Lyaers_设置_IK Pass(支持IK动画)
代码:
Animator ani;
//是否开启IK动画
bool ikActive = false;
public Transform obj = null;
AnimatorStateInfo info;
public void SetIk()
{
ikActive = false;
}
// Use this for initialization
void Start () {
ani = GetComponent<Animator>();
info = ani.GetCurrentAnimatorStateInfo(0);
}
//IK动画回调方法
private void OnAnimatorIK(int layerIndex)
{
if (ani != null)
{
if (ikActive)
{
//右手 位置权重
ani.SetIKPositionWeight(AvatarIKGoal.RightHand, 1f);
//右手 旋转权重
ani.SetIKRotationWeight(AvatarIKGoal.RightHand, 1f);
//ani.SetLookAtWeight(1);
if (obj != null)
{
ani.SetIKPosition(AvatarIKGoal.RightHand, obj.position);
ani.SetIKRotation(AvatarIKGoal.RightHand, obj.rotation);
//ani.SetLookAtPosition(obj.position);
}
}
else
{
ani.SetIKPositionWeight(AvatarIKGoal.RightHand, 0);
ani.SetIKRotationWeight(AvatarIKGoal.RightHand, 0);
ani.SetLookAtWeight(0);
}
}
}
void Update ()
{
if (Input.GetKeyDown(KeyCode.Space))
{
ani.SetBool("shoot", true);
ikActive = true;
}
else
{
ani.SetBool("shoot", false);
}
//功能类似apply root motion
//勾选Apply Root Motion这个选项,动画就会发生实际的位移,而不是原地踏步。
Debug.Log(ani.GetFloat("walk"));
transform.Translate(Vector3.forward * ani.GetFloat("walk") * Time.deltaTime);
}
--------------------
//判断当前状态机里面运行的动画片段的名字
//层
AnimatorStateInfo info = ani.GetCurrentAnimatorStateInfo(0);
Debug.Log(info.IsName("Idle_Glance"));
在inspector试图中的blend node属性面板中,第一个选项就是以后混合类型,如上一次说的,其中1D混合即使通过唯一-------一个参数来控制字动画的混合,在设定的1D混合类型后,立即需要做的是一件事是就是选择通过哪一个animation parameters来控制混合树,在下一个例子中,将选用direction参数,其值的变化范围是从-1.0向左倾向到1.0向右倾向,而0.0表示直线跑动而不产生倾斜,随后可以通过单击+--add motion field在混合树中添加动画片段,
在inspector试图中blend node属性面板上方的图形表示了混合参数的变化时每个子动画的影响,其中每个子动画用一个蓝色的金字塔形状表达,每个和末个只显示一半,如果单击某个金字塔形状并按下不放时,相应的动画片段会在下端的列表中高亮显示,每个金字塔的顶端代表该动画片段的权重为1,而其他所有的动画的混合权重为0,这样的位置被称为动画混合的临界点(threshold),
2D混合
2D混合通常是指两个参数来控制字动画的混合,2D的混合也可以分为三种不同模式,不同的模式下不同的应用场合,他们的区别在于计算每个片段影响的具体方式,下面来详解一下:
2D simple directional (2D简单定向模式下),这种混合模式适用于所有的动画都具有一定的运动方向,但其中任何两段动画运动方向都不相同的情形,例如,向前走,向后走,向左走和向右走,在次模式下,每一个方向上都不应存在多段动画,例如你想前走和向右跑是不能同时存在的,特别的,此时还可以存在一段处于(0,0)位置的特殊动画,例如idle状态,当然也可以不存在。
2D freeform directional (2D自由定向模式),这种混合模式同样适用于所有的动画都具有一定的运动方向的情形,但是在同一方向上可以存在多段动画,例如向前走和向前跑可以同时存在,特别的,在此模式下,必须存在一段(0,0)位置的动画,例如idle状态。
2D freeform Cartesian(2D自由笛卡尔模式),这种混合模式使用于动画部确定运动方向的情形,例如向左走然后又想右转,向前跑然后右转,在此模式下,X参数和Y参数可以代表不同的含义,例如角速度和线速度。
在设定了2D混合类型下,立即需要做的一件事是选择需要通过两个animation controller 来控制混合树,在下面的例子中,选定的两个参数是veloityX(平移速度)和VelocityY(前进速度),然后可以通过单击+--------add motion field在混合树中添加动画片段
面板顶端的图示表示各个子动画2D混合空间中的位置,每段动画以蓝色的矩形点表示,可以通过单击这个蓝色点选取一段动画。选中后,该动画影响范围将以蓝色的可视化长来表示,
红色的表示两个混合参数的当前值,在单击inspector面板地段的play按钮后,如果在图中拖动红点,就可以观察到两个参数对于混合结果的影响,,每段动画对于当前动画状态的影响权重还可以通过蓝色的点周围蓝色圆圈表示,当用户拖动红点靠近代表某段动画的蓝色点时,则该蓝点周围的圆圈直径将会相应变大,表明该动画的影响权重拙见变大,而其他圆圈则会相应的变小,表明其他的动画的影响权重逐渐变小,甚至完全没有影响。