Silverlight.XNA(C#)跨平臺3D遊戲研發手記:(十一)3D SLG(策略戰棋遊戲)設計案例

某天,當你一不小心發現已經夠隨心所欲的駕馭3D攝像機之時,任何類型的3D遊戲都將成爲囊中玩物,過往如煙。

回憶逝去的童年讓我極度惦記的SLG策略戰棋遊戲,或許對於大多數玩家來說,它費時費力不被討好;然而深邃的內涵和無限可能的戰略戰術始終佔據着我內心很大一片天地。於是,在本系列前5節2D SLG知識原理的基礎上,萌發了移植一款基於平面的3D SLG Demo計劃。

首先,什麼是基於平面的3D SLG遊戲?大夥不妨先看看以下幾款該類型經典遊戲鉅作截圖 - 《英雄無敵6》、《文明5》和《三國志11》:


無論地形單元格爲四邊形或六邊形,其整體地貌都不存在高低起伏(No HeightMap);用遊戲開發者的話說便是:三維空間中,一條軸用做旋轉,另外兩條軸形成類似2D中的Canvs平面承載對象。這樣的設計更像是一盤3D化棋局,地形好比棋盤盤面,角色仿若棋子,附帶一個環繞棋盤的360°軌道攝像機,無論視野還是戰術方略都能得到淋漓盡致的體現。

當然,除此之外,層次感更分明,基於HeightMap地形的立面3D SLG遊戲亦備受日系遊戲青睞,不乏大作,比如《火焰紋章 曉之女神》、《皇家騎士團:命運之輪》和《三國志戰記2》等,該類型遊戲通常需要輔以更加複雜而強大的地形編輯器,這些內容並不屬於本節範疇,後續章節中若有時間再做補充:


OK,做足了SLG遊戲設計方面的知識準備,接下來我們要做的頭等大事便是打開第4節的源碼,神馬差集運算、四叉樹算法、蜂窩拓撲算法、A*算法等等統統一併拿來,將其中的Point改成Vector3(即原先的Point(X,Y)更換成Vector3(X,0,Y)),嘿嘿,原來編碼也是可以這麼浮雲的。舉個例吧,其中的DirectionScan方法在移植前後的對比:


2D遊戲中所有我們看得到的圖形都是通過Image圖片的形式予以呈現,而到了3D遊戲中,這條路已經行不通了。比如我們要繪製3D四邊形或3D蜂窩狀地形單元格,此時就得自己編寫基於三角面合成的3D面控件:

Shape3D

Rect3D

Hex3D

其中四邊形只需2個三角形即可,而六邊形則需由6個三角形組合而成。

接下來再賦予這些單元格以紋理,配上之前移植過來的所有算法,很酷的3D地形即刻呈現在我們面前(額外提醒一下,在Draw時必須設置紋理的BlendState爲Alpha 混合(basicEffect.GraphicsDevice.BlendState =BlendState.AlphaBlend;),否則這些紋理的透明部分將會被可惡的黑色所覆蓋):


如此漂亮的地磚Tile,也得有能夠與之相匹配的3D場景纔算協調。話說3D場景與2D場景真是截然不同,3D場景大多基於模型,比如剛從網上下載的一個宮殿場景,還附贈了一個天空盒呢(順帶鄙視下該天空盒,即非半球又非四方,嗯,很有偷懶嫌疑):


將整個模型從3DMAX中導出成.X或.FBX文件後,我們便可在遊戲中直接載入,很酷吧,天圓地方,魔獸出沒皇宮中:


慢着,你剛纔說啥來着?魔獸?

拜託呀,大哥。對埃及神話中那個狗頭人身的死神不清楚就算了,如今,《魔獸世界》中如此偉大的「阿努比薩斯」活生生的矗立在你面前,汝等依舊能保持如此之淡定,小弟不勝佩服。

其實,此次Demo製作也印證了一個事實:《魔獸世界》中的模型大多還是以中低品質模型爲主,奇蹟的誕生並非與模型複雜度成正比。而目前市面上絕大多數的XNA骨骼動畫模型素材管道最多僅支持72塊骨骼解析,若想展示次世代模型還得找到更加強悍的素材管道才行(或者哪位大神幫忙寫個?哈哈):


至此,3D SLG遊戲場景全部佈置完畢,接下來是操作部分。

2D遊戲基於Canvas平面畫布,鼠標點擊的地方可謂所見即所得; 3D遊戲則大爲不同,無論它的顯示載體是PC的顯示屏還是Windows Phone的觸摸屏,基於二維平面的點擊/觸碰操作要完成三維空間的精確拾取,彷彿是件不可能的事。

然而前人的智慧告訴我們,一條射線便可輕鬆搞定這一切,這就是傳說中的
「3D射線拾取法」:


通過屏幕點擊位置垂直於屏幕3D空間向內發射射線,利用射線的穿透效果拾取一切3D對象。

其實射線拾取法也可以通俗的理解爲碰撞檢測,用開發者的話說便是Ray是否與模型的BoundingBox、BoundingSphere、BoundingFrustum或某個Plane等對象存在交點:


在3D世界裏,通常爲了高性能檢測模型之間的碰撞,會用到Box(立方體)、Sphere(球體)或者Frustum(錐體)包裹住模型,包裹物之間的交錯關係即視爲模型之間的碰撞關係。其實很多2D遊戲也效仿了類似的做法來處理各類碰撞檢測。

非常幸運的是,Engine Nine除了爲我們提供強大的骨骼動畫解析外,還拓展了Model裏的Intersects方法,用於檢測基於模型BoundingSphere的Pick操作,精確度還蠻高的,再配合上一些相關算法,最終便完成了3D SLG遊戲中的角色模型拾取和單元格命中操作:

命中角色和拾取單元格處理

角色移動處理是3D SLG遊戲製作的最後環節。設計方面通常有兩種方案:第一種是由起點向終點沿尋路路徑移動,這種基於A*算法的移動在我之前的教程都講爛掉了不再贅述;而另外的則是像《英雄無敵3》那樣直接做由起點向終點的直線移動(題外話,製作完Demo後才發現,基於六方格的地形真不適合沿路徑移動,非常彆扭)。後者實現方法也很簡單,按照第七節開頭所述原理,分割出X和Z分向量速度即可:

角色兩種移動模式算法

嘿嘿,收工。

啥?

人太少不給力?

那麼我們刷300個《魔獸世界》裏的小怪出來開心開心吧,順便也檢測下本節的各種3D算法是否正確:


本節Demo源碼下載地址:(WP)SLXnaGame3

在線演示地址:Cangod.com

手記小結:《魔獸世界》運行於Windows Phone 和 Silverlight之上,想想都讓人口水直流;因爲我們對遊戲的執着與狂熱,使得這個夢想變得不再遙不可及。 3D遊戲開發今非昔比,日新月異的技術進步讓它變得並非難如煉獄;長期的2D遊戲積累和虔誠的設計感悟,從2D向3D轉型一日千里。磨練過的勇士將創新出更多屬於中國自己的遊戲奇蹟,你手中的鍵盤鼠標便是最鋒利的戰具!

Silverlight三國類萬人國戰頁遊 - 《戰龍在野》封測全面開啓,誠邀大家參與體驗~

參考推薦NowpaperWilliams關於Windows Phone的遊戲開發博客。