08:Demo之四处找死(三)_触发器

最后更新于:2022-04-01 14:37:40

好了,游戏开始进入奇怪的阶段了,接下来我们要在场景里放上地雷,终结这个帅气的BugPlayer吧。 > 笨木头花心贡献,啥?花心?不,是用心。 > 转载请注明,原文地址:[http://www.benmutou.com/archives/2157](http://www.benmutou.com/archives/2157) > 文章来源:[笨木头与游戏开发](http://www.benmutou.com/blog/) ### 1.Sphere物体 除了Cube(立方体)之外,我们还可以创建很多种形状的物体。 这里我们需要做一个地雷,地雷是有一个杀伤范围的,或者叫做触发范围,也就是说,特么的判断你是否踩到我了。 通常范围的判断都是用圆形的,而在3D的世界里,就是一个立体的圆形。 所以,我们需要创建一个球体——Sphere。 和创建Cube的方式一毛一样:【Hierarchy】-【3D Object】-【Sphere】 如图: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_575541af64b84.jpg) 但是有一个小细节,我们要在Terrain上面点击右键来创建这个物体,这样物体就创建到地形下面了。 还记得当时创建Cube时的情况吗?它会跑到世界的某个角落,很难找,所以我们要把它创建到Terrian的角落。 ### 2.移动球体到BugPlayer的附近 OK,把球体移动到合适的位置,离BugPlayer近一些。 大家看我的操作,移动物体是有个小技巧的,不需要通过箭头来移动,而是通过物体的某个“面”来移动。 大家自己感受吧: ![u008_1.gif](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_575541af793f8.gif) ### 3.地雷和球体有什么关系? 也许大家觉得很奇怪,地雷为什么要用球体来实现? 这是因为,地雷的技能(自爆)是由外界来触发的,特么的你踩我了,我这暴脾气就出来了,这就是自爆。(小若:特么的好有道理) 而触发某个事件需要触发器,并且需要一个范围,刚刚已经解释了,用球体作为范围来判断是否触发事件,是比较合适的。 当然,你喜欢正方体也行、不规则形状也行,越复杂的形状,会越消耗性能。 ### 4.触发器 刚刚我们提到了触发器,这是[游戏开发](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=55bc1c28ae1ac20&k=%D3%CE%CF%B7%BF%AA%B7%A2&k0=%D3%CE%CF%B7%BF%AA%B7%A2&kdi0=0&luki=5&mcpm=0&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=20ace18ac2c15b05&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2157&urlid=0)里一个很重要的东西。 而Cube、Sphere等物体都是自带触发器的,正确地说,是碰撞器。 我们先来看看Sphere的碰撞器,如图: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_575541af99f13.png) 碰撞器也是物体的一个[组件](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=55bc1c28ae1ac20&k=%D7%E9%BC%FE&k0=%D7%E9%BC%FE&kdi0=0&luki=3&mcpm=0&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=20ace18ac2c15b05&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2157&urlid=0),记住,一切都是组件。 Sphere物体的碰撞器就叫做【Sphere Collider】,Cube的碰撞器就叫做【Cube Collider】,只是形状不一样。 不知道大家发现了没有,我偷偷在【Is Trigger】的属性里打勾了。(小若:没看见,被奇怪的东西挡住了) 这个属性是关键,只有勾上这个属性,【碰撞器】才能真正的称之为【触发器】。 有了Is Trigger属性之后,碰撞器就能检查到是否有物体进入了它的范围,并且会触发回调函数。 而我们只需要在回调函数里做我们想做的事情。 ### 5.触发器事件函数 现在这个地雷是假的,因为它没有任何实际效果,要想有实际效果,就得给它一个AI,没错,我们得给它加个脚本。 新建一个脚本文件,[命名](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=55bc1c28ae1ac20&k=%C3%FC%C3%FB&k0=%C3%FC%C3%FB&kdi0=0&luki=1&mcpm=0&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=20ace18ac2c15b05&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2157&urlid=0)为..SomethingGGD吧,一些怪怪的东西。 然后把脚本拖到Sphere物体上。 打开SomethingGGD脚本,加入以下三个函数: ~~~ public class SomethingGGD : MonoBehaviour {    void Start()    {        Debug.Log("Start");    }    void OnTriggerEnter(Collider other)    {        Debug.Log("OnTriggerEnter");    }    void OnTriggerStay(Collider other)    {        Debug.Log("OnTriggerStay");    }    void OnTriggerExit(Collider other)    {        Debug.Log("OnTriggerExit");    }} ~~~ Start:这个[函数](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=55bc1c28ae1ac20&k=%BA%AF%CA%FD&k0=%BA%AF%CA%FD&kdi0=0&luki=2&mcpm=0&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=20ace18ac2c15b05&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2157&urlid=0)在这里是多余的,只是为了验证这个脚本是否生效了。 OnTriggerEnter:当有物体进入我的[触发器](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=55bc1c28ae1ac20&k=%B4%A5%B7%A2%C6%F7&k0=%B4%A5%B7%A2%C6%F7&kdi0=0&luki=6&mcpm=0&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=20ace18ac2c15b05&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2157&urlid=0)范围时调用; OnTriggerStay:当物体在我的触发器范围内停留时,一直调用; OnTriggerExit:当物体离开我的[触发器](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=55bc1c28ae1ac20&k=%B4%A5%B7%A2%C6%F7&k0=%B4%A5%B7%A2%C6%F7&kdi0=0&luki=6&mcpm=0&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=20ace18ac2c15b05&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2157&urlid=0)范围时调用。 三个函数都很好理解,不多说了。 重点是下面要做的事情。 ### 6.让主角去触发 触发器 我们试试主角现在进入地雷范围时,会不会触发这些函数。 但,在这之前,我们的Sphere有点小,几乎看不到它了,把Sphere的Scale属性设大一些,就设为(10,10,10)吧: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_575541afb3947.png) OK,运行游戏,看看主角是否能触发这些函数,在运行游戏时,左下角会出现一些日志。 而我们在代码里调用Debug.Log()[函数](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=55bc1c28ae1ac20&k=%BA%AF%CA%FD&k0=%BA%AF%CA%FD&kdi0=0&luki=2&mcpm=0&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=20ace18ac2c15b05&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2157&urlid=0)就可以在这个地方打印日志。 现在运行游戏,可以看到日志“Start”,证明这个SomethingGGD脚本是已经在运作的,如图: ![u008_2.gif](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_575541ebd521a.gif) 但是当我们尝试让主角去撞地雷的时候,却没有任何新的日志输出,这就代表触发器没生效,这是为什么呢? 因为我们的主角并不是一个“刚体”,也就是说,主角不是一个物理对象。 只有物理对象才有碰撞的说法,只有碰撞了才能让触发器生效。 ### 7.给主角添加刚体组件 我们先来给主角添加一个刚体组件: ![u008_3.gif](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_575541ebf2e61.gif) 添加了刚体组件之后,主角就具备一些物体特性了,但实际上我们不需要主角模拟物体特性,我们只是要它能产生碰撞而已。 所以我在创建了刚体组件后,把【Use Gravity】属性的勾给去掉了,这个属性代表主角是否受重力影响。 如果主角受重力影响,那么,主角会一直往下掉的。 OK,再次运行[游戏](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=55bc1c28ae1ac20&k=%D3%CE%CF%B7&k0=%D3%CE%CF%B7&kdi0=0&luki=4&mcpm=0&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=20ace18ac2c15b05&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2157&urlid=0),让主角去撞地雷,这次就能出现日志了: ![u008_4.gif](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_575541ec26090.gif) ### 8.碰撞器 我们一直在说的[触发器](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=55bc1c28ae1ac20&k=%B4%A5%B7%A2%C6%F7&k0=%B4%A5%B7%A2%C6%F7&kdi0=0&luki=6&mcpm=0&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=20ace18ac2c15b05&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2157&urlid=0),其实是碰撞器,碰撞是需要两个碰撞器相互产生的。 如果大家有留意的话,应该能发现BugPlayer身上也是有一个碰撞器(Collider)的: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-06-06_575541ec476bf.png) 如果把这个碰撞器从主角身上移除,那么,地雷的碰撞器也就无法发现主角了。 我们来理一理: 1. 要产生碰撞,需要双方都有一个碰撞器,因为这是判断物体是否碰撞的依据,可以理解为,这是一个碰撞范围。 2. 碰撞器只是判断是否碰撞的依据,但是要真正触发碰撞事件,则必须至少有一个物体是具备刚体[组件](http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=18&is_app=0&jk=55bc1c28ae1ac20&k=%D7%E9%BC%FE&k0=%D7%E9%BC%FE&kdi0=0&luki=3&mcpm=0&n=10&p=baidu&q=25013069_cpr&rb=0&rs=1&seller_id=1&sid=20ace18ac2c15b05&ssp2=1&stid=0&t=tpclicked3_hc&td=1682305&tu=u1682305&u=http%3A%2F%2Fwww%2Ebenmutou%2Ecom%2Farchives%2F2157&urlid=0)的。 3. 总结:至少存在一个刚体时,才能触发碰撞事件,而判断物体是否碰撞的依据是碰撞器(碰撞器的碰撞范围是可以调整的,比如球体形、立方体形、不规则形状) 好了,关于碰撞,还是需要慢慢理解的,我也只是处于初步了解的状态,不多说。 ### 9.待续 这一篇写得有点多,下次我们来实现什么功能好呢? 要不,我们来炸死主角吧。 本篇源码:[Unity_benmutou_008.7z](http://www.benmutou.com/wp-content/uploads/2015/11/wpid-90d41d8ecb5577b5fa88cb400af14f1c_Unity_benmutou_008.7z)[](#)
';