5.9IK动画和动画曲线
IK动画
usingUnityEngine;
usingSystem.Collections;
publicclassPlayerIKScript:MonoBehaviour{
private Animator animator;
public Transform rightHandTarget;//右手子节点参考目标
public Transform rightHand;//右手位置
private bool isActive;//是否开始IK动画
voidStart( ){
//得到动画的控制器组件
animator=GetComponent<Animator>( );
}
voidUpdate( ){
if(Input.GetKeyDown(KeyCode.C)){
isActive=!isActive;
}
}
//IK动画的回调方法---前提是IKPass必须勾选
void OnAnimatorIK(int LayerIndex ){
if(animator){
//设置骨骼的权重,1表示完整骨骼
animator.SetIKPositionWeight(AvatarIKGoal.RightHand,1);
animator.SetIKRotationWeight(AvatarIKGoal.RightHand,1);
if(isActive){
//设置骨骼的位置和旋转
if(rightHandTarget){
//设置右手根据目标点来旋转和移动父骨骼节点
animator.SetIKPosition(AvatarIKGoal.RightHand,Vector3.Lerp(rightHand.position,
rightHandTarget.position,0.5f));
animator.SetIKRotation(AvatarIKGoal.RightHand,rightHandTarget.rotation);
}
}
}
}
}
usingUnityEngine;
usingSystem.Collections;
publicclassPlayerScript:MonoBehaviour{
private Animator animator;
//private int walk;
//private int run;
private int runTurn;
//private int walkTurn;
private CharacterController characterController;
voidStart( ){
//获取animator组件,使用该组件来控制动画状态
animator=GetComponent<Animator>( ) ;
characterController=GetComponent<CharacterController>( );
//转换为hash值,效率更高
//walk=Animator.StringToHash("Walk");
//run=Animator.StringToHash("Run");
runTurn=Animator.StringToHash("RunTurn");
//walkTurn=Animator.StringToHash("WalkTurn");
}
voidUpdate(){
////从其他状态到walk状态
//if(Input.GetKeyDown(KeyCode.W)){
////设置walk动画参数的值为1
//animator.SetInteger(walk,1);
//}
//
////从walk状态到run状态
//if(Input.GetKeyDown(KeyCode.R)){
////设置walk动画参数的值为2
//animator.SetInteger(walk,2);
//}
////从idel状态到run状态
//if(Input.GetKeyDown(KeyCode.P)){
////设置run动画参数的值为1
//animator.SetInteger("Run",1);
//}
////从walk状态到idel状态
//if(Input.GetKeyDown(KeyCode.I)){
////设置walk动画参数的值为0
//animator.SetInteger(walk,0);
//}
//if(Input.GetKeyDown(KeyCode.R)){
//if(animator.GetCurrentAnimatorStateInfo(0).IsName("Idle")){
//
//animator.SetInteger(run,1);
//
//
//}
//}
////判断当前是否在跑动状态
//if(animator.GetCurrentAnimatorStateInfo(0).IsName("RunTurn")){
//
//animator.SetFloat(runTurn,Input.GetAxis("Horizontal"));
//
//}
//点击W走动
//if(Input.GetKeyDown(KeyCode.W)){
//
//if(animator.GetCurrentAnimatorStateInfo(0).IsName("Idle")){
//
//animator.SetInteger(walk,1);
//}
//}
//
//if(animator.GetCurrentAnimatorStateInfo(0).IsName("Walk")){
//
//animator.SetFloat(walkTurn,Input.GetAxis("Horizontal"));
//}
if(animator.GetCurrentAnimatorStateInfo(0).IsName("Move")){
animator.SetFloat("Speed",Input.GetAxis("Vertical"));
animator.SetFloat(runTurn,Input.GetAxis("Horizontal"));
}
if(Input.GetKeyDown(KeyCode.Space)){
animator.SetTrigger("Roll");
}
//动画曲线
//判断当前动画是否是滚动状态
if(animator.GetCurrentAnimatorStateInfo(0).IsName("Roll")){
//获取动画曲线的值
characterController.height=animator.GetFloat("Height");
characterController.center=newVector3(characterController.center.x,animator.GetFloat("Y"),characterController.center.z);
}
if(Input.GetKeyDown(KeyCode.J)){
animator.SetTrigger("Jump");
}
if(Input.GetKeyDown(KeyCode.S)){
//animator.SetTrigger("Shoot");
animator.SetBool("Raise",true);
}
}
}
2D混合2D混合通常是指两个参数来控制字动画的混合,2D的混合也可以分为三种不同模式,不同的模式下不同的应用场合,他们的区别在于计算每个片段影响的具体方式,下面来详解一下:
2Dsimple directional (2D简单定向模式下),这种混合模式适用于所有的动画都具有一定的运动方向,但其中任何两段动画运动方向都不相同的情形,例如,向前走,向后走,向左走和向右走,在次模式下,每一个方向上都不应存在多段动画,例如你想前走和向右跑是不能同时存在的,特别的,此时还可以存在一段处于(0,0)位置的特殊动画,例如idle状态,当然也可以不存在。2Dfreeform directional (2D自由定向模式),这种混合模式同样适用于所有的动画都具有一定的运动方向的情形,但是在同一方向上可以存在多段动画,例如向前走和向前跑可以同时存在,特别的,在此模式下,必须存在一段(0,0)位置的动画,例如idle状态。
2Dfreeform Cartesian(2D自由笛卡尔模式),这种混合模式使用于动画部确定运动方向的情形,例如向左走然后又想右转,向前跑然后右转,在此模式下,X参数和Y参数可以代表不同的含义,例如角速度和线速度。