unity3D之简单的碰撞检测 .

   

   大家好,欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章,我的博客地址为:http://blog.csdn.net/qinyuanpei。

   今天我们来一起来学习Unity3D中一个很重要的概念:碰撞。为什么说碰撞很重要呢?因为在游戏中无时无刻不充满碰撞啊,在飞行类游戏中我们需要判断炮弹是否击中了敌人,在RPG游戏中我们需要判断玩家是否对敌人造成了伤害,在射击类游戏中我们需要判断子弹是否打中了敌人.......总而言之,在游戏中所谓的打击感就是我们今天要讲的碰撞,从概念上来说,一个物体受到来自其它物体的力的影响并发生位置或者状态上的改变,我们就可以称为碰撞。在Unity3D中系统已经提供了碰撞检测的相关方法,这里我们介绍两种碰撞检测的方法:

   Collision检测:使用Collision检测需要用到下面三个重要的方法:OnCollisionEnter()在刚体与刚体接触时立即调用此方法、OnCollisionStay()在刚体与刚体碰撞中调用此方法、OnCollisionExit()在刚体与刚体碰撞结束时调用此方法。

   Trigger检测使用Trigger检测需要勾选IsTrigger属性,并用到下面的三个重要方法:OnTriggerEnter():开始碰撞、OnTriggerStay():碰撞中 、 OnTriggerExit():结束碰撞。

   那么两种检测方法的区别是什么呢?Collision将造成物理碰撞,Trigger将造成非物理碰撞 。于此同时,请牢记下面的碰撞原则:发生接触(Trigger)的前提是:双方都有碰撞器,且至少一方有刚体,且至少一方勾选了IsTrigger属性。发生碰撞(Collision)的前提是:双方都有碰撞器,且至少一方有刚体。

   下面我们来看一个演示项目,首先创建如图所示的场景。


unity3D之简单的碰撞检测 .

  

   这里我们对碰撞的目标做了判断,如果我们碰撞的对象的Sphere,则会执行目标对象的脚本中的方法,并输出碰撞信息。目标对象Sphere的脚本和Cube类似,这里就不给出了。最后我们来看结果,如我们所预期的那样,屏幕上打印出了碰撞信息,控制台同样输出了相应的信息。

   在这个演示项目中,我们将使用键盘来控制左边的Cube来碰撞右边的球体,然后再屏幕上打印碰撞信息,在控制台中输出脚本的调用情况。

   首先我们来看为Cube编写的部分脚本代码:

[csharp] view plain copy
  1.        //一个控制台输出方法  
  2. public void Log(string msg)  
  3. {  
  4.   Debug.Log(msg);  
  5. }  
  6.   
  7. //碰撞开始  
  8. void OnCollisionEnter(Collision collision)  
  9. {  
  10.   if(collision.gameObject.name=="Sphere")  
  11.   {  
  12.      Message="进入碰撞,碰撞名称:"+collision.gameObject.name;  
  13.      collision.gameObject.GetComponent<TargetScript>().Log(Message);  
  14.   }  
  15. }  
  16.   
  17. //碰撞中  
  18. void OnCollisionStay(Collision collision)  
  19. {   
  20.   if(collision.gameObject.name=="Sphere")  
  21.   {  
  22.     Message="碰撞中,碰撞名称:"+collision.gameObject.name;  
  23.     collision.gameObject.GetComponent<TargetScript>().Log(Message);  
  24.   }  
  25. }  
  26.   
  27. //碰撞结束  
  28. void OnCollisionExit(Collision collision)  
  29. {   
  30.   if(collision.gameObject.name=="Sphere")  
  31.   {  
  32.     Message="碰撞结束,碰撞名称:"+collision.gameObject.name;  
  33.     collision.gameObject.GetComponent<TargetScript>().Log(Message);  
  34.     collision.gameObject.rigidbody.Sleep();  
  35.   }  
  36. }  

unity3D之简单的碰撞检测 .


    为什么这里要编写两个输出到控制台的方法呢?因为在实际的游戏开发中,当发生碰撞的时候,我们可能需要作出一些更为实际的事情,比如给敌人减血啦,给我方加血啦,这里只是简单地了解了Unity3D的碰撞机制,Trigger检测和这个基本类似,这里就不再赘述啦,谢谢大家,今天的内容就是这样啦!

   大家好,欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章,我的博客地址为:http://blog.csdn.net/qinyuanpei。

   今天我们来一起来学习Unity3D中一个很重要的概念:碰撞。为什么说碰撞很重要呢?因为在游戏中无时无刻不充满碰撞啊,在飞行类游戏中我们需要判断炮弹是否击中了敌人,在RPG游戏中我们需要判断玩家是否对敌人造成了伤害,在射击类游戏中我们需要判断子弹是否打中了敌人.......总而言之,在游戏中所谓的打击感就是我们今天要讲的碰撞,从概念上来说,一个物体受到来自其它物体的力的影响并发生位置或者状态上的改变,我们就可以称为碰撞。在Unity3D中系统已经提供了碰撞检测的相关方法,这里我们介绍两种碰撞检测的方法:

   Collision检测:使用Collision检测需要用到下面三个重要的方法:OnCollisionEnter()在刚体与刚体接触时立即调用此方法、OnCollisionStay()在刚体与刚体碰撞中调用此方法、OnCollisionExit()在刚体与刚体碰撞结束时调用此方法。

   Trigger检测使用Trigger检测需要勾选IsTrigger属性,并用到下面的三个重要方法:OnTriggerEnter():开始碰撞、OnTriggerStay():碰撞中 、 OnTriggerExit():结束碰撞。

   那么两种检测方法的区别是什么呢?Collision将造成物理碰撞,Trigger将造成非物理碰撞 。于此同时,请牢记下面的碰撞原则:发生接触(Trigger)的前提是:双方都有碰撞器,且至少一方有刚体,且至少一方勾选了IsTrigger属性。发生碰撞(Collision)的前提是:双方都有碰撞器,且至少一方有刚体。

   下面我们来看一个演示项目,首先创建如图所示的场景。


unity3D之简单的碰撞检测 .

  

   这里我们对碰撞的目标做了判断,如果我们碰撞的对象的Sphere,则会执行目标对象的脚本中的方法,并输出碰撞信息。目标对象Sphere的脚本和Cube类似,这里就不给出了。最后我们来看结果,如我们所预期的那样,屏幕上打印出了碰撞信息,控制台同样输出了相应的信息。

   在这个演示项目中,我们将使用键盘来控制左边的Cube来碰撞右边的球体,然后再屏幕上打印碰撞信息,在控制台中输出脚本的调用情况。

   首先我们来看为Cube编写的部分脚本代码:

[csharp] view plain copy
  1.        //一个控制台输出方法  
  2. public void Log(string msg)  
  3. {  
  4.   Debug.Log(msg);  
  5. }  
  6.   
  7. //碰撞开始  
  8. void OnCollisionEnter(Collision collision)  
  9. {  
  10.   if(collision.gameObject.name=="Sphere")  
  11.   {  
  12.      Message="进入碰撞,碰撞名称:"+collision.gameObject.name;  
  13.      collision.gameObject.GetComponent<TargetScript>().Log(Message);  
  14.   }  
  15. }  
  16.   
  17. //碰撞中  
  18. void OnCollisionStay(Collision collision)  
  19. {   
  20.   if(collision.gameObject.name=="Sphere")  
  21.   {  
  22.     Message="碰撞中,碰撞名称:"+collision.gameObject.name;  
  23.     collision.gameObject.GetComponent<TargetScript>().Log(Message);  
  24.   }  
  25. }  
  26.   
  27. //碰撞结束  
  28. void OnCollisionExit(Collision collision)  
  29. {   
  30.   if(collision.gameObject.name=="Sphere")  
  31.   {  
  32.     Message="碰撞结束,碰撞名称:"+collision.gameObject.name;  
  33.     collision.gameObject.GetComponent<TargetScript>().Log(Message);  
  34.     collision.gameObject.rigidbody.Sleep();  
  35.   }  
  36. }  

unity3D之简单的碰撞检测 .


    为什么这里要编写两个输出到控制台的方法呢?因为在实际的游戏开发中,当发生碰撞的时候,我们可能需要作出一些更为实际的事情,比如给敌人减血啦,给我方加血啦,这里只是简单地了解了Unity3D的碰撞机制,Trigger检测和这个基本类似,这里就不再赘述啦,谢谢大家,今天的内容就是这样啦!