林 劍,張 帥,伍傳敏
(三明學(xué)院 信息工程學(xué)院,福建 三明,365004)
基于目前高端智能手機(jī)的發(fā)展,觸屏手機(jī)游戲作為下一代游戲產(chǎn)業(yè)鏈中的新亮點(diǎn),逐漸成為各大手機(jī)制造廠商及動(dòng)漫游戲公司相互競(jìng)爭(zhēng)的焦點(diǎn)[1-3]。據(jù)調(diào)查,目前大眾最為喜歡的觸屏手機(jī)游戲主要有:切水果、捕魚(yú)達(dá)人、植物大戰(zhàn)僵尸、跑酷、天天愛(ài)消除、極品飛車、鱷魚(yú)愛(ài)洗澡等[4]。這些游戲的超高人氣主要來(lái)自游戲容易上手、玩法的趣味性、場(chǎng)景的逼真性及和諧人機(jī)交互性等優(yōu)勢(shì)。因此在手機(jī)游戲的設(shè)計(jì)方面,首先要考慮良好的人機(jī)交互性,如玩家能夠輕易地退出游戲,并能夠在他們離開(kāi)的地方繼續(xù)游戲;其次是游戲畫(huà)面的逼真性及流暢性,并保證控制要直觀、易于掌握;最后是恰當(dāng)?shù)娜斯ぶ悄?,并要求游戲故事情?jié)簡(jiǎn)單,目標(biāo)明確,并保證手指與屏幕上手柄的完美匹配。
本文結(jié)合三維建模軟件Maya進(jìn)行游戲場(chǎng)景中角色、道具等物品建模,利用Unity3D游戲引擎迅速高效地創(chuàng)建對(duì)象、導(dǎo)入外部資源,基于Unity3D觸屏事件處理機(jī)制,研究快速完成自定義地形場(chǎng)景、模型動(dòng)態(tài)顯示及人工智能等關(guān)鍵技術(shù),并進(jìn)行APK文件的發(fā)布,最終完成了Android觸屏類手機(jī)游戲的開(kāi)發(fā)。
在游戲開(kāi)發(fā)過(guò)程中經(jīng)常需要獲得用戶的輸入過(guò)程如觸控動(dòng)作相關(guān)的各個(gè)參數(shù),按鍵的情況等。Unity3D在設(shè)計(jì)平臺(tái)時(shí)專門提供了兩個(gè)輸入對(duì)象:Touch和Input對(duì)象。通過(guò)這兩個(gè)對(duì)象可以方便地獲取用戶輸入的各個(gè)參數(shù),包括觸控的位置、按下移動(dòng)的位置、是哪個(gè)鍵等。
現(xiàn)今流行的Android平臺(tái)和IPhone平臺(tái)都是基于屏幕觸控的,因此Touch輸入對(duì)象是開(kāi)發(fā)過(guò)程中經(jīng)常遇到的問(wèn)題,也是較難解決的問(wèn)題。Touch方法可以方便的獲取用戶輸入的各種參數(shù),用于記錄一個(gè)手指觸摸在屏幕上的狀態(tài),變量說(shuō)明如表1。
表1 Touch方法的變量說(shuō)明
只有各個(gè)變量相互配合才能完成觸屏游戲中物體的交互控制,具體交互方法如下:
Joystick類是一個(gè)專門處理虛擬搖桿事件的類,內(nèi)置StartGame函數(shù)(用于設(shè)置虛擬搖桿的貼圖屬性及初始位置),ResetJoystick函數(shù)(用于重置搖桿所有數(shù)據(jù)信息,當(dāng)手指離開(kāi)觸摸屏后,會(huì)重置搖桿的所有數(shù)據(jù))。Unity3D內(nèi)置Update函數(shù)作為每幀都執(zhí)行的函數(shù),用來(lái)監(jiān)聽(tīng)玩家是否有觸屏操作,并進(jìn)行相應(yīng)的處理。在實(shí)際應(yīng)用中應(yīng)先創(chuàng)建一個(gè)Joystick對(duì)象并初始化:
然后在Update函數(shù)中監(jiān)聽(tīng)搖桿的位置信息:
其中l(wèi)eftx得到的數(shù)據(jù)是虛擬搖桿在x軸的位置偏離了初始位置的距離,向左偏離為負(fù)值,向右偏離為正值。Lefty得到的數(shù)據(jù)同理。這樣就可以非常方便的得到玩家操作虛擬搖桿的數(shù)據(jù)信息。
編輯Unity中的地形有3種方法:第一是利用三維建模軟件(3DMax,Maya等)建模形成一個(gè)游戲世界的完整3D模型后導(dǎo)入;第二是使用Unity3D自帶的筆刷工具動(dòng)態(tài)的在地形表面繪制山峰和谷底;第三種方法是導(dǎo)入預(yù)先渲染好的灰度圖。雖然使用3D軟件搭建的游戲環(huán)境能夠一次性導(dǎo)入并確保所有物品都彼此匹配并精確定位。但是使用Unity3D自帶的地形引擎可以高效快速地模擬接近自然的東西或是現(xiàn)實(shí)世界中的大陸,并占用移動(dòng)終端較少的內(nèi)存資源。
基本上一幅灰度圖就是一幅高度圖,它使用2D圖像來(lái)表示3D的高度變化,采用較暗的灰黑色來(lái)表示較低的高度,用較亮的灰白色來(lái)表示較高的高度。導(dǎo)入的灰度圖必須是RAW格式。一旦有了灰度圖,就可以將它導(dǎo)入了,Unity會(huì)彈出一個(gè)對(duì)話框顯示導(dǎo)入選項(xiàng),見(jiàn)表2。
表2 導(dǎo)入高度圖選項(xiàng)設(shè)置
值得注意的是,在對(duì)地形高度進(jìn)行編輯后,還可以地形設(shè)置選項(xiàng)中修改細(xì)節(jié)分辨率(detail resolution)和貼圖分辨率(base texture resolution),但開(kāi)始制作后,再修改這些選項(xiàng),會(huì)帶來(lái)巨大的問(wèn)題。即修改任何的分辨率數(shù)據(jù)會(huì)導(dǎo)致依賴于此的所有細(xì)節(jié)信息全部被刪除掉。
手機(jī)由于硬件的限制,如果一次性將所有的場(chǎng)景模型全部加載容易造成“卡機(jī)”的現(xiàn)象。為了提高內(nèi)存的使用效率,并快速完成所需要模型的加載,需要使用模型的動(dòng)態(tài)顯示技術(shù)。通過(guò)編寫(xiě)RenderSwitch類獲取主角和場(chǎng)景模型的位置信息,通過(guò)計(jì)算它們之間的距離來(lái)判斷該模型是否應(yīng)該被渲染出來(lái)。這樣手機(jī)就只需要渲染出離主角近的模型而不必將場(chǎng)景中所有的模型都渲染出來(lái)。提高了游戲運(yùn)行的流暢度。RenderSwitch類算法如下:
一款游戲的好玩與否很大程度上取決于敵人的人工智能,在此主要闡述觸屏類游戲AI中經(jīng)常用到的自動(dòng)巡邏算法和自動(dòng)追蹤算法。為了使不同的角色擁有不同的人工智能,會(huì)涉及到Unity3D中一些重要常用的類,具體如下表3。
表3 Unity3D中關(guān)于AI設(shè)計(jì)中常用類
當(dāng)然,不同的游戲有著不同的敵人,其人工智能也不盡相同,本文主要實(shí)現(xiàn)當(dāng)敵人看到玩家時(shí)自動(dòng)追擊,否則自動(dòng)巡邏的敵人智能實(shí)現(xiàn)。
首先應(yīng)該計(jì)算出敵人與玩家之間的距離。通過(guò)距離判斷敵人當(dāng)前應(yīng)該進(jìn)行什么動(dòng)作。如果距離小于某個(gè)值,則判定玩家進(jìn)入視野,對(duì)玩家進(jìn)行追擊。追擊的部分代碼如下:
transform.rotation=Quaternion.Slerp(transform.rotation,Quaternion.LookRotation(PlayerTarget.transform.position-transform.position),Time.deltaTime*speed);
其中,Quaternion四元數(shù)這個(gè)類可以很好地將敵人以time.deltatime*speed的速度向當(dāng)前目標(biāo)平滑旋轉(zhuǎn)追擊。
當(dāng)距離大于某個(gè)值時(shí),則判定玩家不在自己周圍,從而進(jìn)入自動(dòng)巡邏狀態(tài)。將以上腳本賦予敵人后,敵人就能夠在“看見(jiàn)”玩家的時(shí)候自動(dòng)追擊,否則每隔幾秒巡邏一個(gè)特定的區(qū)域。自動(dòng)巡邏部分算法如下:
Unity的動(dòng)畫(huà)API非常強(qiáng)大和全面,它還包含集成了動(dòng)畫(huà)編輯器。其中Animation類負(fù)責(zé)對(duì)模型動(dòng)畫(huà)剪輯進(jìn)行播放,組合和混合的所有功能,它從Behavior類派生而來(lái),因此包含我們常看到的一些函數(shù),變量。在Unity中一個(gè)給定游戲?qū)ο笊纤锌梢允褂玫膭?dòng)畫(huà)都會(huì)被賦予一個(gè)圖層,默認(rèn)為0,優(yōu)先級(jí)高的圖層能夠覆蓋低優(yōu)先級(jí)圖層的動(dòng)畫(huà)。
通常一個(gè)角色都會(huì)有一個(gè)空閑動(dòng)畫(huà),它會(huì)在玩家沒(méi)做任何事情時(shí)播放,同時(shí)可能也會(huì)有奔跑和攻擊動(dòng)畫(huà),一個(gè)良好的圖層順序是空閑動(dòng)畫(huà)位于圖層0,奔跑動(dòng)畫(huà)位于圖層5,攻擊動(dòng)畫(huà)位于圖層10,這樣一來(lái)玩家如果進(jìn)行攻擊,攻擊動(dòng)畫(huà)的優(yōu)先級(jí)就會(huì)比奔跑動(dòng)畫(huà)高,同時(shí)也會(huì)阻止空閑動(dòng)畫(huà)的播放企圖。
要設(shè)置圖層順序,需要在動(dòng)畫(huà)腳本開(kāi)始出初始化這段動(dòng)畫(huà),方法如下:
annimation[“此處為要設(shè)置的動(dòng)畫(huà)名稱”].layer=10;
一般情況下,一個(gè)良好的圖層次序會(huì)將空閑動(dòng)畫(huà)置為0,將彈跳動(dòng)畫(huà)置為5,攻擊動(dòng)畫(huà)置為10,這樣如果玩家進(jìn)行攻擊,攻擊動(dòng)畫(huà)的優(yōu)先級(jí)會(huì)比基本的奔跑動(dòng)畫(huà)高,它會(huì)覆蓋對(duì)彈跳和空閑動(dòng)畫(huà)的任何播放企圖。
在Unity3D中完成游戲設(shè)計(jì)后,需要導(dǎo)出APK格式完成觸屏類手機(jī)游戲的發(fā)布。本文以Android手機(jī)為例進(jìn)行說(shuō)明。具體如下:
首先配置JDK和SDK環(huán)境,將下載好的JDK文件安裝在C:Program FilesJava路徑下。安裝完畢后,設(shè)置環(huán)境變量為:
PATH=C:Program?FilesJavajdk1.7.0_40in
CLASSPATH=C:ProgramFilesJavajdk1.7.0_40libdt.jar;C:ProgramFilesJavajdk1.7.0_40\lib ools.jar;
JAVA_HOME=C:Program FilesJavajdk1.7.0_40
然后將解壓好的SDK文件放在D盤(pán)根目錄下,并在path環(huán)境變量中添加
D:adt-bundle-windows-x86sdk ools;D:adt-bundle-windows-x86sdkplatform-tools;
最后在Unity3D中打開(kāi)Unity Preference,設(shè)置好android sdk目錄為D:adt-bundle-windowsx86,打開(kāi)File>Build settings,選擇平臺(tái)為Android,完成APK文件的發(fā)布。具體游戲?qū)崿F(xiàn)如圖1~圖2。
圖1 游戲開(kāi)機(jī)界面
圖2 游戲運(yùn)行畫(huà)面
結(jié)合Unity3D游戲引擎實(shí)現(xiàn)了觸屏類手機(jī)游戲的應(yīng)用實(shí)現(xiàn),討論了快速完成自定義地形場(chǎng)景、模型動(dòng)態(tài)顯示及人工智能等關(guān)鍵技術(shù),設(shè)計(jì)了模型間的鏈接與控制,最后完成APK文件的發(fā)布,提出了行之有效的技術(shù)措施,具有一定的應(yīng)用價(jià)值。
[1]WANG S, MAO Z, ZENG C, et al.A new method of virtual reality based on Unity3D[C]//Geoinformatics, 2010 18th International Conference on IEEE, 2010: 1-5.
[2]CREIGHTON R H.Unity 3D game development by example: Beginner's guide[M].[s.l.]Packt Publishing, 2010.
[3]INDRAPRASTHA A, SHINOZAKI M.The investigation on using Unity3D game engine in urban design study[J].ITB Journal of Information and Communication Technology, 2009,3 (1):1-18.
[4]JIE J, YANG K, HAIHUI S.Research on the 3D game scene optimization of mobile phone based on the Unity 3D engine[C]//Computational and Information Sciences(ICCIS), 2011 International Conference on IEEE, 2011: 875-877.
[5]PENG Q I,LINA Y U,JING W.The research and application of products virtual exhibition technology base on unity 3D[J].Digital Technology and Application, 2010(9):1314-1318.
[6]LABSCHTZ M, KRSL K, AQUINO M, et al.Content creation for a 3D game with Maya and Unity 3D[J].Institute of Computer Graphics and Algorithms, Vienna University of Technology, 2011.
[7]陳洪,馬欽,朱德海.基于 unity3d的交互式虛擬農(nóng)業(yè)仿真平臺(tái)研究[J].農(nóng)機(jī)化研究,2012(3):49.