今天仍在探討Player與階梯、Ceiling之間的碰撞關係,由於碰撞判斷還是有所缺失,所以接著要來學習怎麼判斷碰撞的方向,會利用到座標、法向量等概念。
Debug.Log(other.contacts[0].point);
Debug.Log(other.contacts[1].point);
先寫在OnCollisionEnter2D裡,測試看看印出來的座標點長怎樣
void OnCollisionEnter2D(Collision2D other)
{
if(other.gameObject.tag == "Normal")
{
Debug.Log(other.contacts[0].point);
Debug.Log(other.contacts[1].point);
Debug.Log("撞到Normal");
currentFloor = other.gameObject;
}
else if(other.gameObject.tag == "Nails")
{
Debug.Log(other.contacts[0].point);
Debug.Log(other.contacts[1].point);
Debug.Log("撞到Nails");
currentFloor = other.gameObject;
}
從Console欄可以知道這兩點的座標,而當我們知道碰撞到的點在哪之後,就可以得知該點的法向量是多少。
Debug.Log(other.contacts[0].normal);
可以發現Player如果碰撞到階梯上方,輸出的法向量會是一樣的,如圖都是(0.00,1.00)。
if(other.contacts[0].normal == new Vector2(0f,1f))
因為剛剛發現到Player如果碰撞到階梯上方,輸出的法向量是(0.00,1.00),再修改一下程式碼變成這樣
if(other.gameObject.tag == "Normal")
{
if(other.contacts[0].normal == new Vector2(0f,1f))
{
Debug.Log("撞到Normal");
currentFloor = other.gameObject;
}
}
else if(other.gameObject.tag == "Nails")
{
if(other.contacts[0].normal == new Vector2(0f,1f))
{
Debug.Log("撞到Nails");
currentFloor = other.gameObject;
}
}
試玩後發現,當Player往左撞到階梯Console欄不會輸出撞到什麼階梯,也不會改變currentFloor,所以碰到天花板尖刺就不會有之前卡住的情況了!
還記得高中數學學到法向量的單元時,都是用來做數學題的計算,今天所學的卻是拿來判斷碰撞方向,果然寫程式與數學觀念還是息息相關的呢!