5.9IK动画和动画曲线

2017-05-09  本文已影响50人  胤醚貔貅

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参数可以代表不同的含义,例如角速度和线速度。

上一篇下一篇

猜你喜欢

热点阅读