林昕
摘 要:目前,作為3D游戲開(kāi)發(fā)引擎和工具,Unity3D以其跨平臺(tái)和易用性等特性,被越來(lái)越多的公司所使用,并逐步成為開(kāi)發(fā)首選工具。本文對(duì)Unity3D工具的基本使用做簡(jiǎn)介,并通過(guò)構(gòu)建一個(gè)簡(jiǎn)單的3D游戲過(guò)程,介紹Unity3D在A(yíng)ndroid游戲開(kāi)發(fā)中的應(yīng)用,同時(shí)指出了該工具的廣闊應(yīng)用。
關(guān)鍵詞:Unity3D;Andoird;游戲開(kāi)發(fā)
一、引言
Unity3D是由Unity Technologies開(kāi)發(fā)的一個(gè)讓開(kāi)發(fā)者創(chuàng)建三維游戲、建筑可視化、實(shí)時(shí)三維動(dòng)畫(huà)等類(lèi)型互動(dòng)內(nèi)容的跨平臺(tái)的游戲開(kāi)發(fā)工具,是一個(gè)整合度很高的專(zhuān)業(yè)游戲引擎。Unity可運(yùn)行在Windows 和Mac OS X下,可發(fā)布游戲至Windows、Mac、Wii、iPhone和Android平臺(tái),支持Mac 和Windows的網(wǎng)頁(yè)瀏覽。由于Unity3D的跨平臺(tái)和易用性等特性被越來(lái)越多的游戲開(kāi)發(fā)公司所重視,并逐漸成為3D游戲開(kāi)發(fā)的首先工具。
二、Unity3D界面介紹
Unity3D的基本界面層次清晰,幾個(gè)窗口實(shí)現(xiàn)了全部的編輯功能。主界面如圖1所示:
場(chǎng)景面板:該面板為Unity3D的編輯面板或者說(shuō)是工作區(qū);開(kāi)發(fā)者可以將所有的模型、燈光、以及其他材質(zhì)對(duì)象拖放到當(dāng)前場(chǎng)景中,構(gòu)建游戲中所能呈現(xiàn)的景象。
動(dòng)畫(huà)面板:該面板可以呈現(xiàn)完整的動(dòng)畫(huà)效果。顯示的內(nèi)容取決于場(chǎng)景攝像機(jī)的設(shè)置。當(dāng)游戲在場(chǎng)景面板中編輯好后,點(diǎn)擊運(yùn)行按鈕,即可在動(dòng)畫(huà)面板中查看游戲的實(shí)際運(yùn)行效果。
■
項(xiàng)目面板:該面板主要功能是顯示該項(xiàng)目文件中的所有資源列表。除了模型、材質(zhì)、字體等,還包括該項(xiàng)目的各個(gè)場(chǎng)景文件。開(kāi)發(fā)者可以將游戲中使用到的所有資源導(dǎo)入到該面板中,使用時(shí)只要用鼠標(biāo)拖動(dòng)到場(chǎng)景面板即可。
層次面板:該面板主要功能是顯示放在場(chǎng)景面板中的所有的物體對(duì)象。該面板可以清楚查看在場(chǎng)景面板中出現(xiàn)的所有對(duì)象,很方便對(duì)場(chǎng)景中的對(duì)象進(jìn)行管理。
對(duì)象屬性欄:又叫檢視面板,該面板欄會(huì)呈現(xiàn)出任何對(duì)象的屬性和組件,包括三維坐標(biāo)、旋轉(zhuǎn)量、縮放大小、腳本的變量和對(duì)象等。
場(chǎng)景調(diào)整工具:可以改變?cè)诰庉嬤^(guò)程中的場(chǎng)景視角、物體世界坐標(biāo)和本地坐標(biāo)的更換、物體的法線(xiàn)中心的位置,以及物體在場(chǎng)景中的坐標(biāo)位置、縮放大小等。
三、接雞蛋游戲的制作流程
一款手機(jī)游戲的開(kāi)發(fā)大致經(jīng)歷立項(xiàng)、制定策劃大綱、制作游戲、檢測(cè)調(diào)試等過(guò)程。本文以接雞蛋這個(gè)小游戲?yàn)槔?,描述Unity3D開(kāi)發(fā)Andoird游戲的基本流程。
游戲的基本玩法是雞蛋從屏幕上方落下,通過(guò)左右移動(dòng)屏幕下方的木桶接住從上方落下的雞蛋,雞蛋落到木桶中及得分。游戲開(kāi)發(fā)的基本步驟如下:
1.新建工程和場(chǎng)景
一個(gè)游戲就是一個(gè)項(xiàng)目,一個(gè)關(guān)卡就是一個(gè)場(chǎng)景,在Unity3D的文件菜單中選擇新建項(xiàng)目,為新項(xiàng)目命名,如圖2所示,新建項(xiàng)目的同時(shí)會(huì)新建第一個(gè)場(chǎng)景,保存新場(chǎng)景。
■
2.導(dǎo)入資源
游戲使用到的資源主要包括游戲?qū)ο竽P汀⒉馁|(zhì)、貼圖、聲音等,模型可以在Maya,3DMax等3D建模工具中做好,導(dǎo)出為FBX格式的文件,然后在Unity3D的項(xiàng)目面板中選擇導(dǎo)入資源菜單導(dǎo)入游戲資源。接雞蛋主要模型資源有木桶、雞蛋、草地、白云等模型。
3.搭建游戲場(chǎng)景
將游戲資源從項(xiàng)目面板拖入到場(chǎng)景面板中進(jìn)行游戲場(chǎng)景的搭建,通過(guò)移動(dòng)、縮放、旋轉(zhuǎn)等工具將游戲資源對(duì)象按照一定的空間順序進(jìn)行搭建,最終效果如圖3所示:
■
4.編寫(xiě)游戲腳本
(1)桶移動(dòng):PlayerScript.cs
木桶的左右移動(dòng)是通過(guò)PlayerScript.cs來(lái)控制的,Unity3D的輸入系統(tǒng)定義了水平方向的移動(dòng),并將X方向的數(shù)值限定在-2.5到2.5之間,這樣避免木桶超出屏幕范圍,代碼的主要部分如下:
void Update () {
float moveInput = Input.GetAxis("Horizontal") * Time.deltaTime * 3; // 木桶在水平方向移動(dòng)
transform.position += new Vector3(moveInput, 0, 0);
if (transform.position.x <= -2.5f || transform.position.x >= 2.5f){ // 限制木桶的移動(dòng)范圍
float xPos = Mathf.Clamp(transform.position.x, -2.5f, 2.5f); // 木桶在-2.5和2.5之間移動(dòng)
transform.position = new Vector3(xPos, transform.position.y, transform.position.z);
}}
將PlayerScript.cs拖至木桶對(duì)象上,使得其成為木桶對(duì)象的腳本組件。
(2)雞蛋落下:EggScript.cs
雞蛋落下由EggScript.cs來(lái)控制,當(dāng)雞蛋落至屏幕下方足夠低的地方的時(shí)候,雞蛋自動(dòng)銷(xiāo)毀,以免占有資源,代碼主要部分如下:
void Update () {
float fallSpeed = 2 * Time.deltaTime;
transform.position -= new Vector3(0, fallSpeed, 0);
if (transform.position.y < -1 || transform.position.y >= 20) // 位置足夠低的時(shí)候銷(xiāo)毀對(duì)象
{Destroy(gameObject);}}
同樣將EggScript.cs拖至雞蛋對(duì)象上,使得其成為雞蛋對(duì)象的腳本組件之一。
(3)生成雞蛋:SpawnerScript.cs
雞蛋源源不斷的從屏幕上方落下,即是通過(guò)SpawnerScript.cs腳本來(lái)生成雞蛋,并且每隔0.3秒,雞蛋的生成速度會(huì)不斷的增加,主要代碼如下:
void Update () {
if (nextEggTime < Time.time)
{
SpawnEgg();
nextEggTime = Time.time + spawnRate;
spawnRate *= 0.98f; // 生成速度逐漸加快
spawnRate = Mathf.Clamp(spawnRate, 0.3f, 99f);
}}
void SpawnEgg()
{
float addXPos = Random.Range(-1.6f, 1.6f); // 水平位置由隨機(jī)函數(shù)產(chǎn)生的數(shù)值來(lái)生成
Vector3 spawnPos = transform.position + new Vector3(addXPos,0,0);
Instantiate(eggPrefab, spawnPos, Quaternion.identity); // 初始化雞蛋
}
同樣將EggScript.cs拖至雞蛋對(duì)象上,也使得其成為雞蛋對(duì)象的腳本組件之一。
(4)碰撞檢測(cè),計(jì)分:EggCollider.cs
在木桶底部有一個(gè)球體對(duì)象,設(shè)置為碰撞器,來(lái)檢測(cè)雞蛋是否與其發(fā)生碰撞,或者說(shuō)來(lái)判斷木桶是否接到了雞蛋,如果碰撞到則進(jìn)行計(jì)分,代碼主要部分如下:void Awake()
void OnTriggerEnter(Collider theCollision) // 碰撞檢測(cè)
{
GameObject collisionGO = theCollision.gameObject;
Destroy(collisionGO);
myPlayerScript.theScore++;// 本游戲中碰撞的物體只可能是雞蛋,檢測(cè)到即銷(xiāo)毀雞蛋對(duì)象,同時(shí)計(jì)分
}
將EggCollider.cs拖至球體碰撞器對(duì)象上,也使得其成為碰撞器對(duì)象的腳本組件。
5.發(fā)布游戲
游戲代碼完成,測(cè)試無(wú)錯(cuò)后就可以發(fā)布成Android應(yīng)用程序了,選擇文件菜單>構(gòu)建設(shè)置,在彈出的對(duì)話(huà)框中可以看見(jiàn)我們的游戲可以發(fā)布到多個(gè)平臺(tái)上,這里我們選擇Android,如圖4所示:
■
在發(fā)布設(shè)置中,設(shè)置游戲名稱(chēng)、默認(rèn)圖標(biāo)、Android版本等基本信息,最后點(diǎn)擊構(gòu)建按鈕即可生成最終的Andoid打包文件,導(dǎo)入手機(jī)中就可以運(yùn)行了。
四、結(jié)束語(yǔ)
本文通過(guò)一個(gè)小游戲的制作過(guò)程,描述了Unity3D的基本界面、基本操作和使用Unity3D開(kāi)發(fā)游戲的基本流程。Unity3D不但可以開(kāi)發(fā)3D游戲還可以開(kāi)發(fā)2D游戲和其他大型網(wǎng)絡(luò)在線(xiàn)游戲,同樣是畫(huà)面絢麗,效果出眾。
做為一個(gè)成熟的游戲引擎和開(kāi)發(fā)工具,Unity3D其開(kāi)發(fā)能力毋庸置疑,隨著iOS,Android手機(jī)的大量普及和3D網(wǎng)頁(yè)游戲的興起,Unity3D因其強(qiáng)大的功能、良好的可移植性和易用性在手機(jī)游戲和網(wǎng)頁(yè)游戲平臺(tái)上必將得到了廣泛的使用和傳播。
參考文獻(xiàn):
[1]Ryan Henson Creighton.Unity 3D Game Development by[J].Example Beginners Guide,2010(9).
[2]金璽曾.Unity 3D手機(jī)游戲開(kāi)發(fā)[M].北京:清華大學(xué)出版社,2013.
if (transform.position.y < -1 || transform.position.y >= 20) // 位置足夠低的時(shí)候銷(xiāo)毀對(duì)象
{Destroy(gameObject);}}
同樣將EggScript.cs拖至雞蛋對(duì)象上,使得其成為雞蛋對(duì)象的腳本組件之一。
(3)生成雞蛋:SpawnerScript.cs
雞蛋源源不斷的從屏幕上方落下,即是通過(guò)SpawnerScript.cs腳本來(lái)生成雞蛋,并且每隔0.3秒,雞蛋的生成速度會(huì)不斷的增加,主要代碼如下:
void Update () {
if (nextEggTime < Time.time)
{
SpawnEgg();
nextEggTime = Time.time + spawnRate;
spawnRate *= 0.98f; // 生成速度逐漸加快
spawnRate = Mathf.Clamp(spawnRate, 0.3f, 99f);
}}
void SpawnEgg()
{
float addXPos = Random.Range(-1.6f, 1.6f); // 水平位置由隨機(jī)函數(shù)產(chǎn)生的數(shù)值來(lái)生成
Vector3 spawnPos = transform.position + new Vector3(addXPos,0,0);
Instantiate(eggPrefab, spawnPos, Quaternion.identity); // 初始化雞蛋
}
同樣將EggScript.cs拖至雞蛋對(duì)象上,也使得其成為雞蛋對(duì)象的腳本組件之一。
(4)碰撞檢測(cè),計(jì)分:EggCollider.cs
在木桶底部有一個(gè)球體對(duì)象,設(shè)置為碰撞器,來(lái)檢測(cè)雞蛋是否與其發(fā)生碰撞,或者說(shuō)來(lái)判斷木桶是否接到了雞蛋,如果碰撞到則進(jìn)行計(jì)分,代碼主要部分如下:void Awake()
void OnTriggerEnter(Collider theCollision) // 碰撞檢測(cè)
{
GameObject collisionGO = theCollision.gameObject;
Destroy(collisionGO);
myPlayerScript.theScore++;// 本游戲中碰撞的物體只可能是雞蛋,檢測(cè)到即銷(xiāo)毀雞蛋對(duì)象,同時(shí)計(jì)分
}
將EggCollider.cs拖至球體碰撞器對(duì)象上,也使得其成為碰撞器對(duì)象的腳本組件。
5.發(fā)布游戲
游戲代碼完成,測(cè)試無(wú)錯(cuò)后就可以發(fā)布成Android應(yīng)用程序了,選擇文件菜單>構(gòu)建設(shè)置,在彈出的對(duì)話(huà)框中可以看見(jiàn)我們的游戲可以發(fā)布到多個(gè)平臺(tái)上,這里我們選擇Android,如圖4所示:
■
在發(fā)布設(shè)置中,設(shè)置游戲名稱(chēng)、默認(rèn)圖標(biāo)、Android版本等基本信息,最后點(diǎn)擊構(gòu)建按鈕即可生成最終的Andoid打包文件,導(dǎo)入手機(jī)中就可以運(yùn)行了。
四、結(jié)束語(yǔ)
本文通過(guò)一個(gè)小游戲的制作過(guò)程,描述了Unity3D的基本界面、基本操作和使用Unity3D開(kāi)發(fā)游戲的基本流程。Unity3D不但可以開(kāi)發(fā)3D游戲還可以開(kāi)發(fā)2D游戲和其他大型網(wǎng)絡(luò)在線(xiàn)游戲,同樣是畫(huà)面絢麗,效果出眾。
做為一個(gè)成熟的游戲引擎和開(kāi)發(fā)工具,Unity3D其開(kāi)發(fā)能力毋庸置疑,隨著iOS,Android手機(jī)的大量普及和3D網(wǎng)頁(yè)游戲的興起,Unity3D因其強(qiáng)大的功能、良好的可移植性和易用性在手機(jī)游戲和網(wǎng)頁(yè)游戲平臺(tái)上必將得到了廣泛的使用和傳播。
參考文獻(xiàn):
[1]Ryan Henson Creighton.Unity 3D Game Development by[J].Example Beginners Guide,2010(9).
[2]金璽曾.Unity 3D手機(jī)游戲開(kāi)發(fā)[M].北京:清華大學(xué)出版社,2013.
if (transform.position.y < -1 || transform.position.y >= 20) // 位置足夠低的時(shí)候銷(xiāo)毀對(duì)象
{Destroy(gameObject);}}
同樣將EggScript.cs拖至雞蛋對(duì)象上,使得其成為雞蛋對(duì)象的腳本組件之一。
(3)生成雞蛋:SpawnerScript.cs
雞蛋源源不斷的從屏幕上方落下,即是通過(guò)SpawnerScript.cs腳本來(lái)生成雞蛋,并且每隔0.3秒,雞蛋的生成速度會(huì)不斷的增加,主要代碼如下:
void Update () {
if (nextEggTime < Time.time)
{
SpawnEgg();
nextEggTime = Time.time + spawnRate;
spawnRate *= 0.98f; // 生成速度逐漸加快
spawnRate = Mathf.Clamp(spawnRate, 0.3f, 99f);
}}
void SpawnEgg()
{
float addXPos = Random.Range(-1.6f, 1.6f); // 水平位置由隨機(jī)函數(shù)產(chǎn)生的數(shù)值來(lái)生成
Vector3 spawnPos = transform.position + new Vector3(addXPos,0,0);
Instantiate(eggPrefab, spawnPos, Quaternion.identity); // 初始化雞蛋
}
同樣將EggScript.cs拖至雞蛋對(duì)象上,也使得其成為雞蛋對(duì)象的腳本組件之一。
(4)碰撞檢測(cè),計(jì)分:EggCollider.cs
在木桶底部有一個(gè)球體對(duì)象,設(shè)置為碰撞器,來(lái)檢測(cè)雞蛋是否與其發(fā)生碰撞,或者說(shuō)來(lái)判斷木桶是否接到了雞蛋,如果碰撞到則進(jìn)行計(jì)分,代碼主要部分如下:void Awake()
void OnTriggerEnter(Collider theCollision) // 碰撞檢測(cè)
{
GameObject collisionGO = theCollision.gameObject;
Destroy(collisionGO);
myPlayerScript.theScore++;// 本游戲中碰撞的物體只可能是雞蛋,檢測(cè)到即銷(xiāo)毀雞蛋對(duì)象,同時(shí)計(jì)分
}
將EggCollider.cs拖至球體碰撞器對(duì)象上,也使得其成為碰撞器對(duì)象的腳本組件。
5.發(fā)布游戲
游戲代碼完成,測(cè)試無(wú)錯(cuò)后就可以發(fā)布成Android應(yīng)用程序了,選擇文件菜單>構(gòu)建設(shè)置,在彈出的對(duì)話(huà)框中可以看見(jiàn)我們的游戲可以發(fā)布到多個(gè)平臺(tái)上,這里我們選擇Android,如圖4所示:
■
在發(fā)布設(shè)置中,設(shè)置游戲名稱(chēng)、默認(rèn)圖標(biāo)、Android版本等基本信息,最后點(diǎn)擊構(gòu)建按鈕即可生成最終的Andoid打包文件,導(dǎo)入手機(jī)中就可以運(yùn)行了。
四、結(jié)束語(yǔ)
本文通過(guò)一個(gè)小游戲的制作過(guò)程,描述了Unity3D的基本界面、基本操作和使用Unity3D開(kāi)發(fā)游戲的基本流程。Unity3D不但可以開(kāi)發(fā)3D游戲還可以開(kāi)發(fā)2D游戲和其他大型網(wǎng)絡(luò)在線(xiàn)游戲,同樣是畫(huà)面絢麗,效果出眾。
做為一個(gè)成熟的游戲引擎和開(kāi)發(fā)工具,Unity3D其開(kāi)發(fā)能力毋庸置疑,隨著iOS,Android手機(jī)的大量普及和3D網(wǎng)頁(yè)游戲的興起,Unity3D因其強(qiáng)大的功能、良好的可移植性和易用性在手機(jī)游戲和網(wǎng)頁(yè)游戲平臺(tái)上必將得到了廣泛的使用和傳播。
參考文獻(xiàn):
[1]Ryan Henson Creighton.Unity 3D Game Development by[J].Example Beginners Guide,2010(9).
[2]金璽曾.Unity 3D手機(jī)游戲開(kāi)發(fā)[M].北京:清華大學(xué)出版社,2013.