星期二, 8月 27, 2013

星期四, 8月 08, 2013

從無到有 3D MMO 要做多少事

基本上會找一個現有 3D Engine 會比重新刻好,除非你是大師級的,因為要花的時間真的不少。

3D Game Engine要有些什麼 功能?

3d Max的plugin 轉換 Engine裡面所使用的 model檔
場景編輯器
遊戲事件編輯器
Cute scene 編輯器
UI 編輯器
動態編輯器
觀看物件的 Object View。
如果有網路就要 寫網路的部份
檔案Patch 機制 壓縮方法... 等 。
大概需要的框架就是這些,還不包括企劃需要的文件系統。

其實可以參考 OGRE http://www.ogre3d.org/


其實很多人不瞭解這東西到底做了什麼事,這邊來整理一下好了。
乾脆就把他分開變成 遊戲引擎 和 3D影擎。

3D的部份就管電腦圖學的部份 ,3D物件的演算使用、3D 物件Animation、Shader、地型、場景、燈光、影子、卡通效果...。
遊戲引擎就是 遊戲規則的編寫,遊戲內和3D物件互動的整合。
一款很完整的引擎,基本上會產出不少工具,使用不少技術,加上AI,這大概就是3D遊戲引擎。

比如說我要開始製做一款3D遊戲,一開始從建立3D model開始,從3D Max匯出物件檔就是工了。好的引擎會把建立物件的 Input output 最佳化,加上一些資訊,所以一開始會有3D Max的export。

把Model Load進Game後 你會需要 控制Model的資訊,所以要先製作些資料,比如說物件的大小、物件特效大小、物件特效顯示位置、物件可變換Avatar功能,走路的動作,受傷的動作,這時候第二個工具就會出現了,可能會叫做生物編輯器之類的。讓你可以編輯各種屬性和外觀。

有了生物但沒有場景,所以要有個場景編輯器,雖然可以用Max直接做整個場景出來,但如果要做出更多細部物件的控制,就要有個可以像拼拼圖一樣的編輯器,讓你能做出場景,加入場景的Model。

接下來你要能在地圖上編輯相關遊戲規則,所以又出現了一個新的工具。

然後有個正流行的cut scene 功能,可以製作遊戲內額外的表演。

以上為基本款。

接下來就要看需求方向加上更多東西。


3d 選取物件

通常都會是長這樣
Point3        Origin;  點選投射點
Point3        Dir;  點選向量
MousePos                                 滑鼠座標
GetCamera()->WindowPointToRay( MousePos.x, MousePos.y, Origin, Dir );

去換到 投攝的點 和向量之後在拿去和物件 算碰撞,有碰到的物件就可以選取


在利用  BoundObject去check

當然還可以拿到目前的距離

攝影機範圍
class Frustum
 {
   float m_fLeft;
    float m_fRight;
    float m_fTop;
    float m_fBottom;
    float m_fNear;
    float m_fFar;
    bool  m_bOrtho;
};

記憶一下

除了本來工作上的東西 ,還有些啥技術有瞭解到?

先是  Data-Driven 還有 Event-Driven  ,我書讀的少,真的看完了有這些Model的東西後,才瞭解啥是啥?

拿走路來講講,Event-Driven 的方事是當你有走動時的操作時才將Event 丟到你控制移動的功能,比如說你在畫面上 有一個點在(0,0),你點下座標(100,100)時,他接收到Event之後開始走過去;Data-Driven則是,你去控制你的點的座標,讓他到達(100,100),所以走路應該是兩個系統整合起來,而達到自動行走。

有些FPS的Game ,在移動時就是用Data-Driven,client端會一直向Server去詢求更改位置的固定 protocol之後,Server確認ok後回傳給Client新座標,Clien收到procotol 改變移動需要的動作,並設定新座標。所以如果client送protocol的速度很快Server又沒去擋掉不合理的部份,別人看起來就會像飛一樣。

我知道的MMO RPG,這邊就是Event-Driven,當你在畫面上點選了座標給Server,client自動的移動過去,這時候client固定會和server在ckeck position,確定可行走後繼續移動,到達目的地之後就不會再送資料給server。並不完全精準,有可能發生client 先到Server還沒通知別的client。

兩個系統有各自需求的部份,用太多Data-Driven對Server來說是負擔,用Event-Driven,誤差就必需去算回來。

認真來講 Timer也是一種Data-Drivern,而Mouse Click則是Event-Driven。