BlueRemedy基礎操作第三篇,今天要講到的是"蹬牆跳"能力。這個系統在許多遊戲中都會看到:當操作主角跳上牆壁,會有一小段時間抓在牆壁上,這時侯可以在按下跳躍鍵進行跳躍。
老實說這個功能在起初企畫階段並沒有加入,直到做好移動及跳躍後才發現有個BUG…
看見了嗎? 當前方有牆壁時,只要持續按著方向鍵,Oka就會卡在牆壁上,而且他那短短的腳還不斷走啊走的,太奇怪了吧!
經過討論後我們決定讓Oka新增蹬牆跳能力,並且結合"水"的特性,讓他變成水滴黏在牆上。
首先要先寫點程式讓程式知道現在Oka前方撞到障礙物了,那這個判斷方式和前天的footCheck同樣道理,在Oka面前一個點畫半徑0.15f的範圍,如果有碰到地板Layer的物件就代表撞到牆壁,並且將結果回傳至frontTouchWall變數中。程式方面前天介紹過,就不再重複說明了。
同樣在PointCheck函式中使用Physics2D.OverlapCircle作偵測
再來第二步,我希望能偵測前方障礙物的坡度,藉此判斷他是一面牆或單純只是個比較高的坡,並設定只有超過一定角度的牆才可以使出蹬牆能力。
先宣告三個變數
然後加入以下程式,當和指定的兩個Layer物件觸碰時,contactNormal會記錄觸碰點的法向量(collision.GetContact(0)是接觸點,.normal是轉換為法向量)
目前以這張圖,得到的法向量值大約會是(-0.6f,0.4f),很難理解對吧,所以加上一行運算,將這個法法向量換成我們比較好理解的角度,並存在變數中。
得到的值會介於-90~90度之間(和tan函數有關)。
接下來再創一個StickWall函式,並於Update中呼叫。它的作用是檢查現在使否貼在牆上,並隨時設定狀態。
重點來了! 在函式中我使用到以下程式:
如果現在isStickOnWall為非,但偵測到
現在有了isStickOnWall這個變數讓我們判斷是不是正貼著牆,就可以設定蹬橋跳躍的部分了。
回到Jump函式,我先為普通跳躍加上這個條件,以免貼在牆上按跳躍鍵卻又觸發普通跳躍。
加上另一行,當按下跳躍鍵且正貼在牆上時,會往牆壁法向量方向施加一個斜向上的力。不過這個力就得多嘗試才能找到適合的值。
因為篇幅關係蹬牆跳的部分就介紹到此。在專題中我們做到搭配動畫讓主角在牆壁上有像水珠黏著的視覺效果,並且針對法向量做適當旋轉,就像下圖這樣。
概念是在animator中創立一個bool變數,當黏在牆壁上時就設定為true,反則false。不過動畫部分不難,就等著讀者自己研究囉~