碰撞检测 BoxCollider 的特殊实现

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

private void OnTriggerStay(Collider collider);

private void OnTriggerEnter(Collider collider);

private void OnTriggerExit(Collider collider);

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

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

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

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

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

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

之后打开记时装置,

这个程序的实现为:

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调用退出方法。

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

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秒钟内自动发出退出的消息。

时间: 2024-10-13 12:28:05

碰撞检测 BoxCollider 的特殊实现的相关文章

我的Unity3D学习日记-05(官方实例2Droguelike)

快要一个月没有更新了,这段时间也没闲着.今天就把这段时间学到的东西稍微总结一下. 前段时间开始看一些实战开发的内容和教程.一些是来自于麦子学院的视频,一些来自于蛮牛教育,还有一部分官方教学视频.最终选择试着跟着官方的教程,尝试敲一次这个叫做拾荒者的官方示例. 过程中遇到了许多之前不明白的知识,所以虽然代码量不是很大,但是仍然消耗了大量的时间用于查询其中一些使用的方法和技巧. 最终当然是仿照着实例成功地将游戏做了出来(虽然其中大部分东西只要跟着敲都问题不大.) 以下我将一些自己的见解以注释的形式写

【Unity入门】碰撞检测与触发检测

版权声明:本文为博主原创文章,转载请注明出处. 在Unity里面,游戏物体的碰撞我们可以通过刚体组件(Rigidbody)和碰撞器组件(Collider)来进行检测.首先在场景里面添加一个Plane面板作为地面,然后在Plane面板的上方一定高度处放一个Cube立方体. 然后给Cube立方体添加一个刚体组件(Rigidbody).运行游戏,这时候我们可以看到立方体掉在了面板上面. 立方体和面板产生了碰撞,并且禁止在面板上,这时候我们可以可以通过脚本来进行检测,比如立方体掉在面板上的时候我们可以将

Cocos2d-x3.2 碰撞检测--圆形

//GameScene.h #include "cocos2d.h" USING_NS_CC; class GameScene : public cocos2d::Layer { public:     static cocos2d::Scene* createScene();          virtual bool init();          virtual bool onTouchBegan(Touch *touch, Event *unused_event);     

Physics 碰撞检测回调方法出错或者没有效果解决方法

1.碰撞检测回调方法编译出错; auto *listener = EventListenerPhysicsContact::create(); listener->onContactBegin = CC_CALLBACK_1(HelloWorld::onContactBegin,this); 在3.0rc版本中回调函数的参数变为一个,不能使用原来的两个参数; bool HelloWorld::onContactBegin(PhysicsContact& contact) { auto spr

简单圆形碰撞检测

整理以前的文件时看到之前写过的圆形的碰撞检测,简单记录下. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <canvas id="cav" width="500" height=&quo

Egret 矢量绘图、遮罩、碰撞检测

矢量绘图: 1. 为矢量绘图绘制外边 - graphics.lineStype() private createGameScene():void { console.log("Runtime start."); var myShape:egret.Shape = new egret.Shape(); myShape.graphics.lineStyle(10, 0x00ff00, 1); myShape.graphics.beginFill(0xff0000, 1); myShape.

显示对象的像素级碰撞检测

mc2.gotoAndStop(1); var bmd1 = new BitmapData(mc1.width, mc1.height, true, 0); bmd1.draw(mc1); var bmd2 = new BitmapData(mc2.width, mc2.height, true, 0); bmd2.draw(mc2); stage.addEventListener(Event.ENTER_FRAME,frameFunc); function frameFunc(e:Event)

Cocos2d-x Tiled地图编辑器(二)精灵走动起来、碰撞检测

图: 程序代码: 头文件声明函数及变量 void registerWithTouchDispatcher(void); bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); void setViewpointCenter(CCPoint position) ; void setSpritePoint(CCPoint position) ;

Unity3d碰撞检测中碰撞器与触发器的区别

一,要产生碰撞必须为游戏对象添加刚体(Rigidbody)和碰撞器,刚体可以让物体在物理影响下运动. 二,两个物体都必须带有碰撞器(Collider),其中一个物体还必须带有Rigidbody刚体. 三,在unity3d中,能检测碰撞发生的方式有两种,一种是利用碰撞器,另一种则是利用触发器. 1>碰撞器:一群组件,它包含了很多种类,比如:Box Collider(盒碰撞体),Mesh Collider(网格碰撞体)等,这些碰撞器应用的场合不同,但都必须加到GameObjecet身上,碰撞检测,但