2014年5月2日 星期五

Unity3D C# 物件碰撞刪除、碰撞偵測運用

Unity3D C# 物件碰撞刪除、碰撞偵測運用


Unity3D碰撞檢測分為2種:

1. 觸發檢測 //aaa為自定義碰撞事件
•當進入觸發器,void OnTriggerEnter( Collider aaa)
•當退出觸發器,void OnTriggerExit( Collider aaa)
•當停留觸發器,void OnTriggerStay( Collider aaa)

2. 碰撞檢測 //aaa為自定義碰撞事件
•當進入碰撞器,void OnCollisionEnter( Collision aaa)
•當退出碰撞器,void OnCollisionExit( Collision aaa)
•當停留碰撞器,void OnCollisionStay( Collision aaa)

2種方式最簡單的區別就是;
觸發器的方式下物件的" Is Trigger "" 可以"勾選,
碰撞器的方式下物件的" Is Trigger "" 不可以 "勾選。
Is Trigger 不勾選表示物件,受到碰撞或重力影響,
Is Trigger 勾選表示物件,不受到碰撞或重力影響,
首先在畫面中建立2個Cube,分別命名CubeA和CubeB,CubeA在上方,準備自由落體;
腳本放在CubeB中。

範例一:A物件自由落體時,穿越B物件,除錯視窗顯示" OK ";以物件名稱作為判別。
(A物件Is Trigger " 不勾選,B物件Is Trigger " 勾選 " )
using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour
{
    void OnTriggerEnter(Collider aaa) //aaa為自定義碰撞事件
    {    
        if (aaa.gameObject.name == "CubeA") //如果aaa碰撞事件的物件名稱是CubeA
        {    
            print("OK"); //在除錯視窗中顯示OK
        }
    }
}


範例二:A物件自由落體時,停留B物件,除錯視窗顯示" OK ";以物件名稱作為判別。
(A物件Is Trigger " 不勾選,B物件Is Trigger " 不勾選 " )
using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour
{
    void OnCollisionEnter(Collision aaa) //aaa為自定義碰撞事件
    {    
        if (aaa.gameObject.name == "CubeA") //如果aaa碰撞事件的物件名稱是CubeA
        {    
            print("OK"); //在除錯視窗中顯示OK
        }
    }
}


範例三:A物件自由落體時,觸發B物件,進行物件刪除;以物件標籤名稱作為判別。
這裡必須先設定CubeA的標籤為" test "。
(A物件Is Trigger " 不勾選,B物件Is Trigger " 勾選 " )
using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour
{
    void OnTriggerEnter(Collider aaa) //aaa為自定義碰撞事件
    {    
        if (aaa.gameObject.tag == "test") //如果aaa碰撞事件的物件標籤名稱是test
        {    
            Destroy(aaa.gameObject); //刪除碰撞到的物件(CubeA)
        }
    }
}


範例四:A物件自由落體時,碰撞B物件,進行物件刪除;以物件標籤名稱作為判別。
這裡必須先設定CubeA的標籤為" test "。
(A物件Is Trigger " 不勾選,B物件Is Trigger " 不勾選 " )
using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour
{
    void OnCollisionEnter(Collision aaa) //aaa為自定義碰撞事件
    {    
        if (aaa.gameObject.tag == "test") //如果aaa碰撞事件的物件標籤名稱是test
        {    
            Destroy(aaa.gameObject); //刪除碰撞到的物件(CubeA)
        }
    }
}