這兩年接觸了一些比較成熟的商業引擎, 慢慢得思想有所轉變
以前總以為, 哪個引擎代碼寫得好看就牛, 太偏激了
很多商業引擎的代碼那叫一個亂~
後來覺得引擎工具很重要, 沒有經過成功項目的引擎不是好引擎
現在呢? 當然工具還是很重要, 但另一個很重要的因素是: 製作效率
能不能快速開發, 能不能快速搭建原型, 快速推出, 靈活定製才是一個引擎最有競爭力的地方
這扯得有點虛了, 來點實際的
在學習並抄襲夠了各種技術細節後, 開始從另一個角度看待一下引擎開發
之前有說過, 引擎可以看作是一個資源管理員, 它的作用是對資源的建立, 編輯, 整合
那這三個大的方面可以從微觀的角度看: 那就是它們都是一些基本元素的組合
拿一個模型來說, 可以拆成網格, 材質, 動畫等, 網格可以拆成拓撲, 頂點, 頂點可以拆成位置, 法線, 紋理座標等, 位置可以拆成float
那麼從上層到底層, 其實就像原子構成分子, 分子再構成各種物質......
轉成引擎術語, 其實就是基礎資料型別 (Elementary Data Type)構成屬性, 屬性構成組件, 組件組成實體, 實體組成情境, 再加上各種行為與事件, 成為一個遊戲
這裡面有三個關鍵的技術點, 那就是反射, 序列化, 組件模式
這三個技術點成就一個成熟引擎所具備的特徵: 資源驅動
反射與序列化方面, C++天生不足, 很多引擎裡壓根沒有系統地去考慮這個
在做功能開發時, 常常會發愁資料怎麼儲存, 怎麼編輯
其實很簡單, 做了序列化, 所有資源的格式可以進行統一, 不用為模型寫一種模式, 地圖寫一種格式, 邏輯表格寫一種格式了
你需要的只是一個Load和和一個Save而已
而序列化也是依賴反射的, 通過遍曆屬性去序列化, 就可以擺脫煩人的save/load/version編碼了
然後是編輯
編輯是強烈依賴反射的, 做好反射機制, 你的編輯器就成功了80%
不管是情境編輯, 還是材質編輯, 甚至於行為, AI, 邏輯, 其實都可以看成屬性編輯
在反射機制的基礎上, 做一個PropertyEditor, 那你的編輯器就基本完成了
你再也不用開發一個功能就到面板上加一個控制項, 改一下儲存/載入的版本號碼了
到這, 引擎已經有一個很好的底層了, 再就是考慮怎麼靈活地去進行遊戲開發
組件模式就是為了資源驅動, 一個實體需要什麼功能就加一個什麼模組
模組的屬性通過PropertyEditor去編輯
對於行為, 可以使用指令碼去實現相應的組件
從這個角度來著, 指令碼也就成了一種可以複用的組件資源
那麼下一步就是弄個強大的指令碼系統, 來配合反射/序列化/組件模式進行開發
好比UE的UnrealScript, Unity3D的UnityScript(Mono), 都是這種結構
對於組件模式, 一個不可缺少的東西就是Prefab, 或者叫Template
因為你所建立的實體都是各種組件的集合, 每次都去一個個的組裝起來很麻煩
所以需要一個模板, 這個模板可以是一個物體, 也可以是多個
這些模板才是傳統引擎中的resource的概念, 由它們去執行個體化出各種實體單位
好了, 有了這些東西後, 剩下的就是美術做內容, 程式寫指令碼, 策劃調數值了