遊戲開發日誌 #01


很久沒有更新,有很多主題都有頭沒尾的,非常對不起。
現在這個新的主題可能都會這樣,所以。。。。。請不要過份期待下一篇。

如有追蹤本人的社交帳戶,應該知道本人正在製作自己的遊戲;由於找不到可以一起走下去的伙伴,所以決定自己一個人做所有東西。幸運的是,大部份的知識和經驗都有,也有好的導師、師姊幫手解決問題,一切都非常順利。

終於。。。最底層的東西都移植了,並改良和除錯大致上完成了!這個月之前,都在 3D 中苦戰,現在則在系統上打拼。

○下面是未細緻修正的 3D Model

在自己的測試中,已有多幾個動作,還會眨眼,未來可能會分享影片。
這次的遊戲,由於不是動作遊戲,節奏比較慢,所以會花更多時間在人物細節上,現在的頭髮衣飾全會動是最底要求,希望自學一年不到的自己有能力可以做得更好。

寫了 VB 十幾年,太多毛病,現寫了 C# 九個月,還有太多東西不知道,真的很多謝很多師兄師姊的幫忙才學到不少事情。C# 的特性和架構實在太好了,真的越來越愛 C# 了。

雖然在各個 manager 、 managerloader 以及 datamanager 之間的架構有點頭大,但以遊戲的設計由零做出來的話還比較輕鬆;不過在 localization 上,以及 datamanager 中的 data 作更改的處理就頭痛了一個星期了。。。

○ 先分享之前的 Propotype:


Localization 是從這個 prototype 中移植過來。之前的 localization 做法 (下面會說),是在學 C# 中途完成的,所以很多 C# 的特性和功能都沒有使用,不理想加上太浪費資源,例如在各個 object 上都有 localization text,當更改語言時這些 text 的更新方法,由於之前還不知道有 Dictionary,所以叫帶有 text 的 object 去檢查語言是否有更改,很笨,現在都是 object 生成時自己登記到 localization 的 dictionary,讓 localization 更改語言時主動去通知各個 text 去 renew。

這個月也忙於測試遊戲的耗電狀況來作出不同的優化方案,也改善了角色和相機活動的流暢度,花了一個星期的測試,四處尋找資料,以及很多人的指教後,除了 3D 模型的優化外,還設定了顯示的配置,以保持遊玩品質和節省電力的兩個重點。

而今天這一刻,終於把移植過來的東西都修正,之前沒有接觸到的自訂 class 和 Dictionary 也全套用了,就是不太愛 List,雖然 Dictionary + List 使用會很方便,其實 List 的本質也是 array,為實現 add 和 delete 使用多一倍的資源,也令 loop 效能沒有 array 快;Array class 用 Array.Find 來工作非常有效率,而且設定比較簡單,使用廣泛而彈性 (下面會說明)。


這次的 Localization 做法,其他和之前的 prototype 差不多。

○ 之前的做法:
  1. Editor 讀 Excel file
  2. 把 Data 轉成 Text File 收到 Resources
  3. Run Time 時 Awake 讀 text file,轉到多個 2d array
  4. 使用 for loop 以 id 取得設定語言的文字
  5. 載著 Text 的 GameObject 自行檢查語言有否改變,以更新 Text.text


○ 現在的做法:
  1. Editor 讀 Excel file
  2. 把 Data 記到多個自訂的 class,再一次過儲存成 Binary File 放在 StreamingAssets
  3. Run Time 時 Data Manager Awake 讀取 Binary File 並更新 自訂的 class
  4. 使用 Array.Find 來回傳所雖要的內容
  5. 載著 Text 的 GameObject 在 awake 時把自己的更新 Text.text 登記在 Localization.cs  中的 Dictionary,在更改語言時,Localization 會執行 Dictionary 中所有的更新 Text.text

現在看之前的做法,真的太傻了。。。


○ 使用 Excel File 的原因:
  • 可以把所有文本都存放在一個檔案中,除了方便修改之外,當需要找外援來做翻譯的話,一個檔案就可以了。這也是本人不使用 Fungus 的主要原因。
  • 不用把原文檔放到 Assets 內,只要把資料預先轉到 Binary File 就可以,甚至使用 Obfuscator 再加密,以防被反編譯或修改。
  • 直接在 Editor 的 Menu 或 inspector 中加一個 button 就可以隨時更新 binary file。
  • 只要 excel 中資料的格式不變,就不用再編程,資料轉換最可靠。
  • 轉換的相關 script,可以用 #if UNITY_EDITOR 和 #endif 來包起來,這樣就不會 build 出來。
  • Excel 隨了記錄文字外,也可以記錄數值等資料,只要 Data Analysis 功力足夠,可以有很多應用。 在上面 youtube 的 prototype 中,有個任務測試,其實是把資料在 Excel 輸入就可以,包括文字、問答選項、任務計分等等,都是在 Excel 輸入好,在 Unity 中用 Script 去 analyse 再決定做什麼。
  • 不同語言,代表需要不同的 font 和 font size,也可以直接輸入在 excel 中。上面的 prototype 的四種語言都使用了不同的 font size,不是用 script 記錄,而是 excel,當然用 script 做這個也很方便。

○ 本人最愛 Custom Class 的原因,例如:
  • DataSystem[] dataSystem 記錄了所有系統相關的多語言文字
  • 希望取得 dataSystem 中 ID 10001 的 日本語 文字
  • DataSystem ds = Array.Find(dataSystem, d => d.id == 10001);
  • string text = ds.text.jp;
  • 在對著一堆 code 時,看到 text.jp 就知這是什麼了,text.en 就是英文了。
  • dataSystem 中,其實還有一個 class LocalizedText,兩個 class 分別是:
  • public class DataSystem {
          public int textID;
          public LocalizedText text;
      }
       
  • public class LocalizedText {
        public string en;
        public string jp;
        public string cht;
        public string chs;
    }
  • 就只是這樣,不論在對話、任務、道具、角色資料等也可以使用 LocalizedText 來記錄多個語言的文字,新增語言時也不用逐一修改,只要改一個 class 和幾個對應的 scripts 就可以。

今次就說到這裡,現在這些系統最重要的部份已經 debug 完成,所以接下來就是介面了,這幾天一直在設計一些介面的樣式和操作方式,暫時都不會公開,看看可時再分享一下開發的過程吧。

留言

此網誌的熱門文章

[教學]一起來開發遊戲吧 - Unity C# 基礎

QUMARION

[教學]一起來開發遊戲吧(二) - Character Controller, Pool System