Mecanim高级应用
1、 RootMotion:根运动。自己理解:根据动画的运动,在脚下圆圈内生成一条路径,这条路径称为根路径。
在Animator组件中勾选Apply Root Motion 将会应用此根运动,控制对象运动。
MonoBehaviour.OnAnimatorMove():是回调处理RootMotion的函数,在脚本中添加此函数,会代替根运动,使用脚本控制运动。见下图。
参考程序:
using UnityEngine;
using System.Collections;
public class Example : MonoBehaviour {
void OnAnimatorMove() {
Animator animator = GetComponent<Animator>();
if (animator) {
Vector3 newPosition = transform.position;
newPosition.z += animator.GetFloat("Runspeed") * Time.deltaTime;
transform.position = newPosition;
}
}
}
2、 IK 反向运动学。将身体的一部位,如手,准确的定位到指定位置,类如伸手拿东西。
MonoBehaviour.OnAnimatorIK(int):应用IK的回调函数。
参考程序:
using UnityEngine;
using System.Collections;
public class Example : MonoBehaviour {
public float leftFootPositionWeight;
public float leftFootRotationWeight;
public Transform leftFootObj;
private Animator animator;
void Start() {
animator = GetComponent<Animator>();
}
void OnAnimatorIK(int layerIndex) {
animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, leftFootPositionWeight);
animator.SetIKRotationWeight(AvatarIKGoal.LeftFoot, leftFootRotationWeight);
animator.SetIKPosition(AvatarIKGoal.LeftFoot, leftFootObj.position);
animator.SetIKRotation(AvatarIKGoal.LeftFoot, leftFootObj.rotation);
}
}
3、 目标匹配。Animator.MatchTarget,能够准确的爬上一个建筑物。
Parameters
matchPosition | 目标Pos值 |
matchRotation | 目标旋转值 |
targetBodyPart | 身体的哪一部位来准确匹配目标位置. |
weightMask | 权限,位置和旋转的权限. |
startNormalizedTime | 匹配开始时间. |
targetNormalizedTime | 匹配结束时间 |
参考程序:
4、 曲线Curve应用。
曲线x轴表示标准化的运动时间0~1。Y轴表示在指定动画时间视的y值
在曲线上取值,使用Animator.GetFloat(”curve”);curve字符串是自定义的,如果想获取此值,还需要在状态机中添加对应的字符串。
参考程序:
5、 角色跟随应用。在目标角色运动时,另外一角色跟随移动。
Vector3.Dot点乘。如果他们指向在完全相同的方向,Dot返回1。如果他们指向完全相反的方向,返回-1。对于其他的情况返回一个数(例如:如果是垂直的Dot返回0)。
Vector3.Cross叉乘。两个向量的交叉乘积,使用叉积的正负值来判断向量a,b的相对位置,即向量b是处于向量a的顺时针方向还是逆时针方向。
Animator.deltaPosition avatar增量位置,每帧下的移动增量
Animator.rootPosition根运动的位置
参考程序:
因为有了OnAnimatorMove(),根运动的回调函数,所以动画的移动不再依靠根动画去运动,而是受脚本控制来移动