顯示具有 Unity 標籤的文章。 顯示所有文章
顯示具有 Unity 標籤的文章。 顯示所有文章

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橫向捲軸操作了。
















2017年6月18日 星期日

[Spine][Unity][筆記]使用Spine製作2D遊戲攻擊判定

如題,最近剛好試到這個功能,作個簡略的筆記,操作的細節就不多提了。

主要流程就是Spine提供功能,可以圈選出一個區域,
匯入Unity後,便可透過某些方式自動產生一個會跟著bone的polygon collider。

Step 1. 在Spine中設定bounding box


如上圖,在想要綁定bounding box的bone上新增一個socket,
在socket中新增bounding box。

Step 2. 在Spine動畫模式中控制bounding box產生跟消失的時機


攻擊判定只有在攻擊瞬間才為出現,
所以需在動畫模式決定bounding box產生跟消失的時機

Step 3. 輸出Spine資料匯入Unity

略

Step 4. 在Unity 用spine骨架資料產生game object A,並建立一個子game object B附加於A

略,另外做一個game object的原因後面會提

Step 5. 在B上新增Bounding Box Follower,並且選定對應的骨架資料與socket















如圖,把上圖SpineAnimationSide1當作A,BB_Side1_FrontFoot當作B,
在B中新增Bounding Box Follower Component,
便可選擇要指定骨架跟Socket,
可以看到上圖的下拉式選單中,沒bounding box的socket都反白沒得選。

上述動作還會自動幫增加rigidbody 2D還有polygon collider 2D兩個component,

若是在A上增加Bounding Box Follower Component,會有提示訊息要使用者另外新增在B上,
就我自己理解,在我們製作攻擊判定的case中,
可能不會希望攻擊判定的碰撞效果,佔用A的rigidbody,
影響到原來角色A的各種行為(例如移動),
所以會變成另外產生一個B,讓碰撞判定有自己的設定。

Step 6. 在B上新增Bone Follower,並選擇對應的bone


只做Step5碰撞體還不會跟著動,要讓它跟著骨頭才行。
所以需要新增bone follower並選定對應的bone。

上述事情做完後,再寫腳本於OnTriggerEnter2D中設定好動畫演出,
就可以讓角色產生攻擊判定了。





參照影片,現在角色的攻擊動作,就有對應的攻擊判定了。