iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 8
1
Software Development

Unity遊戲開發與實踐-BlueRemedy內容分享系列 第 8

[Day8] 主角-基本操作(蹬牆跳躍篇)

  • 分享至 

  • xImage
  •  

BlueRemedy基礎操作第三篇,今天要講到的是"蹬牆跳"能力。這個系統在許多遊戲中都會看到:當操作主角跳上牆壁,會有一小段時間抓在牆壁上,這時侯可以在按下跳躍鍵進行跳躍。

老實說這個功能在起初企畫階段並沒有加入,直到做好移動及跳躍後才發現有個BUG…

看見了嗎? 當前方有牆壁時,只要持續按著方向鍵,Oka就會卡在牆壁上,而且他那短短的腳還不斷走啊走的,太奇怪了吧!

經過討論後我們決定讓Oka新增蹬牆跳能力,並且結合"水"的特性,讓他變成水滴黏在牆上。


開始正題

Step1:判斷前面有障礙物

首先要先寫點程式讓程式知道現在Oka前方撞到障礙物了,那這個判斷方式和前天的footCheck同樣道理,在Oka面前一個點畫半徑0.15f的範圍,如果有碰到地板Layer的物件就代表撞到牆壁,並且將結果回傳至frontTouchWall變數中。程式方面前天介紹過,就不再重複說明了。
https://ithelp.ithome.com.tw/upload/images/20200913/20130414nMyD7BZPTs.jpg

同樣在PointCheck函式中使用Physics2D.OverlapCircle作偵測
https://ithelp.ithome.com.tw/upload/images/20200913/201304145cYZg062RY.jpg

Step2:判斷障礙物法向量

再來第二步,我希望能偵測前方障礙物的坡度,藉此判斷他是一面牆或單純只是個比較高的坡,並設定只有超過一定角度的牆才可以使出蹬牆能力。

先宣告三個變數

  • Vector2 contactNormal,用來記錄障礙物和主角接觸點的法向量
  • float angleWithCol,計算過後的碰撞角度會記錄在這個變數
  • bool isStickOnWall,紀錄是否已經黏在牆上
    https://ithelp.ithome.com.tw/upload/images/20200913/20130414TCAzdO6HJN.jpg

然後加入以下程式,當和指定的兩個Layer物件觸碰時,contactNormal會記錄觸碰點的法向量(collision.GetContact(0)是接觸點,.normal是轉換為法向量)
https://ithelp.ithome.com.tw/upload/images/20200913/20130414qpuPpwSsjy.jpg
https://ithelp.ithome.com.tw/upload/images/20200913/20130414mxhaBjX4FY.jpg

目前以這張圖,得到的法向量值大約會是(-0.6f,0.4f),很難理解對吧,所以加上一行運算,將這個法法向量換成我們比較好理解的角度,並存在變數中。
https://ithelp.ithome.com.tw/upload/images/20200913/201304145BAetUgWbq.jpg
得到的值會介於-90~90度之間(和tan函數有關)。

Step3:判斷是否黏在牆上

接下來再創一個StickWall函式,並於Update中呼叫。它的作用是檢查現在使否貼在牆上,並隨時設定狀態。
https://ithelp.ithome.com.tw/upload/images/20200913/20130414GKwjyc5dqV.jpghttps://ithelp.ithome.com.tw/upload/images/20200913/20130414Jnxn9SYFk9.jpg

重點來了! 在函式中我使用到以下程式:
https://ithelp.ithome.com.tw/upload/images/20200913/201304148a3iJUNOOK.jpg
如果現在isStickOnWall為非,但偵測到

  1. frontTouchWall為true,代表前面有地形障礙物
  2. Mathf.Abs(angleWithCol) < 35f,這個障礙物法向量來看是一面牆
  3. 腳沒觸地
  4. 我有X方向的輸入
    當四個條件同時滿足時,就認為是貼在牆壁上,設isStickOnWall為真。
    相反的,只要有條件不符,就是為離開牆壁。

現在有了isStickOnWall這個變數讓我們判斷是不是正貼著牆,就可以設定蹬橋跳躍的部分了。

Step4:蹬牆跳躍

回到Jump函式,我先為普通跳躍加上這個條件,以免貼在牆上按跳躍鍵卻又觸發普通跳躍。
https://ithelp.ithome.com.tw/upload/images/20200913/201304147QgWgKzhgf.jpg

加上另一行,當按下跳躍鍵且正貼在牆上時,會往牆壁法向量方向施加一個斜向上的力。不過這個力就得多嘗試才能找到適合的值。
https://ithelp.ithome.com.tw/upload/images/20200913/20130414ojpBP0vJmK.jpg

這就是完成的效果~


補充

因為篇幅關係蹬牆跳的部分就介紹到此。在專題中我們做到搭配動畫讓主角在牆壁上有像水珠黏著的視覺效果,並且針對法向量做適當旋轉,就像下圖這樣。

概念是在animator中創立一個bool變數,當黏在牆壁上時就設定為true,反則false。不過動畫部分不難,就等著讀者自己研究囉~


上一篇
[Day7] 主角-基本操作(跳躍篇)
下一篇
[Day9] 攝影機設定
系列文
Unity遊戲開發與實踐-BlueRemedy內容分享30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言