碰撞檢測 BoxCollider 的特殊實現
來源:程序員人生 發布時間:2015-02-04 09:14:47 閱讀次數:4795次
當作觸發器的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秒鐘內自動發出退出的消息。
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈