李慎亮 司占軍
摘要:為了解Unity與三維建模軟件的兼容問題,以及游戲的基本制作流程,以90坦克為原型,在3D Max中進(jìn)行了建模、UV分展。在PS 中進(jìn)行貼圖制作,在Gold Wave中進(jìn)行音樂切分制作;在Unity中綜合運(yùn)用各種資源,結(jié)合AI、剛體檢測等技術(shù)實現(xiàn)了碰撞檢測、鍵盤檢測、爆炸等效果,最終制作出了一款操作性好、畫面精良、具有一定趣味性的3維TPS游戲。
關(guān)鍵詞:TPS;Unity;三維游戲;坦克游戲
DOIDOI:10.11907/rjdk.151403
中圖分類號:TP319
文獻(xiàn)標(biāo)識碼:A 文章編號文章編號:16727800(2015)008015203
0 引言
計算機(jī)軟硬件技術(shù)的發(fā)展水平越來越高,畫面簡單、立體感差的二維平面游戲正在淡出人們的視野。立體感強(qiáng)、操作性好、畫面精美的三維游戲越來越受到玩家和游戲廠商的喜愛。虛擬現(xiàn)實、體感檢測等技術(shù)的發(fā)展更是為游戲產(chǎn)業(yè)的發(fā)展提供了良好的技術(shù)支持。
本文以三維坦克游戲的開發(fā)過程為例,介紹了Unity平臺與其它軟件之間的關(guān)聯(lián)以及注意事項。
1 游戲設(shè)計
為了讓游戲情節(jié)更好地展開,增加游戲的趣味性,本次實驗設(shè)計了山區(qū)狙擊戰(zhàn)、城鎮(zhèn)街道戰(zhàn)及工廠會戰(zhàn)3種游戲場景,游戲設(shè)計如圖1所示。
2 預(yù)期效果
(1)鍵盤監(jiān)聽。能夠監(jiān)聽鍵盤上的按鍵,根據(jù)玩家按下的不同按鍵作出相應(yīng)反應(yīng)。例如按下A、S、W、D鍵會讓坦克向左、右、前、后行駛。
(2)攝像頭跟隨。攝像機(jī)跟隨游戲中的角色移動。攝像機(jī)要有廣闊的視野,以便玩家能夠及時了解游戲的變化。
(3)坦克AI(人工智能)。標(biāo)識為敵人的坦克能夠在地圖范圍內(nèi)隨意走動,且能夠自主判斷在其范圍內(nèi)的其它坦克是否為敵人。
(4)爆炸效果。坦克的炮彈射出后擊中目標(biāo)產(chǎn)生爆炸效果,同時播放爆炸音效,模擬真實的爆炸情景。
(5)炮臺轉(zhuǎn)向。坦克靜止后,坦克炮臺隨著鼠標(biāo)的移動在一定角度范圍內(nèi)轉(zhuǎn)向。
圖1 游戲的基本元素與設(shè)計流程
3 實驗流程
3.1 模型創(chuàng)建與優(yōu)化
模型是游戲的基礎(chǔ),精致的三維模型能夠提高游戲的真實性。Unity平臺支持多個三維軟件創(chuàng)建的模型,本實驗選用上手相對較快的3D Max軟件,在3D Max中利用多邊形建模和Box模型拼接結(jié)合的方式對坦克建模。需要注意的是3D Max與Unity中單位之比為0.01:1,即在3D Max中的1cm就是Unity中的1m。為保證單位的統(tǒng)一,實驗中將3D Max的系統(tǒng)單位設(shè)置為cm。一般來說,游戲中模型的面數(shù)越多,游戲所消耗的資源就越多,游戲的流暢度就會降低。因此需要在3D Max中使用線的分隔、點的焊接等命令將模型的面設(shè)置成三邊面。
3.2 UV分展
如果說模型是三維游戲的骨架,那貼圖就是游戲的衣服。精美的貼圖使游戲畫面更加絢麗、真實。畫面的精美程度與游戲消耗的資源數(shù)是成正比的。因此,要減少游戲消耗的資源,不僅要減少游戲模型的畫面數(shù),還要利用高精度貼圖的方法來制作游戲。高精度貼圖的制作需要對高精度模型進(jìn)行UV分展、烘培,然后導(dǎo)出到PS中進(jìn)行貼圖繪制。精細(xì)的UV劃分能夠讓模型有著豐富的細(xì)節(jié)和變化,增加模型的真實感。在分展UV時,結(jié)合使用棋盤格材質(zhì)以及松弛等方法,對UV進(jìn)行分展、整合,最后渲染出UV模板,如圖2所示。
圖2 模型UV的分展、整合
將繪制完畢的貼圖重新導(dǎo)入到3D Max中,并對創(chuàng)建完畢的低精度模型進(jìn)行貼圖。此時低精度模型與高精度模型的比例應(yīng)為1:1。
3.3 模型導(dǎo)出導(dǎo)入
實驗中直接導(dǎo)出fbx格式模型。在導(dǎo)出之前需要將每塊模型的坐標(biāo)歸零。在3D Max中利用坐標(biāo)調(diào)整工具調(diào)整坐標(biāo)的方向及位置并保存。導(dǎo)出模型時,選擇導(dǎo)出為fbx格式,并勾選嵌入媒體選項。
導(dǎo)出的模型直接拖入Unity中的資源面板就可以實現(xiàn)資源的導(dǎo)入,而且模型的貼圖等數(shù)據(jù)也會一并導(dǎo)入到Unity中(Untiy的面板命令也可導(dǎo)入資源)。
3.4 地形與環(huán)境制作
選擇菜單 terrain→create terrain,在工作區(qū)域中出現(xiàn)一個地形圖(長方形),調(diào)整地形大小。選擇菜單terrain→flatten heightmap,設(shè)置地形高度[1]。
Unity自帶的地形編輯器具有上凸、下凹等命令,利用這些命令可以模擬出山川、丘陵、小島等環(huán)境。
Unity中有兩種添加花草樹木的方法,一種是利用預(yù)制物體,將樹木挨個向場景中添加;另一種是利用地形編輯菜單欄中的筆刷工具向場景中添加樹木。
添加預(yù)制物體需要將樹木變?yōu)轭A(yù)制物體,再拖拽到場景中進(jìn)行布置。預(yù)制物體是指Unity中為了更有效地使用資源,在Unity內(nèi)部創(chuàng)建的一個模板,該模板的所有副本都是它的一個實例。預(yù)制物體使用時需要將物體挨個拖入到場景中,對于場景較大的地方來說比較麻煩,而且不同的環(huán)境還要編寫不同的代碼來實現(xiàn)不同的效果,例如風(fēng)吹的效果。由于預(yù)制是真實的三維模型,因而真實性更高。預(yù)制物體比較適合場景中樹木的制作。
圖3 Untiy的地形編輯命令面板
圖4 游戲中的樹木
筆刷工具添加的花草樹木是利用二維貼圖來模擬現(xiàn)實三維效果,與使用預(yù)制制作的樹木相比更加適合大規(guī)模的樹木制作,例如森林、草地等。
石塊和房屋等資源需要在三維軟件中創(chuàng)建模型,貼圖制作后導(dǎo)入到Unity中使用,也可以去Unity Store中尋找需要的資源購買使用。
3.5 腳本編寫
Unity是一個面向?qū)ο蟮挠螒蛞?,腳本是三維游戲開發(fā)的重要組成部分,是游戲引擎與游戲素材資源之間的紐帶[2],游戲物體實現(xiàn)的各種效果都需要腳本來控制,例如坦克的移動:
function Update () {
if (Input.GetKey(KeyCode.Escape)){
move=false;
}
if (controlled&&move){
var x=Input.GetAxis("Horizontal")*Time.deltaTime*speed;
var z=Input.GetAxis("Vertical")*Time.deltaTime*speed;
transform.Translate(x,0,z);
if(Input.GetKey(KeyCode.A)){
transform.RotateAround(rotate_point.position,Vector3.up,-rotate_speed);
}
if(Input.GetKey(KeyCode.D)){
transform.RotateAround(rotate_point.position,Vector3.up,rotate_speed);
}
}
}
AI偽碼設(shè)計:①為坦克設(shè)置敵我標(biāo)識Flag;②定義最遠(yuǎn)攻擊距離D2,以及攻擊角度;③定義與其它剛體最小的接近距離D3;4④射射線實時檢測一定范圍內(nèi)的剛體;⑤能否攻擊敵人B;⑥If(剛體Flag==敵人){
計算距離D1
If (D1 攻擊 B=false 調(diào)用計時函數(shù); B=true; } } else { 計算距離D1 If(D1 調(diào)用轉(zhuǎn)向函數(shù) } } 爆炸效果 function OnCollisionStay(collision:Collision){ Instantiate(boomFire,this.transform.position,this.transform.rotation); gameObject.renderer.enabled=false; gameObject.collider.enabled=false; play=true; playmusic(); } 3.6 炮塔轉(zhuǎn)向 坦克建模時需要將坦克分為炮臺和身體兩個部分。因為炮臺前后左右的移動要受到身體的限制,但是旋轉(zhuǎn)只會受到鼠標(biāo)的影響,因此需要在Unity中將其設(shè)置為父子關(guān)系,并分別設(shè)置腳本,炮臺的腳本代碼如下: function update(){ if(tank_controll.move){ checkMouseMove(); if(FirePoint==null){ return; } if(Input.GetMouseButtonDown(0)){ if(CurrBullet>0){ var clone:Transform; clone = Instantiate(BULLET.FirePoint.transform.position, FirtePoint.transform.ratation); Var fwd:Vector3= transform.TransformDirection(Vector3.right); } } } } function checkMouseMove(){ if(Input.GetMouseButton(1)){ var h:: float=2*Input.GetAxis("Mouse X"); transform.Rotate(0,h0); } } 4 完善和測試發(fā)布 游戲制作完成后,為了檢查游戲是否完整,能否達(dá)到預(yù)期效果,需要對其進(jìn)行調(diào)試和運(yùn)行[3]。進(jìn)入游戲后,首先測試游戲的基本操作,以及炮彈的發(fā)射、爆炸等功能,還要測試AI系統(tǒng)是否正常。 經(jīng)過測試,游戲基本達(dá)到預(yù)期效果,各界面切換流暢,運(yùn)行正常。 5 結(jié)語 使用3D Max軟件建模,結(jié)合使用圖像處理、聲音處理等軟件以及游戲引擎Unity,為該款游戲的實現(xiàn)搭建基本環(huán)境。通過模型創(chuàng)建、貼圖制作、場景創(chuàng)建、規(guī)則制定并結(jié)合鼠標(biāo)鍵盤檢測、爆炸效果、碰撞檢測等技術(shù),制作了一款TPS游戲,經(jīng)測試,運(yùn)行效果良好。不足的是游戲的趣味性、可操作性較差,交互設(shè)計也較少,仍需作進(jìn)一步的改進(jìn)。 參考文獻(xiàn): [1] 王亞萍. 淺析Unity 3D 創(chuàng)建環(huán)境地形[J] .計算機(jī)光盤軟件與應(yīng)用,2012 ,19(2):175178. [2] 伍傳敏,張帥,邱錦明.基于 Unity3D 的 FPS 游戲設(shè)計與開發(fā)伍[J]. 三明學(xué)院學(xué)報, 2012,29(2):3540. [3] 董健. 一款基于Unity3D的移動平臺游戲的設(shè)計[J]. 軟件工程師,2014,17(12):3435. (責(zé)任編輯:杜能鋼)