程序员人生 网站导航

碰撞检测 BoxCollider 的特殊实现

栏目:综合技术时间:2015-02-04 09:14:47

当作触发器的Collider检测,可以通过 


private void OnTriggerStay(Collider collider);

private void OnTriggerEnter(Collider collider);

private void OnTriggerExit(Collider collider);


来实现,当有物体与当前触发器碰撞时候自动调用OnTriggerEnter(),当物体在触发器内容时候自动调用OnTriggerStay(),当物体离开触发器时候自动调用OnTriggerExit(),


但是当处于触发器内部的物体消失(被消灭,被杀死  Deactive)时候,这个物体就不会触发OnTriggerExit,有兴趣的同学可以自己测试1下。


所以当我们需要实现1个这样的效果:


当有目标物体进入触发器内部的时候就发出1个进入的事件,以后当触发器内部没有物体的的时候再发出1个退出的事件。


注意这里触发器内部没有物体是在先有进入物体的条件下,所以当使用OnTriggerEnter 和OnTriggerExit 来发失事件时候就不正确了,由于当1个物体进入触发器 发出了进入的事件,但是它被Deactive了,此时触发器内部没有物体,但是却不会发出退失事件。


我的实现方法是使用1个记时装置,使用协同程序,当触发进入事件


以后打开记时装置,

这个程序的实现为:

IEnumerator ChackTarget() { bool isContinue = true; while(isContinue) { _chackNum -= Time.deltaTime; yield return new WaitForSeconds(Time.deltaTime); if (_chackNum<0) { OnTargetExit(); isContinue = false; } } }

在OnTriggerStay里检测到物体停留就为 _chackNum赋值,当OntriggerStay 不在运行时候,计时器就会不断削减 _chackNum 最后小于0调用退出方法。

对了这个方法说1下,如果在触发器内部有物体的话,这个方法会每帧被调用1次。


private void OnTriggerEnter(Collider collider) { if (collider.gameObject.layer == Layers.WEAPON_HIT && collider.gameObject.tag == Tags.DAMAGED) { OnTargetEnter(); _chackNum = 1f; StartCoroutine("ChackTarget"); } } private void OnTriggerStay(Collider collider) { if (collider.gameObject.layer == Layers.WEAPON_HIT && collider.gameObject.tag == Tags.DAMAGED) { _chackNum = 1f; } }


如此实现,可以保证在1个进入和退出进程中只有1个计时程序在运行,在触发器中没有物体后的1秒钟内自动发出退出的消息。


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐