梁成
(西華大學(xué)計(jì)算機(jī)與軟件工程學(xué)院,成都 610039)
基于Unity3D在基本游戲框架下客戶(hù)端研究與實(shí)現(xiàn)
梁成
(西華大學(xué)計(jì)算機(jī)與軟件工程學(xué)院,成都610039)
隨著信息技術(shù)的不斷發(fā)展,人們對(duì)于娛樂(lè)項(xiàng)目的要求越來(lái)越挑剔。在計(jì)算機(jī)硬件技術(shù)快速發(fā)展下,游戲作為一種新興娛樂(lè)行業(yè),正經(jīng)歷著蓬勃發(fā)展,在良好的人機(jī)交互下給玩家?guī)?lái)的越來(lái)越愉悅的體驗(yàn)。同時(shí)游戲也在商業(yè),教育等領(lǐng)域日益影響著人們的社會(huì)生活。圖1所示數(shù)據(jù)為網(wǎng)易游戲數(shù)據(jù)控對(duì)近年來(lái)游戲在商業(yè)上的表現(xiàn)進(jìn)行的統(tǒng)計(jì)。
圖1 中國(guó)大陸游戲市場(chǎng)總量和增長(zhǎng)率
從大多數(shù)游戲研發(fā)來(lái)看,大體上要經(jīng)歷以下三個(gè)階段,其階段如圖2所示。
在游戲策劃階段,擁有新穎的游戲想法決定是否在市場(chǎng)可以占有一席之地。
在游戲制作階段,良好的人機(jī)交互和有趣的玩法是增加玩家數(shù)的法寶。
最后一個(gè)階段是投放市場(chǎng),宣傳是關(guān)鍵。
圖2 一款游戲經(jīng)歷的過(guò)程
目前,國(guó)內(nèi)外針對(duì)Unity3D引擎在游戲開(kāi)發(fā)中的技術(shù)進(jìn)行不同程度的研究,2012年王樹(shù)斌[1]簡(jiǎn)單介紹了Unity開(kāi)發(fā)游戲流程和技術(shù),2014年張敏[2]通過(guò)Unity實(shí)現(xiàn)了一個(gè)保齡球游戲,并沒(méi)有對(duì)腳本進(jìn)行有效的組織和管理。本文主要探討的是游戲制作階段,通過(guò)學(xué)習(xí)Unity游戲引擎的基礎(chǔ)上,在基本游戲框架模型和腳本通用管理方式下,實(shí)現(xiàn)了一個(gè)游戲客戶(hù)端。
Unity是由Unity Technologies開(kāi)發(fā)的一個(gè)讓玩家輕松創(chuàng)建諸如三維視頻游戲、建筑可視化、實(shí)時(shí)三維動(dòng)畫(huà)等類(lèi)型互動(dòng)內(nèi)容的多平臺(tái)的綜合型游戲開(kāi)發(fā)工具,是一個(gè)全面整合的專(zhuān)業(yè)游戲引擎。圖3所示為Unity3D平臺(tái)的界面。
圖3 Unity3D平臺(tái)界面
Unity3D一款跨多平臺(tái)的游戲引擎,目前最新版本的Unity已經(jīng)支持包括Android、iOS、Samsung TV等在內(nèi)的14個(gè)平臺(tái)。除了多平臺(tái)以及簡(jiǎn)潔便用的界面特性之外,Unity3D還自帶了豐富的資源,如CharacterController、地形系統(tǒng)、屬性查看器、材質(zhì)編輯器、天空盒,以及常用的腳本等。而在素材方面,Unity3D還內(nèi)置了一個(gè)Asset Store,在這里面可以找到需要的一些模型、紋理圖等。正是由于其這些強(qiáng)大的功能,國(guó)內(nèi)排名前20的游戲公司都把Unity作為他們的游戲開(kāi)發(fā)引擎[3]。圖4所示為Unity3D所支持的平臺(tái)。
圖4 Unity3D支持平臺(tái)
基本游戲框架類(lèi)似于一種簡(jiǎn)單MVC(Model View Controller,模型-視圖-控制器)。按照MVC業(yè)務(wù)劃分:Model(模型)在應(yīng)用程序中主要用于處理數(shù)據(jù)邏輯,通常情況下模型對(duì)象負(fù)責(zé)的任務(wù)就是在數(shù)據(jù)庫(kù)中進(jìn)行數(shù)據(jù)的存取。View(視圖)是應(yīng)用程序中處理數(shù)據(jù)的顯示。Controller(控制器)主要用于處理用戶(hù)交互的部分?;居螒蚩蚣芾^承了MVC中主要的分層,便于整個(gè)游戲的層次劃分,提高開(kāi)發(fā)效率,其框架如圖5所示。
圖5 基本游戲框架
服務(wù)器:主要用于用戶(hù)之間數(shù)據(jù)交互和用戶(hù)的數(shù)據(jù)存儲(chǔ)。編寫(xiě)服務(wù)器是一項(xiàng)很艱巨,很費(fèi)時(shí)的任務(wù),一般的大公司都建立自己的服務(wù)器。那對(duì)于我們這些獨(dú)立開(kāi)發(fā)者來(lái)說(shuō),BaaS(Backend as a Service)便是不錯(cuò)的選擇,其專(zhuān)為移動(dòng)應(yīng)用開(kāi)發(fā)者提供整合云后端的服務(wù)。目前市場(chǎng)較為流行的BaaS有LeanCloud、Bmob、Amazon EC2等,這些云端服務(wù)器一般都提供了限免費(fèi)訪(fǎng)問(wèn)量以及便捷易懂的API。移動(dòng)應(yīng)用后端云服務(wù)的好處是幫助開(kāi)發(fā)者簡(jiǎn)化工作,程序員們只需一心一意做產(chǎn)品,而不需要過(guò)多考慮后端的服務(wù)器程序。做移動(dòng)開(kāi)發(fā)將會(huì)變得更輕松、更容易。
Network層:主要用于客戶(hù)端與服務(wù)器的數(shù)據(jù)交換,把用于的請(qǐng)求提交給服務(wù)器,再把服務(wù)器還回來(lái)的數(shù)據(jù)提交客戶(hù)端。最新版本Unity3D自帶的Network組件以及Asset Store里面的TNet組件均可以勝任。
Server層:主要用于存儲(chǔ)整個(gè)游戲的數(shù)據(jù),負(fù)責(zé)與服務(wù)器交換數(shù)據(jù)。
Game層:主要為UI層提供需要的數(shù)據(jù)。
UI層:主要功能是直接對(duì)用戶(hù)展示,這個(gè)層就是我們用戶(hù)能看到的一些數(shù)據(jù)及界面。
GameThread:主要職責(zé)是用于修改及操作Game層和Server層的數(shù)據(jù)。
在Unity中,大多數(shù)動(dòng)作都是可以通過(guò)添加Unity自身攜帶的組件來(lái)完成的,例如碰撞檢測(cè)、天空盒、粒子特效等。但是對(duì)于組件之間的關(guān)聯(lián)、通信,以及帶有極強(qiáng)邏輯性的動(dòng)作,簡(jiǎn)單的添加組件是無(wú)法達(dá)到預(yù)期的目標(biāo)的。例如在游戲動(dòng)畫(huà)狀態(tài)的切換時(shí),可以通過(guò)設(shè)置其過(guò)渡參數(shù)來(lái)控制,從而控制玩家什么時(shí)候該跑,什么狀態(tài)下進(jìn)行走,但是這些控制條件也必須通過(guò)腳本來(lái)實(shí)現(xiàn)。Unity為解決這些問(wèn)題,讓開(kāi)發(fā)者集中在游戲邏輯上面,提供一套比較完整的腳本系統(tǒng)及相應(yīng)的API,通過(guò)這些API我們可以更好地去操作和組織我們的游戲邏輯。有了功能之后,需要考慮的是如何去高效、方便、易理解地去管理和組織我們的腳本。
“Manager of Manager”方式是指將同類(lèi)型的行為或者操作組織起來(lái)統(tǒng)一管理,其也符合Unity中層級(jí)思想和面向?qū)ο蟮木幊趟枷?。例如我們想管理整個(gè)游戲的音樂(lè)音效的時(shí)候,我們可以建立AudioManager腳本。通過(guò)AudioManager來(lái)管理場(chǎng)景內(nèi)的背景音樂(lè)管理器(BackgroundMusicManager)和背景音效管理器(BackgroundAudioEffectManager),然后我們?cè)谛枰シ乓魳?lè)音效的地方去調(diào)用這些腳本里面的方法即可,這樣管理更加有效,更加讓人理解。
為了更好說(shuō)明這兩種思想,我們實(shí)現(xiàn)一個(gè)類(lèi)似于跑酷游戲的客戶(hù)端,下面我們采用模塊化進(jìn)行說(shuō)明。在整個(gè)游戲里面,我們將其分成四個(gè)功能模塊,它們分別實(shí)現(xiàn)不同的功能,在大多數(shù)的游戲公司也是采用模塊化來(lái)分工完成的。其模塊如圖6所示。
圖6 模塊
我們都知道音樂(lè)會(huì)給人一種舒適感,引起人們的興趣。在游戲中背景音樂(lè)音效是必不可少的,一方面可以增加游戲可玩性,給用戶(hù)有種持續(xù)玩的興趣。另一方面增加游戲真實(shí)感,以達(dá)到玩家和游戲場(chǎng)景人物的融合。目前Unity支持許多格式的音樂(lè)音效,開(kāi)發(fā)者可以根據(jù)場(chǎng)景所需要的添加對(duì)應(yīng)的音樂(lè)音效[4]。在添加之前,我們需要添加兩個(gè)組件,一個(gè)類(lèi)似于人的耳朵——AudioListener,另外一個(gè)就是類(lèi)似于人的嘴巴——AudioSource,其中AudioSource用于添加音頻片段。這里我們?yōu)榱朔奖愎芾?,建立了一個(gè)AudioManager,用于管理整個(gè)游戲中的音樂(lè)音效,只要在需要的地方進(jìn)行調(diào)用相應(yīng)的函數(shù)即可。最新版的Unity改善之前音頻系統(tǒng),新增加了AudioMixer(音頻混合器),其整合所有的音頻片段,讓玩家聽(tīng)到AudioMixer整合出來(lái)的音頻片段。
可以想象在游戲中如果缺少動(dòng)畫(huà),我們玩家扮演的角色將處于靜止,周?chē)腁INPC也將處于靜止,這樣的情況對(duì)于FPS、RPG等游戲類(lèi)型是多么可怕的景象,所以說(shuō)動(dòng)畫(huà)系統(tǒng)是整個(gè)游戲的靈魂也不為過(guò)。在Unity中提供了一整套動(dòng)畫(huà)系統(tǒng),我們可以利用其進(jìn)行動(dòng)畫(huà)制作,也可以從外部軟件導(dǎo)入動(dòng)畫(huà),通過(guò)新版本的Unity中AnimatorController進(jìn)行動(dòng)畫(huà)狀態(tài)之間的控制。在大多數(shù)3D游戲角色都帶有若干種動(dòng)畫(huà)狀態(tài),例如本文設(shè)計(jì)的游戲中的角色,包含跳、左右轉(zhuǎn)、下蹲以及死亡在內(nèi)的五種動(dòng)畫(huà),這些動(dòng)畫(huà)狀態(tài)之間的切換是通過(guò)Unity動(dòng)畫(huà)系統(tǒng)中的狀態(tài)機(jī)進(jìn)行控制的,在操作的時(shí)候需要設(shè)置觸發(fā)參數(shù),Unity為我們提供了Float、Int、Bool以及Trigger四種參數(shù),利用這些參數(shù)我們可以輕松地去實(shí)現(xiàn)各個(gè)狀態(tài)的融合,使動(dòng)作看起來(lái)更加的逼真、協(xié)調(diào)[5-6]。
游戲雖然有屬于自己的獨(dú)特邏輯,但是這些邏輯也必須符合物理世界的規(guī)律。在游戲中不能出現(xiàn)角色穿墻而過(guò),踏地而落的情況,那碰撞檢測(cè)在游戲中起到關(guān)鍵性作用了。通過(guò)碰撞檢測(cè)可以使我們的游戲效果更加的逼真。Unity提供Rigidbody、CharacterControlloer、Collider以及Trigger在內(nèi)物理碰撞器和觸發(fā)器,其實(shí)質(zhì)就是一些包圍盒算法[7],這些都需要綁定到主角或者相應(yīng)的物體上,以便發(fā)生碰撞的時(shí)候檢測(cè)到。本文通過(guò)碰撞檢測(cè)來(lái)實(shí)現(xiàn)主角的物品拾取,判斷是否和周?chē)恼系K發(fā)生碰撞,然后決定其生死。
內(nèi)存管理是每個(gè)開(kāi)發(fā)者必須考慮的,內(nèi)存使用率過(guò)高導(dǎo)致游戲本身運(yùn)行變慢,出現(xiàn)卡頓現(xiàn)象,那帶來(lái)的后果就是給用戶(hù)體驗(yàn)差,導(dǎo)致游戲生命周期變短。Unity提供了很多內(nèi)存管理方式,以便對(duì)對(duì)象的動(dòng)態(tài)加載以及和動(dòng)態(tài)回收,方便有效地利用內(nèi)存。本文介紹兩種資源管理,AssetBuddle打包及對(duì)象池,本文使用后者。
AssetBuddle是專(zhuān)門(mén)為Unity Pro付費(fèi)提供的功能,它可以將游戲場(chǎng)景中的對(duì)象或者資源文件轉(zhuǎn)化為二進(jìn)制封裝在AssetBuddle中,以便動(dòng)態(tài)的加載。雖然這種辦法很強(qiáng)勁,但對(duì)于沒(méi)有個(gè)人預(yù)算的開(kāi)發(fā)者并不建議,原因是其會(huì)產(chǎn)生一定的成本。這里我們推薦一種比較好的內(nèi)存管理——對(duì)象池。圖7所示為對(duì)象池的結(jié)構(gòu)。
圖7 對(duì)象池
對(duì)象池指的是在激活對(duì)象時(shí),它從池中提取。在停用對(duì)象時(shí),它放回池中,等待下一個(gè)請(qǐng)求。在C#中建立對(duì)象池實(shí)質(zhì)就是集合的混用,集合可以用于動(dòng)態(tài)增加或者減少,這樣就方便對(duì)象池中的對(duì)象的獲取和放入。在Unity創(chuàng)建對(duì)象池腳本之后,需要實(shí)例化。實(shí)例化有很多種辦法,這里推薦兩種辦法。其一是創(chuàng)建一個(gè)Prefab,然后在需要的地方進(jìn)行實(shí)例化。Prefab好處就是當(dāng)我需要修改一類(lèi)游戲物體屬性時(shí),我們不必一一的去操作,只需要去修改這類(lèi)物體的Prefab即可,然后Apply一下即可應(yīng)用到所有這類(lèi)物體上,其大大方便了開(kāi)發(fā)者。再則就是到Resources文件下進(jìn)行加載,Unity為開(kāi)發(fā)者提供了很多命名文件,開(kāi)發(fā)者只需要將游戲物體或者資源放入這些文件中,然后調(diào)用API即可使用。本文實(shí)現(xiàn)的功能使用是第一種,通過(guò)提前創(chuàng)建需要的Prefab,然后再在場(chǎng)景中進(jìn)行實(shí)例化。
本文通過(guò)對(duì)現(xiàn)有游戲開(kāi)發(fā)常見(jiàn)的框架和腳本管理的研究,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的游戲客戶(hù)端,所需要的開(kāi)發(fā)環(huán)境為Unity3D和其自帶編譯器MonoDevelop。
圖8(a)顯示的本客戶(hù)端使用的動(dòng)畫(huà)狀態(tài)機(jī),通過(guò)不同操作改變參數(shù)從而實(shí)現(xiàn)各個(gè)狀態(tài)的之間的狀態(tài)切換。圖8(b)所示是對(duì)腳本的管理。圖8(c)所示是通過(guò)碰撞檢測(cè)對(duì)玩家和金幣或者墻壁碰撞進(jìn)行檢測(cè),當(dāng)主角碰到金幣之后,金幣自動(dòng)回收,然后設(shè)置錢(qián)Active為false。當(dāng)主角碰到墻壁時(shí),觸發(fā)狀態(tài)機(jī)切換狀態(tài)為死亡狀態(tài)。
圖8 效果圖
本文通過(guò)學(xué)習(xí)Unity3D游戲引擎各個(gè)組件的基礎(chǔ)上,通過(guò)對(duì)目前游戲開(kāi)發(fā)框架和腳本管理方式的研究,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的游戲客戶(hù)端開(kāi)發(fā)。實(shí)現(xiàn)了游戲主角的動(dòng)畫(huà)狀態(tài)切換、物品拾取,以及音頻音效的管理等功能,一方面體現(xiàn)出Unity3D游戲開(kāi)發(fā)平臺(tái)的強(qiáng)大性,另一方面體現(xiàn)使用合理的管理方式對(duì)游戲開(kāi)發(fā)的重要性。本文游戲還可以進(jìn)一步進(jìn)行擴(kuò)展功能,例如登錄注冊(cè),金幣積分累計(jì)等功能,在資源材質(zhì)方面還可以進(jìn)步通過(guò)Shader來(lái)進(jìn)一步美化。
[1]王樹(shù)斌.淺析Unity3D開(kāi)發(fā)游戲流程及常用技術(shù)[J].電腦知識(shí)與技術(shù),2012.
[2]張敏.基于Unit 3D的游戲的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)光盤(pán)軟件與應(yīng)用,2014.
[3]趙海峰.基于Unity3D的游戲開(kāi)發(fā)與設(shè)計(jì)[D].山東:山東科技大學(xué),2014.
[4]楊娜,李杰,廖金巧.基于Unity3D的三維生態(tài)莊園游戲設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代計(jì)算機(jī),2015.
[5]宣雨松.Unity3D游戲開(kāi)發(fā)[M].北京:Unity3D游戲開(kāi)發(fā),2012.
[6]路朝龍.Unity權(quán)威指南[M].北京:中國(guó)青年出版社,2014.5.
[7]林巧民,林萍,王汝芬.3D游戲開(kāi)發(fā)中的碰撞檢測(cè)算法研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2010.
Game Development;Basic Framework;General Management Mode;Client
Research and Development of Client in the Framework of the Basic Game Based on Unity3D
LIANG Cheng
(School of Computer and Software Engineering,Xihua University,Chengdu 610039)
1007-1423(2015)25-0078-05
10.3969/j.issn.1007-1423.2015.25.020
梁成(1989-),男,重慶開(kāi)縣人,在讀研究生,研究方向?yàn)橛螒蚶碚撆c虛擬現(xiàn)實(shí)
2015-07-09
2015-08-20
對(duì)于大多數(shù)人來(lái)說(shuō)游戲開(kāi)發(fā)是一項(xiàng)很神秘的工作,為了揭開(kāi)這層神秘的面紗,通過(guò)研究現(xiàn)有游戲開(kāi)發(fā),總結(jié)游戲開(kāi)發(fā)中的基本游戲框架和腳本通用管理方式。利用Unity3D平臺(tái),在基本游戲框架和通用管理方式下實(shí)現(xiàn)游戲客戶(hù)端的設(shè)計(jì)與開(kāi)發(fā),從而讓更多的游戲愛(ài)好者了解游戲的開(kāi)發(fā)過(guò)程。
游戲開(kāi)發(fā);基本框架;通用管理方式;客戶(hù)端
For most people,game development is a very mysterious work,in order to uncover the layer of mystery,studies the existing game development,summaries the basic game framework and scripting common management.Uses Unity3D platform,under the basic game framework and common management approach to achieve the client's game design and development,so that more game enthusiasts can understand the game development process.