2017年6月30日 星期五

TGDF2017心得筆記 - Day1

這兩天會去聽2017台北遊戲開發者論壇,

就我有聽的場次簡單地寫個心得筆記。

Day 1 - Google最新訊息搶先看

講師分享Google提供跟遊戲有關的最新服務。

我對工具的態度,通常是先知道有這樣的東西就好,
等有需求的時候再去研究,所以就不多說了。

總之就是以後有遊戲要測各種android平台的話,
直接找google提供的服務比較方便。

Day 1 - VR & AR邁向實境之路

講師分享AMD對VR的產品發展。

除非是有一定要VR才能實現的功能,我大概才會想多研究。
假如是為了想先站在浪頭上而去接觸,那要投入更多資源,
對我來說不划算,也不是我想做的事。

Day 1 - 以小型獨立工作室塑造 3D 日式動畫畫質

講師分享其所屬專案的美術製程。

由於是電子小說,攝影機角度比較固定,
建模(包含人物)可以只針對攝影機會照到的角度處理,
人物的五官可以直接用2D方式畫上去,
色塊著色的方式主要就是製作工具控制切分色塊的臨界值
場景氛圍則用工具控制色調與對比度,或用一些後製效果去處理,
同時把主角相對於背景突顯出來。

至於減少成本的方式,可以多放靜態場面,還有減少人物轉角度的狀況,
讓美術素材能夠盡量重複利用。
總之可以參考看看新房昭之的作品XD

Day 1 - 遊戲人工智慧與關卡難易度

教授介紹拆分遊戲內容來定義難度進而訓練AI的方法論。

遊戲流程其實就是有限狀態機,是狀態、對象、輸入輸出的集合,
所以要先從遊戲流程中拆解出狀態機,再來找出與難易度有關的要素,
便可參數化這些要素,進而以data driven的方式調校AI。

教授用撞球遊戲為例介紹了整個流程:
決定難易度的要素主要是AI要能判斷球的好打程度,
球與球間的距離、夾角、球的聚合程度等等,
然後可能也要考慮下一顆球的好打程度。

再來是根據輸入讓AI有預測輸出的能力,
最直接的方式是AI用遊戲裡的物理模擬去算不同結果,
但考量效能這並不是合適的作法,
於是便用機器學習的方式,
去預測擊球的結果與最後停下來的位置,
訓練到預測的結果與實際物理模擬的結果盡量接近。

這樣AI就有選球打的能力了。
讓AI根據難易度去做不同的輸入選擇,
笨一點的AI就選容易輸的輸入,強一點的AI就選容易贏的輸入。

所以回過頭來,最重要的是如何拆解出遊戲的狀態機,
建立難度與遊戲機制的對應關係。

而且這個對應關係有機會是可逆的:
假如可以設計關卡來對應不同難度,
那也有可能輸入難度自動產生關卡。
只要盡可能量化各項要素,
依特定樣板自動產生的遊戲內容是很有機會可以實現的。

Day 1 - 《地下城物語》─再滾燙的紅海都有屬於你的一條活路

講師分析所屬專案從開案、設計、到營運的策略
主要就是以遊戲機制為主,並盡量透過玩家意見回饋來改善內容。

另外,雖然有些細節要試了才知道,
但目標跟方向是需要先確定的,
且遊戲中內容都盡量不與此目標與方向牴觸。
因為遇到過不少反例,所以就特別心有戚戚焉 orz

(待續)







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中設定好動畫演出,
就可以讓角色產生攻擊判定了。





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






[首頁]這裡是歐美加的遊戲製作筆記儲藏室

如標題所述,此處用來放一些遊戲製作筆記,
讀書心得,或其他有的沒的。

總之就是想留下一點紀錄,一來可以看到自己走過的路,偶爾感嘆一下,
二來是看有沒有機會多跟相同興趣的人多交流。

以上,歡迎參觀指教 <(_ _)>