1. 程式人生 > >【Unity3D】學習筆記(第7記)射線碰撞檢測

【Unity3D】學習筆記(第7記)射線碰撞檢測

unity中關於射線的有一個非常重要的函式類Physcics類,該類有RaycastLinecast兩種射線投射方式;第一種是以起點和射線方向為引數的投射,第二種是以起點和終點為引數的投射。既然是射線碰撞,那麼被射物體必須有被碰撞元件(如BoxCollider等);下面是有關滑鼠點選的射線碰撞檢測(Raycast方式)(如:點物體選中,點地圖行走)

Ray r = Camera.main.ScreenPointToRay(Input.mousePosition);//螢幕座標設為射線目標位置
RaycastHit h; //射線碰撞資訊
if(Physics.Raycast(r,out h,100,1<<LayerMask.NameToLayer("layer1")|1<<LayerMask.NameToLayer("layer2")))
{
	if(h.collider.CompareTag("Enemy"))//敵人
	{
		//如果碰撞的物件是Enemy。。。
	}
	if(h.collider.CompareTag ("Ground"))//地形
	{
		//如果碰撞的物件是Ground。。。
	}
}

第一行:從攝像機向滑鼠點選的點發出一條射線;因為滑鼠輸入座標其實就是在螢幕上的座標,故使用ScreenPointToRay(“滑鼠輸入座標”)即(螢幕座標轉射線目標位置);


第三行:if()括號裡面一整塊即Physics.Raycast()是bool值,滿足碰撞條件即為true,即滿足第4個引數;首先:引數1:r為射線;引數2:將碰撞資訊儲存到h,引數3:長度,太小會出現射線無法發射到目標;引數4:指定的層內碰撞器,需要先在Inspector面板的Layer設定好,即layer1和layer2,設定好之後,射線就只對擁有這些層標記的響應;

還有小問題要注意下,如果射線中間被其他物體擋住(即射線中途被攔截了),那麼我們可以將可能會擋住射線的物體的Layer設為Ignore Raycast(在面板設定)。

好了,再來看看Linecast方式吧

RaycastHit hit;
if(Physics.Linecast(position1,position2,out hit))
{
	if(hit.collider.gameObject.tag != null)//碰撞不為空(或自己指定碰撞體)
	{
		cameraPosition = hit.point;//將碰撞物體的座標賦給相機
	}
}

從座標position1向座標position2發射一條射線;

1:避免相機穿牆:如果是使用那種相機追隨主角方式的,用這種方式,從主角向相機發射一條射線,如果中間碰撞牆,則改變相機座標為hit.point(牆的座標),即將相機移動到牆前面,避免穿牆;

2:攻擊碰撞檢測:如子彈(從子彈發出的射線要短);其他武器,如揮劍:劍移動前後兩點設定射線(這個效果可能不是很精準,但也是種思路,可由此拓展)。