2017年6月25日 星期日

[Unity]2D橫向捲軸遊戲的角色的移動與物理模擬筆記

關於標題,官網上有許多範例,這邊就只揀選我有用過的方法作個紀錄。


要用內建的物理模擬功能嗎?

https://www.assetstore.unity3d.com/en/#!/content/11228

首先,在實做前可以先把上面的範例找來試試,
其中有不少可以參考的地方,例如攝影機或捲動的背景等等。

至於角色移動,也可以參考範例中的方式,使用內建的物理模擬方式,
調整參數達到操作角色進行移動,跳躍等行為。

但這可能會有幾個狀況需要考慮:

1. 必須要很了解內建物理模擬功能的參數影響,才能調整出接近自己想要的效果。

2. 有些非現實的移動方式,要靠內建物理模擬來實現的話,可能需要使用比較間接的方式。

上面並不是說內建物理模擬不好,而是適不適合的問題,
想像一下,假如我們要做像小精靈一樣的遊戲,
我們也不需要用到物理模擬,只需要適當的碰撞偵測即可。

若我們需要的操作不複雜,只要加上適當碰撞偵測後,
移動行為就只是對物件做單純xy座標計算,
這樣就不用太花時間了解內建物理模擬的方式,
也可以準確做出自己想要的移動行為。

反之,假如熟悉內建物理模擬功能,很清楚要怎樣調整才能達成自己需求,
那也不需要重造車輪,直接用內建的功能吧。

再重申一次,不是好壞的問題,而是適不適合的問題。

以下的說明是不使用內建物理模擬的狀況。


那什麼是適當的碰撞偵測?





















當然還是看需求而定,就我所使用到的例子來說可以參考上圖,
當預期角色朝特定方向移動時,便將此方向拆分成水平與垂直分量,
各自打出射線去偵測是否打到其他碰撞體。


幾個打出射線需要注意的點:

1.射線長度跟每個frame想移動的距離有關

射線長度並不需要太長,因為其實我們想知道的是下個frame會不會碰到東西,
所以射線長度應該跟每個frame角色會移動多長的距離有關。

2. 射線的間隔依實際需求決定






















每個分量需要打多少射線?還是依照狀況而定。
像上圖,假如射線剛好沒有打凸出來的地方,角色便會認為凸出來的地方可以走進去。但也不是射線打越密越好,理由下述。

3. 射出射線這件事每個frame都得做

上列發出射線的行為是每個frame都在做的事,所以假如場景上有很多角色,每個角色在每個frame都打出很多射線,某種程度來說對效能會造成負擔。

所以射線的數量與長度還是需要根據需求來做調整。

那上面的內容是否還得自己寫程式碼實現呢?

https://github.com/prime31/CharacterController2D

上面剛好有別人寫好的功能可以直接套用,
裡面也有範例,有興趣就抓來試試吧,
甚至修改一些功能(例如把boxcollider改成其他的collider或組合起來的collider群組)。

使用上述連結功能,加上一些國中物理來做座標計算,
就可以實現很基本的2D橫向捲軸操作了。
















沒有留言:

張貼留言