Unity 动画初探(2)

来源:互联网 发布:perl 进入编程 编辑:程序博客网 时间:2024/05/20 12:24

首先为角色增加一个CharacterController。


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

[csharp] view plaincopy
  1. var speed = 3.0;  
  2. var rotatationSpeed = 200.0;  
  3. private var curSpeed = 0.0;  
  4.   
  5. function Update () {  
  6.     // Rotate around y-axis  
  7.     var newRotation = Input.GetAxis("Horizontal") * rotatationSpeed;  
  8.     transform.Rotate(0, newRotation * Time.deltaTime, 0);  
  9.       
  10.     // Calculate speed  
  11.     var newSpeed = Input.GetAxis("Vertical") * speed;  
  12.     if (Input.GetKey("left shift"))  
  13.         newSpeed *= 1.5;  
  14.           
  15.     // Move the controller  
  16.     var controller : CharacterController = GetComponent (CharacterController);  
  17.     var forward = transform.TransformDirection(Vector3.forward);  
  18.     controller.SimpleMove(forward * newSpeed);  
  19.   
  20. }  

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

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


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

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

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

  


    现在我们要对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混合的效果。




[csharp] view plaincopy
  1. function Update () {  
  2.   
  3.     if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1 || Mathf.Abs(Input.GetAxis("Horizontal")) > 0.1)  
  4.     {  
  5.         animation.CrossFade("run");  
  6.         animation["run"].speed = Mathf.Sign(Input.GetAxis("Vertical"));  
  7.     }  
  8.     else  
  9.         animation.CrossFade("idle");  
  10.           
  11.     // Play the cross fade animation  
  12.     if (Input.GetButtonDown ("Jump"))  
  13.     {  
  14.         animation.CrossFade("jump", 0.3);  
  15.     }     
  16.           
  17.     // Shoot      
  18.     if (Input.GetButtonDown ("Fire1"))  
  19.     {  
  20.     // We are running so play it only on the upper body  
  21.         if (animation["run"].weight > 0.5)  
  22.             animation.CrossFadeQueued("shootUpperBody", 0.3, QueueMode.PlayNow);  
  23.         // We are in idle so play it on the fully body  
  24.         else  
  25.             animation.CrossFadeQueued("shoot", 0.3, QueueMode.PlayNow);     
  26.       }  
  27. }  
0 0
原创粉丝点击