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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值