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