不知道大家有沒有在玩遊戲的時候遇過移動跳台,這個會在半空中來回移動的平台可說是一些動作遊戲中的常客,而最近我也正好想替自己做的自製遊戲加入這樣的一個要素,原先以為只是個簡單的小東西卻不知不覺搞了超級久才好不容易做出來,究竟是遇到了什麼樣的難題才會卡這麼久,下面就讓我一一分享吧。
首先我先是去查了youtube上別人的作法,隨後便看到了這支影片:
為了能讓玩家停留在跳台上,影片中所使用的方法是讓玩家在接觸到跳台了之後就把玩家設定成跳台的子物件,而後離開跳台的時候再解除兩者的父子關係,於是我也將同樣的方法套用到了自己的移動跳台上……
結果我就不能動了!!
這是為什麼呢?
原先我的移動跳台是使用transform.Translate的方式來移動的,也就是每一偵直接地去調整物件的位置,所以我自己的猜測是玩家與跳台的相對位子也被強制維持住了。(
官方說明)
後來我就放棄了設定子物件的做法,並且改用了rigidbody.MovePosition,這個方法可以讓有剛體的物件按照它的物理特性去做移動,並且也能讓物件在移動的同時產生相對應的摩擦力。
而改用了這個方法後,我總算能正常地站在平台上了……
才怪!我居然在跳台轉向的時候滑下去了!
雖然當下覺得很靠杯,不過這一次的原因應該就比較簡單了,我自己的想法如下。
在移動平台轉向的時候雖然會帶著玩家一起移動,然而由於玩家本身帶有剛才向右的速度的關係,需要先花一點時間來抵銷向右的速度,在還未抵銷完全之前玩家都還會再往右移動。
於是我後來就用了一個比較粗暴的方式來解決。
上圖的程式碼當中,我幫移動跳台宣告了一個 "跟隨列表" ,這個列表會將接觸到移動跳台的所有物件存起來,然後在跳台移動的同時去改變列表中每個物件的速度,讓他們全部跟跳台同步,這樣子就算是轉向的時候也會立刻讓玩家的速度跟上,於是乎……
我終於不會打滑啦~!
這理想稍微說一下,我玩家在地面的移動方式是使用rigidbody.MovePosition,並非直接去調動玩家的速度(rigidbody.velocity),所以即使速度被設定的跟跳台一樣也不會因此而完全被牽著走……
我知道這聽起來很怪,讓我們換一個簡單點的說法吧,今天MovePosition便是移動位置,而移動跳台本身會讓物體獲得與其相同的速度,所以最後產生的結果就會像是玩家隨跳台向右移動,接著我在不影響玩家速度的情況下把玩家抓起來並放到左邊一點的位子,這兩個動作無論先後都不會影響到對方,但是……
假的!我居然跳不起來
為什麼呢? 因為我在跳躍的時候是給予玩家一個朝上的初速度,讓玩家離地之後再慢慢被重力拉下來,問題來了,假如我貼在跳台表面上的時候速度會一直被同步呢? 這樣的話我的Y軸(上下)移動就永遠會被跳台抓著。
(後面用炸彈可以彈飛是因為使用rigidbody.Addforce的方法,也就是在玩家身上施加 "力" ,儘管在離開跳台前,玩家的Y軸速度被跳台設成0,但由於玩家身上還有 "殘餘的力" ,力繼續影響速度,使的玩家能正常脫離。) (參考自這篇
討論)
於是我又使用了一個頗為粗暴的方式,如下圖。
在這邊的話我特別去針對了不同種類的物件調整跟隨方式,如果物件是玩家種類的話,那就只要去影響他的地面移動就好(也就是只影響X軸和Z軸),這麼寫了之後玩家就能正常地在跳台上移動與跳躍了。
因此我終於成功啦!
……
…………
太天真了!
什麼?! 又是哪裡出了問題?!
大家有沒有注意到影片中的那顆炸彈
它是懸空的呀!
為什麼會這樣呢? 這裡有一個前情提要得跟大家說一下,這款遊戲由於炸彈會貼在牆上的關係,只要摸到地面或牆面的時候都會關閉自己的重力,而當跳台由往上轉為往下時,玩家雖然還是會稍微脫離,但因為重力的關係會被拉回跳台表面,炸彈則不一樣,稍微脫離後是不會有重力把它拉回來的,所以我特別把炸彈設定成不會脫離先前提到的 "跟隨列表" 。
然而這依然存在著問題,那就是稍微脫離後,炸彈雖然會因為程式碼的關係,速度變得跟跳台一樣,開始往下降,但由於始終保持一樣的關係,剛才脫離的距離就會一直維持。
……做到這裡的時候我已經開始懷疑人生了,不過幸好我後來有找到一個可以解決的方案,那就是Joint。
(
圖源,想更深入了解的人也不妨點進該連結,看看教學影片)
Joint簡單來說就是幫兩個剛體製造連結,讓他們彷彿變成了同一個物體,Joint有分許多種不同的連結方式,在這裡我是使用了FixedJoint,一個比較單調的連結法。
在這裡的話我還新增了一個m_listBombsJoint的列表,用來記錄所有黏在跳台上的炸彈連結(雖然目前只會有一顆炸彈)
特別宣告一個列表來紀錄是因為之後炸彈爆炸後還要特別把Joint給刪掉,所以需要能去比對哪個Joint負責連結哪顆炸彈。
而在我這麼做了以後……
我終於成功啦!
雖然我知道跳台在向下的時候玩家會脫離一下下,但是沒有很嚴重我就有點懶得再調整了XD
再說這篇文章也寫得有點長了,請容我先寫到這裡吧,有什麼意見或想法的都歡迎提出!