[Unity3D]Unity3D 游戏开发之碰撞检測
今天我们来一起来学习Unity3D中一个非常重要的概念:碰撞。
为什么说碰撞非常重要呢?由于在游戏中无时无刻不充满碰撞啊,在飞行类游戏中我们须要推断炮弹是否击中了敌人,在RPG游戏中我们须要推断玩家是否对敌人造成了伤害,在射击类游戏中我们须要推断子弹是否打中了敌人.......总而言之,在游戏中所谓的打击感就是我们今天要讲的碰撞,从概念上来说,一个物体受到来自其他物体的力的影响并发生位置或者状态上的改变,我们就能够称为碰撞。在Unity3D中系统已经提供了碰撞检測的相关方法,这里我们介绍两种碰撞检測的方法:
1、Collision检測:使用Collision检測须要用到以下三个重要的方法:OnCollisionEnter()在刚体与刚体接触时马上调用此方法、OnCollisionStay()在刚体与刚体碰撞中调用此方法、OnCollisionExit()在刚体与刚体碰撞结束时调用此方法。
2、Trigger检測:使用Trigger检測须要勾选IsTrigger属性,并用到以下的三个重要方法:OnTriggerEnter():開始碰撞、OnTriggerStay():碰撞中 、 OnTriggerExit():结束碰撞。
那么两种检測方法的差别是什么呢?Collision将造成物理碰撞。Trigger将造成非物理碰撞 。于此同一时候,请牢记以下的碰撞原则:
a、发生接触(Trigger)的前提是:两方都有碰撞器,且至少一方有刚体,且至少一方勾选了IsTrigger属性。
b、发生碰撞(Collision)的前提是:两方都有碰撞器,且至少一方有刚体。
以下我们来看一个演示项目,首先创建如图所看到的的场景。
这里我们对碰撞的目标做了推断。假设我们碰撞的对象的Sphere,则会运行目标对象的脚本中的方法,并输出碰撞信息。
目标对象Sphere的脚本和Cube类似,这里就不给出了。最后我们来看结果。如我们所预期的那样,屏幕上打印出了碰撞信息,控制台相同输出了对应的信息。
在这个演示项目中,我们将使用键盘来控制左边的Cube来碰撞右边的球体,然后再屏幕上打印碰撞信息,在控制台中输出脚本的调用情况。
首先我们来看为Cube编写的部分脚本代码:
- //一个控制台输出方法
- public void Log(string msg)
- {
- Debug.Log(msg);
- }
- //碰撞開始
- void OnCollisionEnter(Collision collision)
- {
- if(collision.gameObject.name=="Sphere")
- {
- Message="进入碰撞,碰撞名称:"+collision.gameObject.name;
- collision.gameObject.GetComponent<TargetScript>().Log(Message);
- }
- }
- //碰撞中
- void OnCollisionStay(Collision collision)
- {
- if(collision.gameObject.name=="Sphere")
- {
- Message="碰撞中,碰撞名称:"+collision.gameObject.name;
- collision.gameObject.GetComponent<TargetScript>().Log(Message);
- }
- }
- //碰撞结束
- void OnCollisionExit(Collision collision)
- {
- if(collision.gameObject.name=="Sphere")
- {
- Message="碰撞结束,碰撞名称:"+collision.gameObject.name;
- collision.gameObject.GetComponent<TargetScript>().Log(Message);
- collision.gameObject.rigidbody.Sleep();
- }
- }
为什么这里要编写两个输出到控制台的方法呢?由于在实际的游戏开发中,当发生碰撞的时候,我们可能须要作出一些更为实际的事情,比方给敌人减血啦,给我方加血啦。这里仅仅是简单地了解了Unity3D的碰撞机制。Trigger检測和这个基本类似,这里就不再赘述啦。谢谢大家。今天的内容就是这样啦!
转载:原文出处