Unity 动画系统初探(2)

这几天电脑坏了,今天来测试一下控制角色,这样在上次人物动作的基础上让角色可以在场景里面跑起来。


首先为角色增加一个CharacterController。


然后设定一些变量控制角色的速度

var speed = 3.0;
var rotatationSpeed = 200.0;
private var curSpeed = 0.0;

function Update () {
	// Rotate around y-axis
	var newRotation = Input.GetAxis("Horizontal") * rotatationSpeed;
	transform.Rotate(0, newRotation * Time.deltaTime, 0);
	
	// Calculate speed
	var newSpeed = Input.GetAxis("Vertical") * speed;
	if (Input.GetKey("left shift"))
		newSpeed *= 1.5;
		
	// Move the controller
	var controller : CharacterController = GetComponent (CharacterController);
	var forward = transform.TransformDirection(Vector3.forward);
	controller.SimpleMove(forward * newSpeed);

}

在Update函数里,我们根据输入计算出运行的速度和旋转的速度。最后通过控制器,让这个角色跑起来。

不过到目前为止这个角色跑起来开清动作就变得怪怪的,当按下开枪按钮的时候,这个人就开始滑行了,为了让这个人能够“边跑边打”,我们就要去混合刚才开枪和跑步的动作。


   写了一半,电脑又坏了!~非常痛恨中关村里面的修理笔记本的!各位兄弟们千万别去了!实在不行一定要找个熟悉的人带着。

   言归正传,要让我们控制的机器人可以一边跑一边射击,那么就必须要用到Unity中一个非常重要的动画技术 “动画混合Animation Mixing”。

   找个动画文件来看看:[email protected]这个动画。在这套动画文件中,包含了很多的动画动作。我们的每一个动画都包含了好多的动作,其中包括了 手上的动作和腿脚的动作。通常情况下我们播放动画就是直接播放一个动作就可以了,但是遇到需要动作融合的时候,就不能直接的调用动画,而是要选用其中的一部分有用的动画。

  


    现在我们要对Run这个动作和Shoot两个动作进行混合。先来看看Shoot的动作序列:在这个动作中基本上只包含了两个上身持枪和动作,下身基本上没动。这个动作融合主要是针对shoot的上半身。


首先,利用Shoot动画片段,生成一个新的动画片段"shootUpperBody"。

 animation.AddClip(animation["shoot"].clip, "shootUpperBody");

  animation["shootUpperBody"].AddMixingTransform(transform.Find("mover/roothandle/spine1"));
  animation["shootUpperBody"].AddMixingTransform(transform.Find("mover/gun"));

增加两个混合矩阵,让动作融合。这个动画角色的动作骨骼矩阵包含四部分,我们选择的spine1是上身的动作矩阵的根矩阵:


然后在运动的代码中调用

animation.CrossFadeQueued("shootUpperBody", 0.3, QueueMode.PlayNow);

然后跑起来的的角色,就有shoot和run混合的效果。




function Update () {

	if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1 || Mathf.Abs(Input.GetAxis("Horizontal")) > 0.1)
	{
		animation.CrossFade("run");
		animation["run"].speed = Mathf.Sign(Input.GetAxis("Vertical"));
	}
	else
		animation.CrossFade("idle");
		
	// Play the cross fade animation
	if (Input.GetButtonDown ("Jump"))
	{
		animation.CrossFade("jump", 0.3);
	}	
		
	// Shoot    
	if (Input.GetButtonDown ("Fire1"))
	{
	// We are running so play it only on the upper body
		if (animation["run"].weight > 0.5)
			animation.CrossFadeQueued("shootUpperBody", 0.3, QueueMode.PlayNow);
		// We are in idle so play it on the fully body
		else
			animation.CrossFadeQueued("shoot", 0.3, QueueMode.PlayNow);	  
	  }
}


你可能感兴趣的:(Unity3D)