董健
摘? 要:隨著Android移動(dòng)操作系統(tǒng)的迅速普及,針對(duì)Android平臺(tái)游戲的移植開(kāi)發(fā)需求日益增多。用平面設(shè)計(jì)軟件構(gòu)建虛擬場(chǎng)景和運(yùn)動(dòng)單元,在Unity3D引擎中進(jìn)行模塊封裝、數(shù)據(jù)處理和交互控制,采用盒狀碰撞檢測(cè)機(jī)制及對(duì)象池的數(shù)據(jù)管理模式,實(shí)現(xiàn)了自動(dòng)射擊、關(guān)卡切換、視景特效及各種實(shí)體的動(dòng)態(tài)效果,完成了一款手機(jī)射擊類(lèi)游戲。最后,實(shí)現(xiàn)游戲向Android手機(jī)的移植,游戲基本功能完善,運(yùn)行流暢。
關(guān)鍵詞:碰撞檢測(cè);Unity3D;手機(jī)游戲;Android
中圖分類(lèi)號(hào):TP311.52?????????? 文獻(xiàn)標(biāo)識(shí)碼:A
1?? 引言(Introduction)
信息化時(shí)代,智能手機(jī)等移動(dòng)終端對(duì)人們來(lái)說(shuō)已經(jīng)不是一個(gè)陌生的詞,因其強(qiáng)大的功能而越來(lái)越受人們的青睞。智能手機(jī)不再像過(guò)去的老式機(jī)一樣只能簡(jiǎn)單地接聽(tīng)電話和收發(fā)短信了,而是更能迎合眾多用戶(hù)的需求,成為更多手機(jī)用戶(hù)在工作、學(xué)習(xí)之余的一部方便靈巧、便于攜帶的休閑娛樂(lè)的移動(dòng)設(shè)備[1]。智能手機(jī)擁有如此強(qiáng)大的功能,都是源于其完善的系統(tǒng)平臺(tái),其中Android系統(tǒng)平臺(tái)就是其一,它因其良好的開(kāi)放性而被很多手機(jī)廠商使用,在市場(chǎng)上占有相當(dāng)高的比率?;贏ndroid平臺(tái)的應(yīng)用中,游戲因其擁有強(qiáng)大的交互性、娛樂(lè)性以及能隨時(shí)隨地進(jìn)行游戲的便利性而被人們所喜愛(ài),讓開(kāi)發(fā)者看到了手機(jī)游戲在Android平臺(tái)上的巨大的發(fā)展空間。
2?? 游戲功能分析(The game features analysis)
射擊類(lèi)游戲因其包含明顯的動(dòng)作游戲的特征,是動(dòng)作游戲中的一類(lèi),其操作簡(jiǎn)單、易懂,是一類(lèi)比較熱門(mén)的游戲。該應(yīng)用主要是通過(guò)Unity游戲引擎設(shè)計(jì)的一款適合于各階層人士的射擊類(lèi)游戲并移植到Android移動(dòng)平臺(tái)。對(duì)游戲功能進(jìn)行分析時(shí),應(yīng)集中注意要“做什么”而不是“怎么做”。通過(guò)對(duì)游戲的分析,根據(jù)游戲目標(biāo)功能的用例圖分析得到游戲的整體框架圖,如圖1所示。
圖1 游戲框架結(jié)構(gòu)圖
Fig.1 Game framework structure
3?? 游戲功能模塊的實(shí)現(xiàn)(Realization of the game
function module)
3.1?? 游戲場(chǎng)景
就射擊類(lèi)游戲來(lái)講,游戲的場(chǎng)景一般都會(huì)很大,因此無(wú)法在游戲的界面上完全顯示出來(lái),所以要給游戲的主界面背景添加一個(gè)UV動(dòng)畫(huà)。游戲中可以看到玩家控制的主角在不停地移動(dòng),而游戲背景總是在向下移動(dòng),讓玩家感覺(jué)整個(gè)畫(huà)面都在移動(dòng),呈現(xiàn)一種動(dòng)態(tài)的視覺(jué)效果。
動(dòng)態(tài)背景創(chuàng)建的原理就是將背景用一張圖片進(jìn)行循環(huán)滾動(dòng),從而形成一個(gè)動(dòng)畫(huà)的過(guò)程[2]。為了實(shí)現(xiàn)背景的循環(huán)滾動(dòng),則需得選擇Loop,將其設(shè)為循環(huán)播放模式。
3.2?? 主角管理的實(shí)現(xiàn)
在游戲中,主角有循環(huán)移動(dòng)/具備生命值/可以發(fā)射子彈/尾部火焰效果等功能,在設(shè)計(jì)時(shí)建立一個(gè)Player類(lèi),讓它與主角關(guān)聯(lián),Player類(lèi)中提供了一個(gè)Update函數(shù),這個(gè)函數(shù)在程序運(yùn)行時(shí),每幀都會(huì)被調(diào)用,因此,在這個(gè)函數(shù)中添加主角移動(dòng)的部分代碼:
if(Input.GetKey(KeyCode.UpArrow)){movev-=m_speed*Time.deltaTime;} //上移
if(Input.GetKey(KeyCode.DownArrow)){ movev+=m_speed*Time.deltaTime;}//下移
if(Input.GetKey(KeyCode.LeftArrow)){moveh+=m_speed*Time.deltaTime;}//左移
if(Input.GetKey(KeyCode.RightArrow)){moveh-=m_speed*Time.deltaTime;}//右移
this.m_transform.Translate(new Vector3(moveh,0,
movev));//移動(dòng)
…………………………………………
在Player類(lèi)中定義一個(gè)enum(枚舉)狀態(tài),包含飛機(jī)的三種狀態(tài):Playing、Explosion、Invisible。再在子線程方法DestroyPlayer()中實(shí)現(xiàn)飛機(jī)被擊中或與敵機(jī)發(fā)生碰撞后,飛機(jī)退出游戲窗口底部,然后再?gòu)挠螒虼翱诘撞糠祷氐接螒蚪缑?,且閃爍一段時(shí)間才能被子彈擊中的功能。
3.3?? 敵人管理的實(shí)現(xiàn)
敵機(jī)的類(lèi)型主要分為三類(lèi),具體類(lèi)型如圖2所示。
圖2 敵機(jī)類(lèi)型說(shuō)明圖
Fig.2 Description of enemy plane type
為了能夠不停的制造新的敵人,則需要?jiǎng)?chuàng)建敵人生成器。創(chuàng)建一個(gè)EnemySpawn腳本,為Update方法添加如下代碼:
m_timer-=Time.deltaTime;
if (m_timer<;=0){
m_timer=Random.value*15.0f;?? //在5~15s之間隨機(jī)生成一個(gè)敵人
if (m_timer<;5)
m_timer=5;?????? //實(shí)例化敵人的位置
Instantiate (m_enemy,m_transform.position,Quaternion.identity); }endprint
3.4?? 碰撞檢測(cè)的實(shí)現(xiàn)
射擊游戲中,為了判斷前方是否有障礙物和子彈是否擊中對(duì)方,就需要對(duì)兩個(gè)物體進(jìn)行碰撞檢測(cè),然后根據(jù)檢驗(yàn)的結(jié)果采取相應(yīng)的方法進(jìn)行處理。游戲中的碰撞檢測(cè)主要存在于主角與敵機(jī)、主角與敵機(jī)子彈、敵機(jī)與主角子彈之間。而物體要發(fā)生碰撞檢測(cè),主動(dòng)運(yùn)行的對(duì)象就必須是剛體,因此,需要添加一個(gè)剛體組件。檢驗(yàn)碰撞通常有兩種方法OnCollision-Enter和OnTriggerEnter。應(yīng)用中采取的則是OnTriggerEnter方法[3]。檢測(cè)中需要使用如下方法設(shè)置敵人位置:
Destroy(this.gameObject);
EnemyScript
enemy=(EnemyScript)ontherObject.gameObject.GetComponent("EnemyScript");
enemy.SetPositionAndSpeed();//設(shè)置敵人出現(xiàn)的位置
4? 游戲的完成及測(cè)試(Completion and testing of the
game)
在游戲制作完成后,為了檢查游戲是否完整、能否達(dá)到預(yù)期的效果,則需要對(duì)其進(jìn)行調(diào)試和運(yùn)行,以發(fā)現(xiàn)游戲中可能有的不足并解決這些問(wèn)題。進(jìn)入游戲,按空格鍵,發(fā)射子彈;按上、下、左、右鍵,上、下、左、右移動(dòng);飛機(jī)在飛行中若吃到星星,則會(huì)獲得一定的分?jǐn)?shù)。若飛機(jī)撞到敵機(jī)或被敵機(jī)子彈集中,生命值會(huì)減一,當(dāng)生命值減到零時(shí),游戲失敗,進(jìn)入失敗界面。
經(jīng)過(guò)測(cè)試,游戲運(yùn)行效果符合預(yù)先設(shè)計(jì)的游戲總體效果,各個(gè)界面之間的切換也都正確。此外,還重點(diǎn)測(cè)試了游戲過(guò)程中其他功能的實(shí)現(xiàn),玩家控制的主角能正常移動(dòng)并發(fā)射子彈,在吃到星星后,也能獲得相應(yīng)的分?jǐn)?shù)。
5?? 結(jié)論(Conclusion)
游戲是以Unity游戲引擎為開(kāi)發(fā)平臺(tái),并最終實(shí)現(xiàn)向Android的移植。
在游戲的設(shè)計(jì)與開(kāi)發(fā)的整個(gè)過(guò)程中,由于對(duì)Unity和Android機(jī)制研究的還未深入,遇到過(guò)很多問(wèn)題,有技術(shù)方面的,有關(guān)于游戲模型方面的,有界面設(shè)計(jì)方面的,還有程序運(yùn)行時(shí)出現(xiàn)的各種異常,移植過(guò)程中軟件無(wú)法打開(kāi)、運(yùn)行等問(wèn)題。但是通過(guò)仔細(xì)研究Unity引擎及Android平臺(tái)的開(kāi)發(fā)方法,均得到解決,也為以后的繼續(xù)開(kāi)發(fā)提供基礎(chǔ)。
參考文獻(xiàn)(References)
[1] 段海朋,關(guān)振華.3DS Max 2010完全學(xué)習(xí)手冊(cè)[M].北京:清華大
學(xué)出版社,2010.
[2] 林深華,等.基于Android平臺(tái)Unity3D游戲設(shè)計(jì)與實(shí)現(xiàn)[J].企業(yè)
科技與發(fā)展,2013(10):40-42.
[3] 宋浩.基于虛擬現(xiàn)實(shí)過(guò)程中的碰撞檢測(cè)算法優(yōu)化的研究[J].科
技向?qū)В?013(03):152.
作者簡(jiǎn)介:
董? ?。?980-),男,碩士,講師.研究領(lǐng)域:多媒體信息處理.endprint
3.4?? 碰撞檢測(cè)的實(shí)現(xiàn)
射擊游戲中,為了判斷前方是否有障礙物和子彈是否擊中對(duì)方,就需要對(duì)兩個(gè)物體進(jìn)行碰撞檢測(cè),然后根據(jù)檢驗(yàn)的結(jié)果采取相應(yīng)的方法進(jìn)行處理。游戲中的碰撞檢測(cè)主要存在于主角與敵機(jī)、主角與敵機(jī)子彈、敵機(jī)與主角子彈之間。而物體要發(fā)生碰撞檢測(cè),主動(dòng)運(yùn)行的對(duì)象就必須是剛體,因此,需要添加一個(gè)剛體組件。檢驗(yàn)碰撞通常有兩種方法OnCollision-Enter和OnTriggerEnter。應(yīng)用中采取的則是OnTriggerEnter方法[3]。檢測(cè)中需要使用如下方法設(shè)置敵人位置:
Destroy(this.gameObject);
EnemyScript
enemy=(EnemyScript)ontherObject.gameObject.GetComponent("EnemyScript");
enemy.SetPositionAndSpeed();//設(shè)置敵人出現(xiàn)的位置
4? 游戲的完成及測(cè)試(Completion and testing of the
game)
在游戲制作完成后,為了檢查游戲是否完整、能否達(dá)到預(yù)期的效果,則需要對(duì)其進(jìn)行調(diào)試和運(yùn)行,以發(fā)現(xiàn)游戲中可能有的不足并解決這些問(wèn)題。進(jìn)入游戲,按空格鍵,發(fā)射子彈;按上、下、左、右鍵,上、下、左、右移動(dòng);飛機(jī)在飛行中若吃到星星,則會(huì)獲得一定的分?jǐn)?shù)。若飛機(jī)撞到敵機(jī)或被敵機(jī)子彈集中,生命值會(huì)減一,當(dāng)生命值減到零時(shí),游戲失敗,進(jìn)入失敗界面。
經(jīng)過(guò)測(cè)試,游戲運(yùn)行效果符合預(yù)先設(shè)計(jì)的游戲總體效果,各個(gè)界面之間的切換也都正確。此外,還重點(diǎn)測(cè)試了游戲過(guò)程中其他功能的實(shí)現(xiàn),玩家控制的主角能正常移動(dòng)并發(fā)射子彈,在吃到星星后,也能獲得相應(yīng)的分?jǐn)?shù)。
5?? 結(jié)論(Conclusion)
游戲是以Unity游戲引擎為開(kāi)發(fā)平臺(tái),并最終實(shí)現(xiàn)向Android的移植。
在游戲的設(shè)計(jì)與開(kāi)發(fā)的整個(gè)過(guò)程中,由于對(duì)Unity和Android機(jī)制研究的還未深入,遇到過(guò)很多問(wèn)題,有技術(shù)方面的,有關(guān)于游戲模型方面的,有界面設(shè)計(jì)方面的,還有程序運(yùn)行時(shí)出現(xiàn)的各種異常,移植過(guò)程中軟件無(wú)法打開(kāi)、運(yùn)行等問(wèn)題。但是通過(guò)仔細(xì)研究Unity引擎及Android平臺(tái)的開(kāi)發(fā)方法,均得到解決,也為以后的繼續(xù)開(kāi)發(fā)提供基礎(chǔ)。
參考文獻(xiàn)(References)
[1] 段海朋,關(guān)振華.3DS Max 2010完全學(xué)習(xí)手冊(cè)[M].北京:清華大
學(xué)出版社,2010.
[2] 林深華,等.基于Android平臺(tái)Unity3D游戲設(shè)計(jì)與實(shí)現(xiàn)[J].企業(yè)
科技與發(fā)展,2013(10):40-42.
[3] 宋浩.基于虛擬現(xiàn)實(shí)過(guò)程中的碰撞檢測(cè)算法優(yōu)化的研究[J].科
技向?qū)В?013(03):152.
作者簡(jiǎn)介:
董? 健(1980-),男,碩士,講師.研究領(lǐng)域:多媒體信息處理.endprint
3.4?? 碰撞檢測(cè)的實(shí)現(xiàn)
射擊游戲中,為了判斷前方是否有障礙物和子彈是否擊中對(duì)方,就需要對(duì)兩個(gè)物體進(jìn)行碰撞檢測(cè),然后根據(jù)檢驗(yàn)的結(jié)果采取相應(yīng)的方法進(jìn)行處理。游戲中的碰撞檢測(cè)主要存在于主角與敵機(jī)、主角與敵機(jī)子彈、敵機(jī)與主角子彈之間。而物體要發(fā)生碰撞檢測(cè),主動(dòng)運(yùn)行的對(duì)象就必須是剛體,因此,需要添加一個(gè)剛體組件。檢驗(yàn)碰撞通常有兩種方法OnCollision-Enter和OnTriggerEnter。應(yīng)用中采取的則是OnTriggerEnter方法[3]。檢測(cè)中需要使用如下方法設(shè)置敵人位置:
Destroy(this.gameObject);
EnemyScript
enemy=(EnemyScript)ontherObject.gameObject.GetComponent("EnemyScript");
enemy.SetPositionAndSpeed();//設(shè)置敵人出現(xiàn)的位置
4? 游戲的完成及測(cè)試(Completion and testing of the
game)
在游戲制作完成后,為了檢查游戲是否完整、能否達(dá)到預(yù)期的效果,則需要對(duì)其進(jìn)行調(diào)試和運(yùn)行,以發(fā)現(xiàn)游戲中可能有的不足并解決這些問(wèn)題。進(jìn)入游戲,按空格鍵,發(fā)射子彈;按上、下、左、右鍵,上、下、左、右移動(dòng);飛機(jī)在飛行中若吃到星星,則會(huì)獲得一定的分?jǐn)?shù)。若飛機(jī)撞到敵機(jī)或被敵機(jī)子彈集中,生命值會(huì)減一,當(dāng)生命值減到零時(shí),游戲失敗,進(jìn)入失敗界面。
經(jīng)過(guò)測(cè)試,游戲運(yùn)行效果符合預(yù)先設(shè)計(jì)的游戲總體效果,各個(gè)界面之間的切換也都正確。此外,還重點(diǎn)測(cè)試了游戲過(guò)程中其他功能的實(shí)現(xiàn),玩家控制的主角能正常移動(dòng)并發(fā)射子彈,在吃到星星后,也能獲得相應(yīng)的分?jǐn)?shù)。
5?? 結(jié)論(Conclusion)
游戲是以Unity游戲引擎為開(kāi)發(fā)平臺(tái),并最終實(shí)現(xiàn)向Android的移植。
在游戲的設(shè)計(jì)與開(kāi)發(fā)的整個(gè)過(guò)程中,由于對(duì)Unity和Android機(jī)制研究的還未深入,遇到過(guò)很多問(wèn)題,有技術(shù)方面的,有關(guān)于游戲模型方面的,有界面設(shè)計(jì)方面的,還有程序運(yùn)行時(shí)出現(xiàn)的各種異常,移植過(guò)程中軟件無(wú)法打開(kāi)、運(yùn)行等問(wèn)題。但是通過(guò)仔細(xì)研究Unity引擎及Android平臺(tái)的開(kāi)發(fā)方法,均得到解決,也為以后的繼續(xù)開(kāi)發(fā)提供基礎(chǔ)。
參考文獻(xiàn)(References)
[1] 段海朋,關(guān)振華.3DS Max 2010完全學(xué)習(xí)手冊(cè)[M].北京:清華大
學(xué)出版社,2010.
[2] 林深華,等.基于Android平臺(tái)Unity3D游戲設(shè)計(jì)與實(shí)現(xiàn)[J].企業(yè)
科技與發(fā)展,2013(10):40-42.
[3] 宋浩.基于虛擬現(xiàn)實(shí)過(guò)程中的碰撞檢測(cè)算法優(yōu)化的研究[J].科
技向?qū)В?013(03):152.
作者簡(jiǎn)介:
董? ?。?980-),男,碩士,講師.研究領(lǐng)域:多媒體信息處理.endprint