摘 要
介紹了一款基于unity開(kāi)發(fā)的輕量級(jí)手機(jī)游戲開(kāi)發(fā)過(guò)程,探討在Unity3D平臺(tái)下完成游戲關(guān)卡,場(chǎng)景以及功能模塊的設(shè)計(jì)過(guò)程,提出實(shí)現(xiàn)Unity3D手機(jī)游戲開(kāi)發(fā)采用的核心技術(shù)及核心代碼,可供開(kāi)發(fā)人員提供解決游戲開(kāi)發(fā)問(wèn)題的思路。
【關(guān)鍵詞】Unity3d Vector 手機(jī)游戲
1 引言
Unity3d是由Unity Technologies 公司開(kāi)發(fā)的跨平臺(tái)專(zhuān)業(yè)游戲引擎,是如今市場(chǎng)上一款全面整合的專(zhuān)業(yè)游戲引擎,軟件其編輯器可運(yùn)行在Windows 和Mac OS X雙系統(tǒng)下,利用其所開(kāi)發(fā)的游戲可發(fā)布至Windows、Mac、Wii、iphone、Windows phone 8和Android平臺(tái)。Unity游戲引擎作為一款跨平臺(tái)的游戲開(kāi)發(fā)工具,其具有開(kāi)發(fā)快速,易上手,跨平臺(tái)發(fā)布,可擴(kuò)展性強(qiáng)等特點(diǎn)。這里論述開(kāi)發(fā)了一款3D格斗類(lèi)手機(jī)游戲的過(guò)程,著重解決了屏幕自適應(yīng),屏幕滑動(dòng)模式,美術(shù)資源管理,手柄控制,角色動(dòng)畫(huà)狀態(tài)機(jī),敵人AI交互設(shè)計(jì),動(dòng)態(tài)數(shù)據(jù)讀取刷新,攻擊技能成長(zhǎng)系統(tǒng)設(shè)計(jì),場(chǎng)景七大攻擊技能釋放與控制,單機(jī)副本以及廂房挑戰(zhàn)關(guān)卡設(shè)計(jì)與實(shí)現(xiàn)等一系列問(wèn)題,對(duì)其它類(lèi)型的游戲開(kāi)發(fā)具有一定的借鑒與學(xué)習(xí)參考的意義。
2 手機(jī)游戲開(kāi)發(fā)關(guān)鍵技術(shù)
基于Unity的手機(jī)游戲開(kāi)發(fā),手機(jī)游戲主要包含主屏幕滑屏,界面刷新,技能成長(zhǎng)系統(tǒng),虛擬桿控制,場(chǎng)景技能釋放,怪物AI設(shè)計(jì)等多大功能模塊設(shè)計(jì),實(shí)現(xiàn)并開(kāi)發(fā)游戲,設(shè)計(jì)主要的關(guān)鍵技術(shù)及過(guò)程有:
(1)通過(guò)數(shù)值計(jì)算,設(shè)計(jì)屏幕自適應(yīng)技術(shù)。
(2)初步研究實(shí)現(xiàn)PC端和手機(jī)端的觸屏控制,通過(guò)Touch類(lèi)和Input類(lèi)設(shè)計(jì)實(shí)現(xiàn)在不同平臺(tái)的“十字架”滑屏技術(shù)。
(3)通過(guò)把二維空間向量轉(zhuǎn)三維空間向量的方法,實(shí)現(xiàn)游戲手柄的功能控制技術(shù)。
(4)使用Mecanim動(dòng)畫(huà)系統(tǒng)設(shè)計(jì)玩家的移動(dòng)狀態(tài)機(jī),結(jié)合狀態(tài)機(jī)設(shè)計(jì)手機(jī)手柄控制玩家移動(dòng)技術(shù)。
(5)設(shè)計(jì)玩家七大攻擊技能模塊的成長(zhǎng)技能系統(tǒng),配置游戲道具數(shù)據(jù)創(chuàng)建XML表,讀取XML表信息使用字典來(lái)刷新統(tǒng)一管理游戲數(shù)據(jù)技術(shù)。
(6)完成UI界面設(shè)計(jì)排版,打包做成預(yù)制件,控制游戲界面的加載和銷(xiāo)毀技術(shù)。
(7)設(shè)計(jì)實(shí)現(xiàn)三類(lèi)敵人AI(蜘蛛,機(jī)器人,大boss)人工智能,使用大量的射線碰撞檢測(cè),向量(例如點(diǎn)乘,叉乘)知識(shí)完成交互式攻擊技術(shù)。
(8)實(shí)例化各類(lèi)技能(火系,水系,千里眼,螺旋轉(zhuǎn),保護(hù),法寶,瞬移),通過(guò)協(xié)程,視線追逐算法控制技能的移動(dòng)方式以及攻擊方式技術(shù)。
(9)完成游戲的C#腳本的邏輯算法實(shí)現(xiàn),內(nèi)容涉及到游戲玩法,關(guān)卡邏輯,數(shù)據(jù)刷新,怪物的人工智能。
3 手機(jī)游戲客戶端的設(shè)計(jì)與實(shí)現(xiàn)過(guò)程
3.1 手機(jī)滑屏控制模式的實(shí)現(xiàn)
實(shí)現(xiàn)在PC端與手機(jī)端的滑屏效果,通過(guò)屏幕上下左右中間的虛擬十字架的坐標(biāo),控制移動(dòng)和定位相機(jī)位置,屏幕滑動(dòng)的運(yùn)動(dòng)方式分為兩部分:
(1)手指(鼠標(biāo))拖動(dòng)相機(jī)帶動(dòng)屏幕移動(dòng)。
(2)當(dāng)移動(dòng)的距離超過(guò)一定距離時(shí)候同時(shí)釋放手指(鼠標(biāo))相機(jī)將會(huì)自動(dòng)彈簧式的移動(dòng)到定位目的地,實(shí)現(xiàn)了上下左右滑動(dòng)屏幕。手機(jī)上下左右滑動(dòng)屏幕可以攝像機(jī)照射的位置彈簧式的移動(dòng)到指定位置。
算法分析
//當(dāng)鼠標(biāo)按下的時(shí)候
if(input.GetMouseButtonDown)
//記錄手指按下的位置
posDown = input.GetMouseButtonDown
//當(dāng)鼠標(biāo)按住的時(shí)候
if(input.GetMouseButton)
//判斷是水平滑動(dòng)還是左右滑動(dòng) , System.Math.Abs()獲取絕對(duì)值;
xValue = System.Math.Abs(input.MousePosition.x–posDown.x)
Value = System.Math.Abs(input.MousePosition.y–posDown.y)
//左右移動(dòng)的值大于上下移動(dòng)的值
if(xValue>yValue)
//左右水平滑動(dòng),固定射線機(jī)位置的垂直分量的值
//左右移動(dòng)的值小于上下移動(dòng)的值
elseif(xValue //上下垂直滑動(dòng),固定射線機(jī)位置的水平分量的值 //鼠標(biāo)抬起時(shí)刻 if(input.GetMouseButtonUp) //判斷鼠標(biāo)滑動(dòng)的值,有沒(méi)有超過(guò)的滑動(dòng)sliderValue if(xValue>sliderValue) //使射線機(jī)移動(dòng)指定位置 else //滑動(dòng)值太小,使攝像機(jī)移動(dòng)起始位置 3.2 游戲虛擬桿控制的實(shí)現(xiàn) 通過(guò)繼承NGUI中Drawdropitem類(lèi)實(shí)現(xiàn)鼠標(biāo)和手指可拖動(dòng)圓球狀態(tài)。根據(jù)虛擬桿的大小,設(shè)計(jì)限制虛擬桿的移動(dòng)圓球移動(dòng)范圍離中心點(diǎn)的距離小于100,當(dāng)距離大于100時(shí),限制距離為100。接著中心圓球的位置到虛擬桿中心位置的向量方向控制玩家角色的移動(dòng)方向,緊接著根據(jù)中心可移動(dòng)圓球離虛擬桿中心位置的距離長(zhǎng)度控制玩家角色的移動(dòng)速度,整個(gè)二維平面的虛擬桿360度旋轉(zhuǎn)移動(dòng),映射到玩家在三維空間的移動(dòng)。最后根據(jù)鼠標(biāo)和手指的狀態(tài)控制中心圓球的初始狀態(tài),當(dāng)鼠標(biāo)和手指離開(kāi)時(shí)候,中心圓球?qū)?huì)重新回歸虛擬桿的中心位置,此時(shí)玩家將處于休閑不移動(dòng)的狀態(tài),當(dāng)鼠標(biāo)或者手指拖動(dòng)中心圓球時(shí)候,將啟動(dòng)控制玩家角色的移動(dòng)狀態(tài)。 算法分析
//拖動(dòng)小球,限制可拖動(dòng)最大距離 //繼承NGUI的DrawDropItem類(lèi)可實(shí)現(xiàn)拖動(dòng)一個(gè)UI控件(小球) //記錄小球的位置//使用input.MousePositon記錄小球位置posBall//計(jì)算小球到底盤(pán)的向量,記錄向量方向和大小。
vec = posBall–posOriginal;//記錄的方向映射到三維空間(x,y)平面上,360度控制角色的方向
Vector3 playerPos = new Vector3();
playerPos = Player.GetCompoent
3.3 游戲敵人AI功能的實(shí)現(xiàn)
蜘蛛的人工智能控制是由Unity中物體的觸碰器觸發(fā),每個(gè)蜘蛛都有一個(gè)立方體觸碰器,玩家如果進(jìn)入這個(gè)范圍,將由OnColliderEnter()觸發(fā)進(jìn)入函數(shù),蜘蛛將進(jìn)入攻擊狀態(tài),采取視線追逐算法調(diào)整蜘蛛的朝向和移動(dòng),當(dāng)距離玩家到一定距離的時(shí)候就會(huì)釋放攻擊技能。相反,如果玩家不在攻擊范圍,或者逃離到攻擊范圍之外,將由OnColliderExit()觸發(fā)離開(kāi)函數(shù),此時(shí)蜘蛛將回歸到休閑巡邏狀態(tài)。
機(jī)器人AI是比蜘蛛更具智能,機(jī)器人具有巡邏狀態(tài),只不過(guò)加入了模糊概率算法,提高了不確定性,增加了機(jī)器人的智能的真實(shí)性。機(jī)器人將在一個(gè)圓圈范圍巡邏,變走變看周?chē)h(huán)境的變化,判斷是否有玩家進(jìn)入攻擊范圍。當(dāng)玩家進(jìn)入攻擊范圍,且玩家是在機(jī)器人的視線前方,此時(shí)機(jī)器人將采取開(kāi)槍的技能。當(dāng)玩家進(jìn)入攻擊范圍,但玩家在機(jī)器人的視線后方,此時(shí)判斷玩家與機(jī)器人之間的距離,如果足夠近的話,機(jī)器人將會(huì)發(fā)現(xiàn)玩家采取掉頭攻擊,如果距離比較遠(yuǎn),那么玩家不會(huì)被機(jī)器人發(fā)現(xiàn)可以蒙混過(guò)關(guān)。
3.4 游戲動(dòng)畫(huà)系統(tǒng)技術(shù)分析
unity引擎有自帶的動(dòng)畫(huà)系統(tǒng),Mecanim動(dòng)畫(huà)系統(tǒng),通過(guò)狀態(tài)機(jī)來(lái)控制角色的移動(dòng)。邏輯及算法分析:
//當(dāng)虛擬桿啟動(dòng)時(shí),角色開(kāi)啟移動(dòng)動(dòng)畫(huà)狀態(tài)
//獲取1.4.3的vec方向和大小,賦值給玩家
Vector3 playerPos = new Vector3();
playerPos = Player.GetCompoent
playerPos.forward = vec.normarlized; playerAni.SetBool(runBool,true); playerAni.SetFloat(speedFloat,speedRate);//當(dāng)虛擬桿關(guān)閉時(shí),角色動(dòng)畫(huà)恢復(fù)休閑狀態(tài)
Animator playerAni = player.getcomponent
playerAni.SetBool(idleBool,true);
//當(dāng)點(diǎn)擊釋放技能時(shí),動(dòng)畫(huà)狀態(tài)跳轉(zhuǎn)到釋放技能狀態(tài)的動(dòng)畫(huà)
playerAni.SetBool(skillBool,true);
3.5 游戲物理引擎射線技術(shù)分析
射線檢測(cè)主要是從某個(gè)物體(攝像機(jī)),發(fā)出一條射線,然后進(jìn)行判斷射線是否碰撞到指定物體,然后在相對(duì)于的接口函數(shù)編寫(xiě)出相應(yīng)的反應(yīng)事件,算法分析:
//定義一條從攝像機(jī)發(fā)射到鼠標(biāo)點(diǎn)擊位置的射線
Ray ray = Camera.ScreenPointToRay(Input.MousePosition); //使用RaycastHit hit來(lái)存儲(chǔ)碰撞物體信息 //如果發(fā)出射線碰撞成功 if(Physics.RayCast(Ray,outhit))
3.6 游戲技能釋放分析
3.6.1 火系技能
實(shí)例化出來(lái)的位置是處于敵人的上方,利用協(xié)程IEnumerator的程序知識(shí)控制其實(shí)例化出來(lái)的順序,前后一共實(shí)例化八個(gè)火炮,當(dāng)其被實(shí)例化出來(lái)的時(shí)候,火炮將自動(dòng)尋找靠近玩家的敵人進(jìn)行攻擊,采取的攻擊方式是視線追逐。
3.6.2 水系技能
實(shí)例化的位置比較講究,因?yàn)槠浞较蚝臀恢每傄嫦驍橙耍云鋵?shí)例化的位置應(yīng)該處于玩家的上方,而且四個(gè)水系技能炮所處的平面是與玩家和敵人的直線垂直,實(shí)例化之前需要先計(jì)算從敵人到玩家的方向向量的垂直向量,得出垂直的單位向量后再乘以距離大小,得出火系技能的左右距離,最后加上向上的方向向量的距離就可以得出實(shí)例化位置,實(shí)例化出來(lái)將采取視線追逐的方式對(duì)敵人進(jìn)行追擊。
3.6.3 瞬移技能
在釋放技能的時(shí)候,玩家將會(huì)向前方發(fā)射一條被規(guī)定好距離的射線來(lái)確定前方是否有物體,射線進(jìn)行碰撞檢測(cè),當(dāng)有碰撞到物體的時(shí),瞬移技能無(wú)法釋放,當(dāng)射線檢測(cè)不到有物體的時(shí)候,玩家可以向前瞬間移動(dòng),移動(dòng)方法是累加玩家自身的Forward向量。
3.6.4 千里眼技能
玩家一共有三種狀態(tài),正常的狀態(tài),千里眼狀態(tài),保護(hù)狀態(tài),啟動(dòng)此狀態(tài)時(shí)候,只需要切換玩家的狀態(tài)到千里眼的狀態(tài),然后改變手柄的控制,此時(shí)手柄的控制將會(huì)發(fā)生改變,第一控制的對(duì)象由玩家到攝像機(jī),移動(dòng)范圍由一個(gè)圓圈范圍到一個(gè)圓環(huán)范圍,也就是手柄的中心圓球其移動(dòng)的是50到100的可移動(dòng)范圍。而當(dāng)啟動(dòng)千里眼狀態(tài)時(shí),游戲界面將會(huì)增加一個(gè)控制攝像機(jī)前后左右移動(dòng)的界面。玩家可以變旋轉(zhuǎn)攝像機(jī)邊移動(dòng)攝像機(jī)的位置。
3.7 游戲數(shù)據(jù)配置與刷新的實(shí)現(xiàn)
游戲數(shù)據(jù)存儲(chǔ)在XML表中,而數(shù)據(jù)的提取刷新也是在XML表中進(jìn)行的,而提取出來(lái)的一條Item數(shù)據(jù)將被存儲(chǔ)在Dictionary字典里面,根據(jù)鍵對(duì)值的方式進(jìn)行讀取和存儲(chǔ)數(shù)據(jù),從而刷新游戲數(shù)據(jù)。
4 結(jié)束語(yǔ)
本文著重介紹了基于unity開(kāi)發(fā)的輕量級(jí)手機(jī)游戲包含主屏幕滑屏,界面刷新,技能成長(zhǎng)系統(tǒng),虛擬桿控制,場(chǎng)景技能釋放,怪物AI設(shè)計(jì)等多大功能模塊設(shè)計(jì)及采用的開(kāi)發(fā)技術(shù)算法分析,研究在Unity3D平臺(tái)下完成游戲關(guān)卡,場(chǎng)景以及功能模塊的設(shè)計(jì)過(guò)程,提出實(shí)現(xiàn)Unity3D手機(jī)游戲開(kāi)發(fā)采用的核心技術(shù)及核心代碼,以供游戲開(kāi)發(fā)技術(shù)人員提供解決游戲開(kāi)發(fā)問(wèn)題的一種新思路。
參考文獻(xiàn)
[1]游戲核心算法編程內(nèi)幕[M].北京希望電子出版社,2005.
[2]游戲發(fā)展現(xiàn)狀分析報(bào)告:86訊息網(wǎng).
[3]SIKI Unity教程:泰課網(wǎng).
[4]蠻牛游戲論壇:游戲蠻牛.
作者簡(jiǎn)介
陳雪梅(1978-),女,廣東省人,碩士學(xué)位。研究方向?yàn)橛?jì)算機(jī)程序設(shè)計(jì)、移動(dòng)開(kāi)發(fā)、數(shù)據(jù)庫(kù)設(shè)計(jì)。
作者單位
廣東技術(shù)師范學(xué)院 廣東省廣州市 510310