吳晶晶,戴智超
(泉州師范學(xué)院 數(shù)學(xué)與計(jì)算機(jī)科學(xué)學(xué)院,泉州 362000)(福建省大數(shù)據(jù)管理新技術(shù)與知識(shí)工程重點(diǎn)實(shí)驗(yàn)室,泉州 362000)(智能計(jì)算與信息處理福建省高校重點(diǎn)實(shí)驗(yàn)室,泉州 362000)
基于Unity3D的多人在線網(wǎng)絡(luò)游戲設(shè)計(jì)與開(kāi)發(fā)①
吳晶晶,戴智超
(泉州師范學(xué)院 數(shù)學(xué)與計(jì)算機(jī)科學(xué)學(xué)院,泉州 362000)(福建省大數(shù)據(jù)管理新技術(shù)與知識(shí)工程重點(diǎn)實(shí)驗(yàn)室,泉州 362000)(智能計(jì)算與信息處理福建省高校重點(diǎn)實(shí)驗(yàn)室,泉州 362000)
本文基于Unity3D技術(shù)對(duì)多人在線角色扮演類游戲進(jìn)行了設(shè)計(jì)及實(shí)現(xiàn).為了增強(qiáng)游戲的效果,采用了角色控制狀態(tài)機(jī)與交互取值算法、移動(dòng)策略和人工智能交互等關(guān)鍵技術(shù).針對(duì)如何改善游戲運(yùn)行時(shí)的工作效率問(wèn)題,提出了使用協(xié)同程序技術(shù)實(shí)現(xiàn)預(yù)先式同步數(shù)據(jù)讀取.將協(xié)同程序技術(shù)應(yīng)用在地圖預(yù)讀取中,使漫長(zhǎng)的地圖讀取過(guò)程可以在運(yùn)行期的“閑時(shí)”進(jìn)行處理.效能分析實(shí)驗(yàn)證明了該優(yōu)化方法有效降低了程序時(shí)間復(fù)雜度,有效解決了游戲運(yùn)行時(shí)的實(shí)效性問(wèn)題.
多人在線網(wǎng)絡(luò)游戲; Unity 3D; 協(xié)同程序技術(shù); 地圖預(yù)讀取; 交互取值算法; 人工智能交互
隨著虛擬現(xiàn)實(shí)技術(shù)的發(fā)展和第三代互聯(lián)網(wǎng)技術(shù)的逐漸成熟,用于開(kāi)發(fā)網(wǎng)絡(luò)游戲的技術(shù)很多,近幾年熱門的Unity3D得到了業(yè)界的青睞.Unity3D是一款跨平臺(tái)性突出,兼容性強(qiáng)的游戲引擎.本文借助Unity3D平臺(tái)開(kāi)發(fā)了一款MMORPG游戲系統(tǒng).MMORPG游戲即多人在線角色扮演類游戲,是現(xiàn)在最為流行的經(jīng)典網(wǎng)絡(luò)游戲形式,多名玩家通過(guò)網(wǎng)絡(luò)在虛擬的環(huán)境下對(duì)人物角色進(jìn)行操作,以達(dá)到多人在線游戲娛樂(lè).
目前,國(guó)內(nèi)外許多學(xué)者在Unity3D平臺(tái)游戲開(kāi)發(fā)方面做了大量的研究工作.如伍傳敏等人基于Unity3D完成了第一人稱射擊游戲的設(shè)計(jì)與開(kāi)發(fā)[1].張典華等人基于Unity3D實(shí)現(xiàn)了多平臺(tái)兼容的三維空戰(zhàn)游戲[2].劉晉鋼等人則研究了Unity3D與Kinect整合數(shù)據(jù)技術(shù)在體感游戲中的應(yīng)用價(jià)值[3].
本文通過(guò)C++架設(shè)服務(wù)器以實(shí)現(xiàn)多人同時(shí)在線,基于Unity引擎進(jìn)行游戲客戶端的設(shè)計(jì)與開(kāi)發(fā).為了改善程序運(yùn)行時(shí)效率,提出了預(yù)先式讀取策略,該策略主要用于解決漫長(zhǎng)的地圖讀取過(guò)程的問(wèn)題.通過(guò)在程序運(yùn)行的空閑狀態(tài)中,預(yù)先讀取接下來(lái)可能到達(dá)的地圖數(shù)據(jù),從而降低了程序的時(shí)間復(fù)雜度,以增強(qiáng)游戲體驗(yàn)中的實(shí)效性.
本游戲以中世紀(jì)歐洲的騎士文化為主背景.游戲設(shè)計(jì)采取了任務(wù)制,通過(guò)不斷完成主線任務(wù)來(lái)推進(jìn)劇情的一步步深入.游戲中勇者職業(yè)一共有四種,分別有不同的屬性和技能.游戲組隊(duì)演示如圖1所示.
圖1 組隊(duì)演示
為了增強(qiáng)游戲的效果,本文提出了以下幾點(diǎn)設(shè)計(jì)策略:
① 游戲的客戶端應(yīng)具較高的實(shí)時(shí)率,故客戶端更新率設(shè)為60幀.為降低游戲網(wǎng)絡(luò)延遲對(duì)游戲影響,服務(wù)器同步率設(shè)為10幀.
② 提供完整的可視輔助圖形系統(tǒng)[4-6],同時(shí)提供可自由選擇的角色視角.
③ 設(shè)置怪物的屬性、怪物的AI,NPC的對(duì)話內(nèi)容、任務(wù)流程和NPC的AI.
④ 設(shè)置音效、角色技能特效、角色死亡特效、傳送特效,傳送特效如圖2所示.
圖2 游戲傳送特效
本文提出的游戲系統(tǒng)結(jié)構(gòu)如圖3所示,服務(wù)器采用了基于自主研發(fā)的核心架構(gòu),通過(guò)核心連接“數(shù)據(jù)庫(kù)”、“賬號(hào)服務(wù)器”、“網(wǎng)絡(luò)服務(wù)”、“副本”四個(gè)子程序構(gòu)成; 客戶端則基于Unity的腳本系統(tǒng),分成“游戲控制”、“美術(shù)邏輯”、“功能接口”三大模塊.
圖3 游戲系統(tǒng)結(jié)構(gòu)
文中的服務(wù)器多子程序連接式結(jié)構(gòu),提高了各功能模塊間的獨(dú)立性; 并且引入核心架構(gòu)提高了運(yùn)行效率和編譯耦合度.客戶端使用Unity腳本系統(tǒng),降低了3大模塊間的耦合度,但同時(shí)也降低后期維護(hù)難度,這樣的設(shè)計(jì)基于帕累托法則[7]有助于提高軟件效率.
對(duì)于MMORPG游戲而言,良好的鼠標(biāo)操作手感是至關(guān)重要的.為了實(shí)現(xiàn)鼠標(biāo)交互代替控制器,需要的是優(yōu)秀的角色控制狀態(tài)機(jī)與交互取值算法.此外,還需要移動(dòng)策略的尋路算法[8]來(lái)完成鼠標(biāo)控制移動(dòng).移動(dòng)實(shí)現(xiàn)的效果圖如圖4所示,該部分實(shí)現(xiàn)通過(guò)Unity腳本系統(tǒng)編寫(xiě),整體實(shí)現(xiàn)的偽代碼如下:
① 創(chuàng)建角色控制狀態(tài)機(jī),鼠標(biāo)取值(坐標(biāo))并傳給角色控制狀態(tài)機(jī).
② 狀態(tài)機(jī)判斷鼠標(biāo)獲得坐標(biāo)在三維場(chǎng)景中是否存在.
③ 啟動(dòng)尋路算法,角色按尋路策略走向該坐標(biāo).
④ 將移動(dòng)結(jié)果發(fā)送到服務(wù)器中,使每個(gè)客戶端的移動(dòng)結(jié)果在服務(wù)器中同步.
不同于平面上的鼠標(biāo)取值行為,當(dāng)鼠標(biāo)在三維空間中取值時(shí),會(huì)出現(xiàn)歧義.因?yàn)樵谄矫嫔蠈?duì)三維空間取值,返回值將是“一條離散的直線”.故而需要對(duì)直線進(jìn)行“照準(zhǔn)”,使直線的“擊中點(diǎn)”落在場(chǎng)景中.
鼠標(biāo)取值,最終是為了控制角色移動(dòng).故而單純地讓點(diǎn)“落在”場(chǎng)景中是不夠的.因?yàn)闀?huì)出現(xiàn)擊中點(diǎn)是“唯一點(diǎn)”,但這個(gè)點(diǎn)卻是角色無(wú)法到達(dá)的點(diǎn),例如該點(diǎn)是一個(gè)路障.此時(shí)就要求系統(tǒng)計(jì)算出一個(gè)“更優(yōu)秀的點(diǎn)”來(lái)代替該點(diǎn),因而本文引入了Ray照準(zhǔn)技術(shù).在鼠標(biāo)的點(diǎn)擊時(shí),通過(guò)Ray“發(fā)射一條射線”照準(zhǔn)當(dāng)前鼠標(biāo)取值.當(dāng)取中的點(diǎn)不可取的點(diǎn)時(shí),則拋棄該點(diǎn),遍歷選擇最近的可取的點(diǎn)作為代替.鼠標(biāo)交互算法關(guān)鍵代碼如下:
對(duì)于RPG游戲而言,人工智能是不可或缺的.一套擁有良好“智能”的AI系統(tǒng)將會(huì)為玩家提供更好的游戲體驗(yàn).
本文基于Unity的腳本系統(tǒng),并采用MVC模式[9,10]設(shè)計(jì)人工智能.為了保證人工智能各模塊之間的相互獨(dú)立,本文基于策略設(shè)計(jì)模式.使用組合式腳本提高AI狀態(tài)機(jī)、AI信息、AI行為三大模塊的耦合度.組合式腳本邏輯思路如下:
① AI信息獲取“組合體”中的AI狀態(tài)機(jī)和AI行為對(duì)應(yīng)數(shù)據(jù)庫(kù)中相應(yīng)腳本文件,并將這兩個(gè)腳本讀入為當(dāng)前AI對(duì)象的成員.數(shù)據(jù)庫(kù)查詢階段如圖5所示.
圖5 數(shù)據(jù)庫(kù)中查詢AI信息對(duì)應(yīng)的AI狀態(tài)機(jī)、行為
② AI狀態(tài)機(jī)判斷狀態(tài)變化,并切換相應(yīng)的模型動(dòng)畫(huà),使角色“動(dòng)起來(lái)”,并將取值結(jié)果做為參數(shù)調(diào)用AI行為.
③ 對(duì)象基于AI行為,啟動(dòng)相應(yīng)的行為策略,例如追擊行為和巡回行為有各自的移動(dòng)策略及相應(yīng)的尋路算法,攻擊行為有優(yōu)先級(jí)攻擊策略.基于多元的行為策略,AI做出相應(yīng)的應(yīng)對(duì)方式.組合式腳本分析如圖6所示.
圖6 組合式 AI腳本系統(tǒng)
對(duì)于玩家而言,漫長(zhǎng)的地圖讀取往往是一件令人厭煩事.若可以在當(dāng)前地圖中預(yù)讀取之后可能進(jìn)入的地圖,將大幅減少等待讀取時(shí)間,改善游戲體驗(yàn).因而本文提出了使用協(xié)同程序?qū)崿F(xiàn)地圖預(yù)讀取的策略.
Unity引擎提供了IEnumerator接口,這個(gè)接口的特點(diǎn)就在于:當(dāng)所有類中Start函數(shù)運(yùn)行完后,每次運(yùn)行類中的Update函數(shù)之前,都會(huì)先運(yùn)行返回類型為IEnumerator的函數(shù).在這個(gè)函數(shù)中寫(xiě)入與CPU線程需求相關(guān)的判斷句式,就會(huì)形成每一更新幀讀取到Update函數(shù)之前,都會(huì)訪問(wèn)一次CPU線程需求的狀態(tài).若前一更新幀的計(jì)算結(jié)果中產(chǎn)生了CPU線程需求時(shí),在下一更新幀前,就會(huì)進(jìn)入?yún)f(xié)同程序.然后協(xié)同程序發(fā)送信息給CPU,CPU依照這條消息開(kāi)設(shè)新的線程,運(yùn)行信息的需求.本文協(xié)同程序設(shè)計(jì)如圖7所示.
本文協(xié)同程序在設(shè)計(jì)上具有兩個(gè)特點(diǎn):
圖7 協(xié)同程序設(shè)計(jì)
① 本文的協(xié)同程序接收器是一個(gè)生命周期“比較長(zhǎng)”的局部變量[11].因?yàn)樵搮f(xié)同程序讀取的文件是地圖數(shù)據(jù),而高質(zhì)量模型的地圖場(chǎng)景數(shù)據(jù)量往往是巨大的.相較于這些地圖數(shù)據(jù),每一次構(gòu)造一個(gè)監(jiān)聽(tīng)器的成本幾乎可以忽略不計(jì).
② 本文在協(xié)同程序的設(shè)計(jì)中包含IEnumerator,因而可以“掛起”.創(chuàng)建完監(jiān)聽(tīng)器后,如果數(shù)據(jù)讀取完成,就將數(shù)據(jù)包返回給IEnumerator; 如果讀取未完成就掛起,暫停協(xié)同程序,等待下一幀進(jìn)入?yún)f(xié)同程序再監(jiān)聽(tīng).因?yàn)樗冀K保持“掛起”,幾乎避免了管理這塊內(nèi)存[12,13].由于它始終被占用著,并且析構(gòu)時(shí)會(huì)將IEnumerator一起析構(gòu),避免了內(nèi)存泄露.
從效能角度看,協(xié)同程序增加了系統(tǒng)的空間占用,但它大幅降低了數(shù)據(jù)讀取的時(shí)間復(fù)雜度.如表1實(shí)踐結(jié)果所示,由于協(xié)同程序的引入,數(shù)據(jù)可在閑時(shí)進(jìn)行預(yù)讀取,理想狀態(tài)下,可將忙時(shí)讀取時(shí)長(zhǎng)縮短至可忽略范圍.即使玩家頻繁的切換地圖,依然可以將平均忙時(shí)讀取時(shí)長(zhǎng)壓縮到0.8 s內(nèi).同時(shí)從表中數(shù)據(jù)可知,協(xié)同程序的引入對(duì)于程序的空間占用并未造成太大的影響.
表1 協(xié)同程序優(yōu)化前后的效能分析
本文采用上述的設(shè)計(jì)策略和關(guān)鍵技術(shù),實(shí)現(xiàn)了基于Unity3D的MMORPG游戲的開(kāi)發(fā).其中圖8游戲登錄后的新建角色界面.值得一提的是在創(chuàng)建角色時(shí),角色框中的“騎士”是可動(dòng)的.圖9個(gè)人游戲賬號(hào)存檔界面.圖10游戲測(cè)試界面,圖中紅色方框內(nèi)是對(duì)角色生命槽的動(dòng)態(tài)測(cè)試結(jié)果.從圖中可以看出游戲畫(huà)質(zhì)精度高、同步率良好.同時(shí)本游戲具有270°視角轉(zhuǎn)換及良好的操作手感,如動(dòng)態(tài)可視化工具欄,能夠很好滿足用戶不同的需求.
圖8 創(chuàng)建新角色
圖9 個(gè)人賬號(hào)存檔
圖10 游戲動(dòng)態(tài)測(cè)試
本文設(shè)計(jì)的游戲內(nèi)存和內(nèi)核使用率低,但對(duì)于GPU硬件基礎(chǔ)要求較高.基本運(yùn)行時(shí)和最高特效運(yùn)行時(shí)各自的硬件需求如表2所示.
表2 游戲硬件要求
本文基于Unity3D進(jìn)行了MMORPG游戲的設(shè)計(jì)與開(kāi)發(fā).在自主研發(fā)架設(shè)游戲服務(wù)器并設(shè)計(jì)實(shí)現(xiàn)了游戲客戶端的基礎(chǔ)上,采用了角色控制狀態(tài)機(jī)與交互取值算法、移動(dòng)策略和人工智能交互等關(guān)鍵技術(shù).通過(guò)“協(xié)同程序?qū)崿F(xiàn)地圖預(yù)讀取” 策略改良了游戲客戶端運(yùn)行時(shí)的效率,效能分析實(shí)驗(yàn)證明了該優(yōu)化方法有效降低了程序時(shí)間復(fù)雜度.最后,通過(guò)開(kāi)發(fā)的網(wǎng)絡(luò)游戲系統(tǒng)驗(yàn)證了所提方法的可行性.
1伍傳敏,張帥,邱錦明.基于 Unity3D的FPS游戲設(shè)計(jì)與開(kāi)發(fā).三明學(xué)院學(xué)報(bào),2012,29(2):35–40.
2張典華,陳一民,李磊.基于 Unity3 D 的多平臺(tái)三維空戰(zhàn)游戲的開(kāi)發(fā).計(jì)算機(jī)技術(shù)與發(fā)展,2014,24(1):192–195.
3劉晉鋼,劉衛(wèi)斌,劉晉霞.Kinect與 Unity3D 數(shù)據(jù)整合技術(shù)在體感游戲中的應(yīng)用研究.電腦開(kāi)發(fā)與應(yīng)用,2014,27(11):7–11,14.[doi:10.3969/j.issn.1003-5850.2014.11.003]
4呂偉偉,孟維亮,薛蓋超,等.基于 GPU 的近似軟影實(shí)時(shí)繪制.計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào),2009,21(3):275–281,288.
5方志力,溫維亮,郭新宇,等.Kinect體感控制性能優(yōu)化方法.計(jì)算機(jī)工程與設(shè)計(jì),2014,35(12):4350–4355.[doi:10.3969/j.issn.1000-7024.2014.12.057]
6羅仕鑒,龔蓉蓉,朱上上.面向用戶體驗(yàn)的手持移動(dòng)設(shè)備軟件界面設(shè)計(jì).計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào),2010,22(6):1033–1041.
7黃茂生,楊春暉.基于帕累托法則的軟件測(cè)試策略優(yōu)化.現(xiàn)代電子技術(shù),2008,31(24):89–92.[doi:10.3969/j.issn.1004-373X.2008.24.028]
8梁毅,周剛.基于定位點(diǎn)和路徑復(fù)用的大型多人在線游戲?qū)ぢ匪惴?計(jì)算機(jī)應(yīng)用,2010,30(12):3215–3217.
9李園,陳世平.MVC設(shè)計(jì)模式在ASP.NET平臺(tái)中的應(yīng)用.計(jì)算機(jī)工程與設(shè)計(jì),2009,30(13):3180–3184.
10李春紅,高建華.使用分層模型改進(jìn)MVC設(shè)計(jì)架構(gòu).計(jì)算機(jī)工程與設(shè)計(jì),2007,28(4):766–769.
11伍鳴,齊驥,鄒瓊.基于長(zhǎng)生命周期對(duì)象的混合垃圾收集.小型微型計(jì)算機(jī)系統(tǒng),2008,29(7):1190–1195.
12魏棟,譚功全,葉建平.Android 系統(tǒng)的內(nèi)存管理研究.單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2012,12(4):9–12.
13肖康,劉福巖.大型3D場(chǎng)景漫游系統(tǒng)內(nèi)存管理.計(jì)算機(jī)工程與設(shè)計(jì),2010,31(10):2320–2322,2326.
Development of Massively Multiplayer Online Role-Playing Games Based on Unity 3D
WU Jing-Jing,DAI Zhi-Chao
(College of Mathematics and Computer Science,Quanzhou Normal University,Quanzhou 362000,China)(Fujian Provincial Key Laboratory of Data Intensive Computing,Quanzhou 362000,China)(Key Laboratory of Intelligent Computing and Information Processing,Fujian Province University,Quanzhou 362000,China)
A MMORPG (massively multiplayer online role-playing games)is developed based on Unity 3D.The character controller,the mouse-value interactive algorithm,the motion strategy and the AI-interaction are used to enhance the game performance.In order to improve the working efficiency of game,this paper proposes client resource forecast and synchronous reading by using coroutine technology.The strategy that uses coroutine technology in forecast reading of maps can make it possible to have long-time reading running in the spare time of the system.Experimental performance analysis and experimental results both show that the optimization method proposed can effectively reduce the time complexity of the program and enhance the efficiency of game runtime.
MMORPG; Unity3D; coroutine; forcast map reading; mouse interacting algorithm; AI- interaction
吳晶晶,戴智超.基于Unity3D的多人在線網(wǎng)絡(luò)游戲設(shè)計(jì)與開(kāi)發(fā).計(jì)算機(jī)系統(tǒng)應(yīng)用,2017,26(10):133–138.http://www.c-s-a.org.cn/1003-3254/6028.html
福建省科技廳自然科學(xué)基金面上項(xiàng)目(2017J01776); 福建省省屬高校科研專項(xiàng)項(xiàng)目(JK2015037); 泉州師范學(xué)院青年博士預(yù)研基金項(xiàng)目(2015QBKJ02); 泉州師范學(xué)院博士科研啟動(dòng)項(xiàng)目(G17003)
2017-01-23; 采用時(shí)間:2017-03-02