摘? 要: Unity3D引擎是虛擬現(xiàn)實(shí)的主要開(kāi)發(fā)工具之一。結(jié)合高職院校“Unity3D開(kāi)發(fā)入門(mén)”的課程特點(diǎn)和實(shí)際教學(xué)中的問(wèn)題,遵循項(xiàng)目式教學(xué)原則,設(shè)計(jì)和開(kāi)發(fā)了一個(gè)“叢林尋寶”的Unity3D游戲項(xiàng)目,讓學(xué)生通過(guò)該項(xiàng)目的學(xué)習(xí)理解Unity3D引擎開(kāi)發(fā)原理,循序漸進(jìn)地掌握完整的Unity3D項(xiàng)目開(kāi)發(fā)的流程,為相關(guān)課程教學(xué)活動(dòng)的開(kāi)展提供借鑒。
關(guān)鍵詞: Unity3D; 虛擬現(xiàn)實(shí); 項(xiàng)目式教學(xué); 游戲項(xiàng)目
中圖分類(lèi)號(hào):TP391.9;G712? ? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A? ? ?文章編號(hào):1006-8228(2023)06-153-04
Design and implementation of a Unity3D development teaching project
Chen Xiaohong
(Department of Printing and Packaging, Shanghai Publishing and Printing College, Shanghai 200093, China)
Abstract: Unity3D engine is one of the main development tools of virtual reality. Combined with the course characteristics and the problems in practical teaching of "Introduction to Unity3D Development" in higher vocational colleges, a Unity3D teaching project of "Jungle Treasure Hunting" is designed and developed following the principle of project-based teaching. Students can learn and understand the principle of Unity3D engine development and master the complete Unity3D project development process step by step through the study of this project. It provides a reference for the teaching activities of related courses.
Key words: Unity3D; virtual reality; project-based teaching; game project
0 引言
虛擬現(xiàn)實(shí)技術(shù)(Virtual Reality即VR),是20世紀(jì)發(fā)展起來(lái)的一項(xiàng)全新的實(shí)用技術(shù),VR產(chǎn)業(yè)的迅猛發(fā)展,相關(guān)專(zhuān)業(yè)人才的缺口日益擴(kuò)大[1]。至2022年全國(guó)開(kāi)設(shè)“虛擬現(xiàn)實(shí)技術(shù)應(yīng)用”專(zhuān)業(yè)的高等職業(yè)院校已有近200所。對(duì)于這個(gè)創(chuàng)新性強(qiáng)、多學(xué)科交叉的新專(zhuān)業(yè),學(xué)校在師資建設(shè)、課程體系構(gòu)建、課程資源建設(shè)等各方面均面臨巨大的挑戰(zhàn)[2]。
1 “Unity3D開(kāi)發(fā)入門(mén)”課程教學(xué)分析
“Unity3D開(kāi)發(fā)入門(mén)”是VR技術(shù)人才培養(yǎng)的一門(mén)專(zhuān)業(yè)核心課程,課程的總體目標(biāo)是培養(yǎng)學(xué)生利用Unity3D引擎開(kāi)發(fā)游戲等虛擬現(xiàn)實(shí)應(yīng)用項(xiàng)目的能力。Unity3D引擎的功能強(qiáng)大,組件和參數(shù)設(shè)置不僅數(shù)量繁多也比較復(fù)雜,課程教學(xué)面臨較大困難,相關(guān)課程教學(xué)資源和教材的開(kāi)發(fā)也較滯后,缺乏可以借鑒的教學(xué)經(jīng)驗(yàn)。以學(xué)生為主體的項(xiàng)目式教學(xué),強(qiáng)調(diào)讓學(xué)生通過(guò)理論指導(dǎo)實(shí)踐、在實(shí)踐中深化對(duì)理論知識(shí)的理解。項(xiàng)目式教學(xué)的重點(diǎn)是教學(xué)項(xiàng)目的設(shè)計(jì),教學(xué)項(xiàng)目的選取與學(xué)生的崗位能力要求是否匹配,直接影響了教學(xué)效果[3]。本課程讓學(xué)生通過(guò)完成一個(gè)“叢林尋寶”Unity3D項(xiàng)目的分析、設(shè)計(jì)和開(kāi)發(fā)的過(guò)程,理解Unity3D引擎開(kāi)發(fā)原理,掌握完整的項(xiàng)目開(kāi)發(fā)流程,達(dá)到課程的教學(xué)目標(biāo)。
2 “叢林尋寶”教學(xué)項(xiàng)目的設(shè)計(jì)
2.1 項(xiàng)目策劃
“叢林尋寶”項(xiàng)目在實(shí)際教學(xué)中打破了學(xué)科知識(shí)體系次序,教學(xué)內(nèi)容被分解為若干個(gè)任務(wù)點(diǎn),涵蓋了Unity3D引擎的基本操作、地形系統(tǒng)、光照系統(tǒng)、粒子系統(tǒng)、動(dòng)畫(huà)系統(tǒng)、導(dǎo)航系統(tǒng)、物理系統(tǒng)、腳本開(kāi)發(fā)、UI界面系統(tǒng)等大部分內(nèi)容模塊。從主角簡(jiǎn)單漫游過(guò)渡到游戲的交互,從單一的功能實(shí)現(xiàn)過(guò)渡到項(xiàng)目的綜合優(yōu)化,讓學(xué)生在實(shí)現(xiàn)游戲基本功能的基礎(chǔ)上,學(xué)會(huì)對(duì)項(xiàng)目進(jìn)行個(gè)性化的拓展[4],實(shí)現(xiàn)學(xué)生知識(shí)水平與實(shí)踐能力的同步提升。
“叢林尋寶”項(xiàng)目設(shè)計(jì)的總體思路是:玩家控制游戲主角跑動(dòng),在規(guī)定的時(shí)間內(nèi)主角撿拾寶石取得設(shè)定的積分值,游戲勝利;但途中會(huì)遭遇敵人的襲擊,一旦主角血量耗盡,游戲失敗。具體游戲規(guī)則如下。
⑴ 運(yùn)行游戲進(jìn)入開(kāi)始界面,可以查看游戲的說(shuō)明文字,點(diǎn)擊“開(kāi)始游戲”按鈕,進(jìn)入游戲場(chǎng)景,場(chǎng)景上方會(huì)顯示當(dāng)前的積分、主角的血量進(jìn)度條、倒計(jì)時(shí)。
⑵ 玩家單擊地面,主角會(huì)朝點(diǎn)擊的位置前進(jìn),主攝像機(jī)也會(huì)跟隨移動(dòng),使玩家始終保持適當(dāng)?shù)囊曇胺秶?。主角在行進(jìn)中尋找掩埋在場(chǎng)景各處的寶石,觸碰到寶石會(huì)取得相應(yīng)的積分,積分達(dá)到設(shè)定值,會(huì)出現(xiàn)“游戲勝利”的提示。
⑶ 主角在行進(jìn)中如遭遇敵人,玩家右擊敵人,可以從攝像機(jī)位置朝敵人發(fā)射弓箭,敵人中箭會(huì)死亡,并播放音效。
⑷ 主角在行進(jìn)中如果接近敵人,會(huì)遭到敵人的襲擊,主角血量會(huì)相應(yīng)的減少,如果血量減到零,或者倒計(jì)時(shí)為零,會(huì)出現(xiàn)“游戲失敗”的提示。
2.2 主要功能模塊設(shè)計(jì)
系統(tǒng)功能模式用來(lái)控制整個(gè)項(xiàng)目的運(yùn)行。根據(jù)游戲規(guī)則,本項(xiàng)目中的系統(tǒng)功能有:開(kāi)始游戲、計(jì)時(shí)控制、積分顯示、血量顯示、游戲成功、游戲失敗、重新開(kāi)始、背景音樂(lè)、退出游戲。如圖1所示。
該項(xiàng)目主要的游戲物體有主角、敵人、寶石以及主攝像機(jī)。游戲圍繞著這幾個(gè)主要物體來(lái)設(shè)計(jì),其中主角和敵人的功能模塊如圖2所示。游戲主角的功能模塊有移動(dòng)控制、撿拾寶石、射擊敵人、血量控制、積分控制。游戲中敵人的功能模塊有移動(dòng)邏輯、攻擊邏輯、死亡控制、音效控制。寶石的功能模塊僅有被撿拾后銷(xiāo)毀,主攝像機(jī)的功能模塊主要有跟隨主角。
3 “叢林尋寶”教學(xué)項(xiàng)目的實(shí)現(xiàn)
3.1 場(chǎng)景設(shè)計(jì)與搭建
本項(xiàng)目中的游戲場(chǎng)景從創(chuàng)建地形開(kāi)始,包括利用地形工具創(chuàng)建高山、湖泊、盆地、花、草、樹(shù)、天空盒子、風(fēng)、霧,利用粒子系統(tǒng)和動(dòng)畫(huà)系統(tǒng)制作燃燒的火焰等。學(xué)生可以根據(jù)自己的設(shè)想,來(lái)創(chuàng)建游戲場(chǎng)景和布置光源,但要保證包含所有項(xiàng)目所需的元素。游戲中的寶石需要導(dǎo)入在3Dmax軟件中創(chuàng)建的模型,游戲中的寶石、敵人、弓箭使用的數(shù)量較多,都需要?jiǎng)?chuàng)建相應(yīng)的預(yù)制體。可以通過(guò)把場(chǎng)景中的物體拖進(jìn)project面板中來(lái)實(shí)現(xiàn)預(yù)制體的創(chuàng)建。
3.2 倒計(jì)時(shí)的實(shí)現(xiàn)
游戲開(kāi)始時(shí)系統(tǒng)開(kāi)啟倒計(jì)時(shí),游戲剩余的時(shí)間會(huì)顯示在游戲界面右上角,并實(shí)時(shí)更新。當(dāng)剩余時(shí)間為零時(shí),游戲停止。主要代碼如下:
void Time_Control() {
leftTime -= Time.deltaTime;
// leftTime為遞減的游戲剩余時(shí)間
Timetext.GetComponent
//剩余時(shí)間顯示
if (leftTime<=0) { Time.timeScale=0;
loseUI.SetActive(true); } } //游戲失敗
3.3 射線(xiàn)檢測(cè):主角的移動(dòng)與射擊控制
⑴ 主角的移動(dòng)。游戲規(guī)則中要求單擊地面時(shí)能夠引導(dǎo)主角的行進(jìn),并要對(duì)主角行動(dòng)的區(qū)域做合理的限定。Unity自帶的尋路即導(dǎo)航系統(tǒng)利用導(dǎo)航網(wǎng)格描述游戲世界的可行走表面,主角需要添加導(dǎo)航組件后才可以在導(dǎo)航網(wǎng)格中自動(dòng)繞開(kāi)障礙進(jìn)行尋路。鼠標(biāo)單擊地面進(jìn)行主角行動(dòng)的引導(dǎo)使用的是射線(xiàn)檢測(cè),Unity的物理引擎為我們提供了相關(guān)射線(xiàn)類(lèi)以及函數(shù)接口,我們需要自行調(diào)用這些API來(lái)實(shí)現(xiàn)一條射線(xiàn)[5]。射線(xiàn)與地面碰撞點(diǎn)作為導(dǎo)航網(wǎng)格代理組件的目標(biāo)地,當(dāng)前物體會(huì)自動(dòng)尋路到這個(gè)位置。在行走過(guò)程中,想要實(shí)現(xiàn)人物自然的走動(dòng)和轉(zhuǎn)向,還需要?jiǎng)?chuàng)建Animator Controller動(dòng)畫(huà)控制器,通過(guò)speed速度的不同值設(shè)置主角idle、walk、run三個(gè)動(dòng)畫(huà)剪輯的切換,如圖3所示。主要代碼如下:
if (Input.GetMouseButtonDown(0)) {
Ray ray=Camera.main.ScreenPointToRay
(Input.mousePosition);
RaycastHit hit;
if(Physics.Raycast(ray, out hit))
{ agent.SetDestination(hit.point); } //設(shè)置agent的目標(biāo)地
anim.SetFloat("speed", agent.velocity.magnitude);
//給speed參數(shù)賦值
⑵ 射擊控制。本項(xiàng)目中射擊敵人的弓箭是由攝像機(jī)位置發(fā)出來(lái)的,射擊腳本賦予主攝像機(jī)或者空物體,這里也運(yùn)用了射線(xiàn)檢測(cè)。鼠標(biāo)右擊的點(diǎn)就是弓箭射擊的目標(biāo),需要注意的是要使箭頭保持指向鼠標(biāo)點(diǎn)擊的方向,射擊的同時(shí)伴有音效。主要代碼如下:
if (Input.GetMouseButtonDown(1)) {
Ray cameraRay=Camera.main.ScreenPointToRay
(Input.mousePosition);
GameObject Arrow=Instantiate(arrow, cameraRay
.origin, arrow.transform.rotation) as GameObject;
//弓箭產(chǎn)生
Arrow.GetComponent
cameraRay.direction * speed; }
3.4 碰撞檢測(cè):撿拾寶石與互相攻擊
⑴ 主角撿拾寶石與被攻擊。主角撿拾寶石以及被敵人砍到的判斷都需要用到碰撞檢測(cè)。Unity中的兩個(gè)物體要想發(fā)生碰撞,必須依賴(lài)于自身的碰撞器組件,其中附帶碰撞檢測(cè)腳本的物體必須有剛體組件。Unity中的碰撞檢測(cè)主要有碰撞信息檢測(cè)和觸發(fā)信息檢測(cè)兩種接口函數(shù)[6],為了消除碰撞對(duì)主角的影響,在這里使用觸發(fā)信息檢測(cè)中的OnTriggerEnter函數(shù),來(lái)檢測(cè)物體的名稱(chēng)或標(biāo)簽。當(dāng)碰撞到寶石(標(biāo)簽為diamond),積分變量score相應(yīng)自增,當(dāng)碰撞到敵人的武器(名稱(chēng)為weapon),血量相應(yīng)減少。用bloodvalue變量來(lái)代表界面中血條(Slider控件)的value值。主角撿拾寶石與被攻擊時(shí)的主要代碼如下:
void OnTriggerEnter(Collider other)
{ if (other.gameObject.tag == "diamond")
{ score+=2; } //積分自增
if (other.gameObject.name == "weapon")
{ GameManager.bloodvalue -=5; } }? //血量自減
⑵ 敵人被弓箭射擊。敵人被弓箭射擊與主角被敵人的武器攻擊類(lèi)似,不同的是敵人被弓箭射中之后有倒地死亡的動(dòng)畫(huà)播放,所以這里使用的是OnCollisionEnter碰撞信息檢測(cè)函數(shù)。主要代碼如下:
void OnCollisionEnter(Collision collisionInfo)
{ if (collisionInfo.gameObject.tag == "arrow")
{ isdead = true; } } //切換到死亡動(dòng)畫(huà)剪輯
3.5 敵人攻擊的邏輯
本項(xiàng)目初始設(shè)計(jì)中的敵人是隨機(jī)分布在場(chǎng)景各處,敵人有徘徊、跑動(dòng)、攻擊、死亡四個(gè)動(dòng)畫(huà)剪輯可以進(jìn)行切換,只有當(dāng)主角比較接近的時(shí)候,敵人才會(huì)朝主角的方向跑動(dòng),當(dāng)距離小于二米時(shí)就會(huì)近身砍殺,被弓箭射中會(huì)死亡。敵人進(jìn)行攻擊的主要代碼如下:
if (distance<2f) { this.transform.LookAt(player.transform);
animator.SetBool("isrun", false); //停止跑動(dòng)
animator.SetBool("ishit", true); }} //啟動(dòng)攻擊動(dòng)畫(huà)
3.6 攝像機(jī)跟隨
用Unity腳本來(lái)控制攝像機(jī)跟隨游戲元素。調(diào)整攝像機(jī)位置在主角上方合適的位置,讓攝像機(jī)與主角一直保持相同的距離,這樣就做到了攝像機(jī)一直跟隨主角移動(dòng),主要代碼如下:
void Start ()
{ offset = transform.position - player.position; }
void Update ()
{ transform.position = offset + player.position; }
3.7 UI制作與系統(tǒng)控制
⑴ UI界面的制作。Unity提供了一套很完整的圖形化界面引擎。本項(xiàng)目中將開(kāi)始界面、積分和血量顯示界面、游戲成功界面、游戲失敗界面分別設(shè)計(jì)為四個(gè)不同的Panel面板組件,用代碼來(lái)控制他們的顯示和隱藏。
⑵ 開(kāi)始游戲。初始是暫停狀態(tài),將Time.timeScale設(shè)為0或1可以很方便的將游戲進(jìn)度暫?;蜷_(kāi)啟。等待玩家點(diǎn)擊“開(kāi)始游戲”按鈕,游戲正式開(kāi)啟,主要代碼如下:
void Start() { Time.timeScale=0; }
public void readygo() { Time.timeScale=1;
readyUI.SetActive(false); } //隱藏準(zhǔn)備界面
⑶ 積分顯示與游戲勝利。主要代碼如下:
void iswin()
{ Scoretext.GetComponent
if (score>=100)
{ Time.timeScale=0; winUI.SetActive(true); } }
⑷ 血量顯示與游戲失敗。主要代碼如下:
void islose()
{ bloods.GetComponent
if (bloodvalue<=0)
{ Time.timeScale=0; loseUI.SetActive(true); } }
4 結(jié)束語(yǔ)
本項(xiàng)目作為Unity3D引擎開(kāi)發(fā)的教學(xué)項(xiàng)目,將多個(gè)知識(shí)點(diǎn)有機(jī)地融合在一起,難度也根據(jù)學(xué)生的知識(shí)儲(chǔ)備和認(rèn)知規(guī)律來(lái)確定。讓學(xué)生在項(xiàng)目實(shí)踐中掌握Unity3D的主要知識(shí)點(diǎn)和項(xiàng)目開(kāi)發(fā)流程,可以對(duì)教學(xué)項(xiàng)目做適度擴(kuò)展,在教學(xué)實(shí)踐中取得了較好的效果,在一定程度上彌補(bǔ)了課程教學(xué)資源的不足,也為相關(guān)課程的教學(xué)提供了借鑒。后續(xù)可以在實(shí)際教學(xué)中對(duì)此項(xiàng)目不斷進(jìn)行創(chuàng)新和迭代升級(jí),添加更多的功能模塊,如主角的爬高控制、變換場(chǎng)景、設(shè)置游戲等級(jí)、批量生產(chǎn)敵人等。既讓玩家具有更好的游戲體驗(yàn),也能讓學(xué)生進(jìn)行更深入的學(xué)習(xí)。
參考文獻(xiàn)(References):
[1] 中華人民共和國(guó)中央人民政府網(wǎng).中華人民共和國(guó)國(guó)民
經(jīng)濟(jì)和社會(huì)發(fā)展第十四個(gè)五年規(guī)劃和2035年遠(yuǎn)景目標(biāo)綱要[EB/OL].[2021-03-13].http://www.gov.cn/xinwen/2021-03/13/content_5592681.htm.
[2] 陳小紅,張銀巧.高職虛擬現(xiàn)實(shí)應(yīng)用技術(shù)專(zhuān)業(yè)課程體系構(gòu)建
研究[J].職業(yè)技術(shù),2021,20(10):99-103
[3] 周玉珍.基于項(xiàng)目式教學(xué)培養(yǎng)中職學(xué)生高階思維能力的
研究與實(shí)踐[D].碩士,貴州師范大學(xué),2020
[4] 汪秀珍,段俊霞.SolidWorks三維設(shè)計(jì)課程的項(xiàng)目式教學(xué)
實(shí)踐[J].武漢工程職業(yè)技術(shù)學(xué)院學(xué)報(bào),2021,33(4):94-96
[5] 曹曉明.Unity3D游戲設(shè)計(jì)與開(kāi)發(fā)[M].北京:清華大學(xué)出版
社,2019
[6] 劉國(guó)柱.Unity3D/2D游戲開(kāi)發(fā)從0到1(第二版)[M].北京:
電子工業(yè)出版社,2018