Unity3D游戏开发之基于Trigger的触发式动画设计

来源:互联网 发布:电视盒子刷入linux 编辑:程序博客网 时间:2024/05/19 05:03



相信大家在安装完Unity3D后做的第一件事情一定是浏览官方的示例项目《愤怒的机器人》,这个游戏在场景渲染及光照阴影特效等方面都有不错的表现。那么不知道大家还记不记得这样一个场景,当玩家操控我们的游戏角色——机器人时,当机器人靠近游戏场景中的门时,门会自动打开,而当机器人离开门时,门会自动关闭。那么,我们今天就来一起实现这样一个简单的功能。通过题目大家一定知道了这个功能的实现是基于Trigger的。Trigger在Unity3D中称为触发器,当一个碰撞器勾选了isTrigger选项后,即变成了触发器。触发器和碰撞器的区别在于碰撞器通过OnCollisionEnter/Stay/Exit()三个方法进行响应且会对参与到碰撞中的物体产生力的作用。而触发器则通过OnTriggerEnter/Stay/Exit()三个方法来响应且不会对参与到触发的物体产生力的作用。关于触发器和碰撞器的内容,大家可以参考这篇文章:http://game.ceeger.com/Components/class-BoxCollider.html

       好了,下面请大家跟随我一起来学习如何在Unity3D中实现基于Trigger的触发式动画,首先我们创建如下的场景:

        场景中的地面和墙体、门均有Cube构成,这里我们把地面、墙体的盒子碰撞器全部移除,避免它们对我们的程序产生干扰。首先我们编写两段脚本来控制门从左向右移动、从右向左移动的动画:

[csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. //开门动画  
  2. private void OpenDoorAni()  
  3.        {  
  4.   if(transform.position.x<=1.8F)  
  5.   {  
  6.     transform.Translate(Vector3.right * Time.deltaTime * 1.5F);  
  7.   }  
  8.        }  
  9. //关门动画  
  10. private void CloseDoorAni()  
  11. {  
  12.   //等待5秒后再关门,避免角色与门发生碰撞  
  13.   StartCoroutine("Wait");  
  14.   if(transform.position.x>=0)  
  15.   {  
  16.     transform.Translate(Vector3.left * Time.deltaTime * 1.5F);  
  17.   }  
  18. }  

         代码基本上很容易理解,就是分别从左向右、从右向左移动门啦!接下来,我们给我们的角色加上一个球体碰撞器并勾选isTrigger选项,为什么选择球体碰撞器呢,因为这样角色进入触发和退出触发的时候,都是和门的盒子碰撞器相切的。在关门的时候延迟两秒是为了给玩家一个控制角色的反应时间,避免和门发生碰撞。这里要注意的是角色是带刚体的。

         好了,接下来我们编写触发这一块的代码:

[csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. void OnTriggerEnter(Collider mCollider)  
  2. {  
  3.   Debug.Log(mCollider.gameObject.tag);  
  4.   if(mCollider.gameObject.tag=="Player")  
  5.   {  
  6.     Triggered=true;  
  7.   }  
  8. }  
  9.   
  10. void OnTriggerExit(Collider mCollider)  
  11. {  
  12.   if(mCollider.gameObject.tag=="Player")  
  13.   {  
  14.     Triggered=false;  
  15.   }  
  16. }  
       我们在这里是通过改变一个bool型的标志变量来标记角色是否引起了触发,当引起了触发的时候执行开门的动画,退出除了触发的时候执行关门的动画。这一部分我们放在Update()方法里:
[csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. void Update ()   
  2. {  
  3.   if(Triggered)  
  4.   {  
  5.     OpenDoorAni();  
  6.   }else if(!Triggered)  
  7.   {  
  8.     CloseDoorAni();  
  9.   }  
  10. }  

      最后给出全部代码:
[csharp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class AniScripts : MonoBehaviour {  
  5.       
  6.     //定义门的移动速度  
  7.     public float mSpeed=1.5F;  
  8.     //定义门的标志变量  
  9.     private bool Triggered=false;  
  10.       
  11.     void Update ()   
  12.     {  
  13.       if(Triggered)  
  14.       {  
  15.         OpenDoorAni();  
  16.       }else if(!Triggered)  
  17.       {  
  18.         CloseDoorAni();  
  19.       }  
  20.     }  
  21.       
  22.     //开门动画  
  23.     private void OpenDoorAni()  
  24.     {  
  25.       if(transform.position.x<=1.8F)  
  26.       {  
  27.         transform.Translate(Vector3.right * Time.deltaTime * 1.5F);  
  28.       }  
  29.     }  
  30.     //关门动画  
  31.     private void CloseDoorAni()  
  32.     {  
  33.       //等待5秒后再关门,避免角色与门发生碰撞  
  34.       StartCoroutine("Wait");  
  35.       if(transform.position.x>=0)  
  36.       {  
  37.         transform.Translate(Vector3.left * Time.deltaTime * 1.5F);  
  38.       }  
  39.     }  
  40.       
  41.     void OnTriggerEnter(Collider mCollider)  
  42.     {  
  43.       Debug.Log(mCollider.gameObject.tag);  
  44.       if(mCollider.gameObject.tag=="Player")  
  45.       {  
  46.         Triggered=true;  
  47.       }  
  48.     }  
  49.       
  50.     void OnTriggerExit(Collider mCollider)  
  51.     {  
  52.       if(mCollider.gameObject.tag=="Player")  
  53.       {  
  54.         Triggered=false;  
  55.       }  
  56.     }  
  57.       
  58.       
  59.     IEnumerator Wait()  
  60.     {  
  61.         //等待5秒在执行  
  62.         yield return new WaitForSeconds(5);  
  63.     }  
  64.       
  65.       
  66. }  

        一起来看看效果演示吧:

0 0