Fiber based job system

Preface

工作上使用unity開發遊戲時,在效能有瓶頸的區塊時常會使用到Job System來提升效能,
去年因為興趣使然稍微研究了Job System的底層實作,在公司內部報告使用過,
藉著最近有點時間將這些資訊整理起來發成部落格文章。

寫完之後回頭來看,必須先提醒一下,這篇會使用到相當多作業系統的背景知識,
建議讀者需要先具備作業系統的基礎再做閱讀。

UniTask:利用async/await優雅的撰寫callback

Preface

前些日子因為一點小意外,需要在一兩天時間從零開始弄一個web service上雲,因為部分邏輯已經先用C#寫好了,平常也天天在用C#,沒想太多就用上了 ASP.NET core,沒想到意外的很香。

除了.NET Core很香之外,這兩天的時間寫了寫MVC的Web service,意外地發現和寫遊戲前端截然不同的寫法,在寫web service的時候,C#的async功能可以說是用個不停。

從以前就久聞UniRx差分出來的UniTask的大名,卻遲遲沒有機會與他相見,想說趁這個機會來碰一碰吧,碰巧,最近下班玩的一個插件,剛好使用Coroutine作為接口,趁這個機會,來試試UniTask可以怎麼讓程式撰寫變得有所不同。

Game Physics - Constraint

首頁用圖

Preface

先前2月參加了Unity應用領域舉辦的CJ貓大大的講座,

非常感謝CJ大大的分享跟連大辛苦尋找場地,

想說也將自己吸收學習到的內容整理成文章,與各位的開發者大大們一起參考學習。

文章的內容是參考CJ大大的專案內容與Box2D作者ErinCatto大大的GDC演講所整理,
這兩份資料都在文章最下方的reference中

UniAvatar - 簡易Unity對話系統 (操作篇)

Demo畫面鎮樓
Result

簡介

UniAvatar是一個使用Unity製作的簡易對話系統,與文字冒險遊戲的範例。

專案所撰寫的程式碼均開放原始碼,且遵守MIT Lincense,但專案中的ADV實作部分有參考使用其他專案,使用時請參考各自的開放協議。

感謝ArmeCyan提供立繪與UI的支援,如果喜歡他的畫風請去粉專支持。

Repository連結:https://github.com/Harrison-Dev/UniAvatar

範例連結: 點我

如果有任何希望追加的功能,歡迎在repo中發issue或是PR協助專案變得更完整!

2D Collision Study

Circle / Rectangle Collision

Circle Collision

Circle collision is much easier, only need to determine distance between centers > sum of radius.

circle

Introduction to Game Rotation

You can also see this article in my medium post.

Title

我在接觸3D遊戲引擎時,一開始對旋轉這件事感到很困擾,

在Unity的編輯器中,旋轉的表現形式看起來像三個顏色的球狀旋轉。在Transform裡面又是有著3個數字的向量形式,到了程式碼裡面,又變成Quaternion這種資料形式,讓人一時之間很難搞懂。
這篇文章會記錄一些我對於旋轉的表示方法、各種表示方法的優缺點的理解,以及使用上的一些轉換方式。最後再用一個範例,在Unity中藉由滑鼠拖拉旋轉攝影機來表示如何用程式簡單控制旋轉。

關於C#記憶體管理那些事。

You can also see my post in Bahamut.

使用Unity製作遊戲也好一陣子,

途中踩過不少坑都是對於Unity預設值與C#程式語言的設計上的不熟悉,

關於Unity預設值的部分,達哥在今年的TGDF上的簡報讓我獲益良多,大家都該去看看。

這次想探討的是關於C#程式語言的設計方面,

特別是相對於C/C++這些低階語言來說,C#/Java的記憶體分配像是一個巨大的黑盒子,

運作起來還蠻順利的,但是時不時就會像樂高一樣踩到腳(而且很痛),

這篇就來記錄一下自己學到的東西,順便討論裝箱(Boxing)跟C#的記憶體運作吧!

Object pooling - 基本物件池與應用

You can also see my post in Bahamut.

什麼是Object pooling

在我們製作一些遊戲的時候,常常需要使用到一些重複且相同的物件,

如果我們照著一般物件產生以及消除的方法:Instantiate 以及 Destroy,

會使許多GameObject(object)用完慘遭系統GC,如果像是子彈或者音樂遊戲的object被大量GC,

很可能造成遊戲卡頓,對於音樂遊戲或者是捲軸射擊遊戲都是相當致命的傷害,

為了避免這種問題,我們使用Object pool來儲存可以使用的object們,來免於上述的問題。

那麼Object pool該如何在C#中實作呢?