2023年河北工業(yè)大學(xué)U三D實驗報告_第1頁
2023年河北工業(yè)大學(xué)U三D實驗報告_第2頁
2023年河北工業(yè)大學(xué)U三D實驗報告_第3頁
2023年河北工業(yè)大學(xué)U三D實驗報告_第4頁
2023年河北工業(yè)大學(xué)U三D實驗報告_第5頁
已閱讀5頁,還剩60頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

計算機游戲程序設(shè)計

實驗1-4報告

實驗一GUI游戲界面的實現(xiàn)

一、實驗?zāi)康呐c規(guī)定

1.熟悉及掌握GUI的高級控件,以及用法。

2.掌握GUI自定義皮膚用法

3.熟悉GUILayout的使用。

4.熟悉2D貼圖的繪制和幀動畫的實現(xiàn)方法。

二、實驗原理及知識點

在游戲的整個開發(fā)過程中,游戲界面設(shè)計占據(jù)非常重要的地位。由于游

戲啟動后,第一個映入玩家眼簾的就是游戲的UI界面。UI界面重要涉及貼

圖,按鈕和高級控件等。通常游戲界面的展現(xiàn)方式有很多種,大多數(shù)都由自

定義圖形界面組成。

Unity為開發(fā)者提供了一套非常完善的圖形化界面引擎,它涉及常見

的游戲窗口、文本框、輸入框、拖動條、按鈕、貼圖框等,無論是做軟件還

是做游戲,都可以很方便地使用。

此外,Unity提供了界面自定義皮膚的功能。控件不僅可以使用默認(rèn)的

皮膚,還可以自定義皮膚,自定義皮膚不僅可以美化游戲界面,還可以提高游

戲品質(zhì)。Unity游戲界面重要由GUI完畢。在本章中,我們將使用JavaS

cript腳本向讀者具體介紹Unity中有關(guān)GUI界面的所有高級控件。

1.GUI高級控件

系統(tǒng)高級UI控件己經(jīng)成為游戲開發(fā)中不可缺少的一部分,高級界面由

系統(tǒng)提供,所以運營效率要遠(yuǎn)遠(yuǎn)高于低檔界面(高級界面為系統(tǒng)實現(xiàn),低檔

界面為自己手動實現(xiàn))。拿按鈕控件來說吧,不使用系統(tǒng)提供的按鈕控件,

我們也可以使用低檔界面模擬實現(xiàn)按鈕的功能。但是,低檔界面實現(xiàn)的“按

鈕”沒有高級界面實現(xiàn)的效率高,但是低檔界面制作的“按鈕”比較靈活,

可以任意修改。

GUI高級控件的種類非常繁多,涉及標(biāo)簽、按鈕、輸入框和拖動條等。

他們可用于任何游戲或軟件的界面研發(fā)。GUI高級控件的應(yīng)用也非常廣泛,

比如網(wǎng)絡(luò)游戲中輸入賬號與密碼的提醒框,通關(guān)游戲后上傳游戲積分的按

鈕,創(chuàng)建角色時輸入的角色信息等。下面將分別向讀者介紹GUI高級控件

的相關(guān)用法。

1.1Label控件

使用Label控件(標(biāo)簽控件),可以在游戲界面中以文本的形式展示出

一段字符串信息。使用Labe1控件,我們不僅可以輸入字符串,還可以貼圖。

1.2Button控件

在開發(fā)中,Button控件(按鈕控件)是十分常見的控件之一,可以用來

判斷用戶在程序中的一些操作行為,比如對話框中的“擬定”和“取消”按

鈕。

按鈕共有3個基本狀態(tài)組成:未點擊狀態(tài)、擊中狀態(tài)、點擊后狀態(tài)。一

般情況下,游戲界面的按鈕只監(jiān)聽“未點擊狀態(tài)”和“點擊后狀態(tài)”。

按照展現(xiàn)方式,按鈕可以分為兩種:“普通按鈕”和“圖片按鈕”。普通

按鈕為系統(tǒng)默認(rèn)顯示的按鈕,而圖片按鈕可以設(shè)定按鈕的背景圖案。

1.3TextFie1d控件

TextField控件重要用于監(jiān)聽用戶輸入的信息,其應(yīng)用非常普遍,比

如在游戲登陸界面中,玩家輸入用戶名和密碼后,點擊“確認(rèn)”按鈕判斷其輸

入是否對的,或者游戲通關(guān)后填寫勝利者姓名與輸入相關(guān)的游戲信息等。

。一般情況下,使用GUI.TextField()方法顯示輸入框,該方法的返回值

為用戶輸入的字符串信息。使用GULPasswordField。方法,可以將用戶

輸入的信息顯示為任意字符串,一般在輸入密碼時將密碼以“****”的形

式顯示。后面的參數(shù)“*”【0】用來將輸入的字符串顯示為“*****”。

1.4Slider控件

SIider控件由滑塊和滑動條組成。使用S1ider控件,可以計算出滑

塊在滑動過程中占整個滑動條的比例。假如滑動條的整體長度為100,則滑

塊滑動的范圍就是。至100。

按照展示方式,滑動條可分為兩種:一種為水平滑動條(Horizontals

1ider),另一種為垂直滑動條(VerticaIS1ider),它們之間的用

法完全相同。

在開發(fā)中,我們常使用滑動條來調(diào)節(jié)音量或者顏色等。

1.5Scrol1View控件

假如游戲界面中的GUI控件過多,超過了屏幕的顯示范圍,就需要使用

ScrollView控件來完畢它的展示效果。

ScrollView控件可設(shè)定一個滾動顯示區(qū)域。假如橫向或縱向的GUI

控件超過了其顯示區(qū)域。視圖下方或者右方將會出現(xiàn)滾動條。在開發(fā)中使用

Scro1IView控件的情況非常普遍,比如假如游戲中幫助信息或者關(guān)于信息

過長,就可以使用滾動條來查看相關(guān)信息。

1.6群組控件(GroupView控件)

群組視圖(GroupView控件)可將多個視圖所有放在一個群組當(dāng)中。將視

圖添加進(jìn)群組當(dāng)中后,群組中任何視圖的坐標(biāo)都是相對坐標(biāo),它是相對群組

視圖左上角的坐標(biāo)。

修改群組視圖坐標(biāo)后,群組中所有視圖的坐標(biāo)都會跟著修改。推薦使用

群組視圖來制作游戲界面,由于設(shè)備的屏幕尺寸不同,這樣做可以避免對坐

標(biāo)進(jìn)行多次修改的麻煩。

1.7窗口

窗口在游戲開發(fā)中并不陌生,所有視圖都需要依賴窗口來顯示,我們可

以把窗口理解為視圖的父類。前面我們介紹了各式各樣的游戲視圖,它們都

屬于窗口的子類。游戲界面可以由若干個窗口組成,窗口又由若干個視圖組

成。

創(chuàng)建窗口時需要設(shè)定它的顯示區(qū)域,在窗口中可以添加任意組件,前提

是組件的顯示區(qū)域必須在窗口當(dāng)中,否則無法顯示。此外,窗口中所有控件

的坐標(biāo)均采用相對坐標(biāo),相對窗口左上角的坐標(biāo)。

1.9GUISkin

通過之前章節(jié)的學(xué)習(xí),我想大家已經(jīng)掌握了Unity大部分的GUI控件,

但是直接使用這些控件開發(fā)游戲還遠(yuǎn)遠(yuǎn)不夠,由于系統(tǒng)默認(rèn)的界面實在過于

粗糙與單調(diào)。為了讓自己的游戲界面活靈活現(xiàn),我們需要使用GUISkin

為控件添加一個美麗的皮膚。

2GUILayout游戲界面布局

游戲界面的制作效果有很多中,有復(fù)雜絢麗的界面,也有簡樸明了的界

面,而設(shè)計方式的仁者見仁,智者見智。在跨平臺游戲界面開發(fā)中,最麻煩

的事就是各個平臺的分辨率不同樣,甚至相同平臺的分辨率也不同樣,這無

疑給移植導(dǎo)致非常大的麻煩。因此,在制作游戲界面時,使用絕對坐標(biāo)值是相

稱危險的一件事。由于假如跨平臺移植的話,分辨率發(fā)生了改變,開發(fā)者就

得為其重新設(shè)計坐標(biāo),這在開發(fā)效率上將大打折扣。為了避免后期對坐標(biāo)重

新進(jìn)行計算,前期制作界面時可以考慮自適應(yīng)屏幕布局,GUI為開發(fā)者提供

了游戲布局的概念,并且在布局的過程中所有的坐標(biāo)點都是對稱坐標(biāo),所以

使用GUI游戲界面布局來制作界面將更有效地實現(xiàn)自適應(yīng)屏幕。

2.1GUI與GU[Layout的區(qū)別

通過之前的學(xué)習(xí),我相信大家對GUI應(yīng)當(dāng)并不陌生了,那么GUI

Layout是什么東西呢?它是游戲界面的布局。從命名中就可以看到這兩個東

西非常相像,但是在使用過程中兩者還是存在一定區(qū)別的。

使用GUI繪制控件的時候,需要設(shè)立控件的Rect。方法,也就是說需

要設(shè)定控件的整體顯示區(qū)域。這樣設(shè)立的控件非常不靈活,由于它的坐標(biāo)以

及大小已經(jīng)固定死了,這是假如控件中的內(nèi)容長度發(fā)生改變,就會直接影響

展示效果。例如,在界面中繪制一個按鈕時,按鈕中的顯示文本剛好填充在

整個按鈕當(dāng)中,假如動態(tài)加長文本的顯示長度,就會超過按鈕的顯示范圍,

使按鈕控件變得不倫不類。我們需要制作控件的自適應(yīng),所以不能使用R

ect()方法固定控件的顯示區(qū)域,而是需要使用界面布局制作界面。

使用GUILayout來制作界面,可以很方便的為我們解決上述難題。使

用GUI制作界面的時候,需要給每一個控件設(shè)定顯示區(qū)域,系統(tǒng)會自動幫我

們計算控件的顯示區(qū)域,并且保證他們不會重合。(注意之前介紹的大部分

GUI控件都可以使用GUILayout進(jìn)行繪制)

2.2線性布局

線性布局是以線性連續(xù)排列的形式將GUI控件有規(guī)律的顯示在屏幕

中,共分為兩種:一種為水平線性布局,另一種為垂直線性布局。默認(rèn)的界

面是以垂直線性布局的方式來排列。

創(chuàng)建水平線性布局時,一方面需要使用BeginHorizontal0方法,然

后將控件添加至線性布局當(dāng)中,最后使用EndHorizontal()方法來結(jié)束當(dāng)

前線性布局。而假如使用垂直線性布局,則需要使用BeginVertica1()方

法與EndVerticaI()方法。

無論是水平線性布局還是垂直線性布局,都可以使用嵌套的形式來制作

游戲界面,也就是說,父類布局中可以繼續(xù)嵌套一個子類布局,子類布局完

全受父類布局的限制。善用布局之間的嵌套,可以方便我們制作更為復(fù)雜的

游戲界面。

2.3控件偏移

布局與布局之間都是以一種線性方式緊密排列的,無法直接修改布局當(dāng)

中兩個相連控件的距離,為了解決這個問題,就需要使用空間偏移。

在控件中使用Space()方法可以設(shè)立控件之間的偏移量。

32D貼圖與幀動畫

2D貼圖好比在屏幕中繪制了一張靜態(tài)圖片,其繪制方式有兩種,第一種

由GUI繪制,第二種是將貼圖以材質(zhì)的形式繪制在游戲?qū)ο笾?,在本?jié)中,

我們將著重介紹第一種方式。

幀動畫的實現(xiàn)原理就是使用若干張靜態(tài)圖片以一定的時間一幀一幀地

在屏幕中切換播放,好比在屏幕中預(yù)先設(shè)定一個現(xiàn)實動畫的區(qū)域。然后將圖

片在這個現(xiàn)實區(qū)域中頻繁切換播放。由于繪制的圖片有規(guī)律的切換播放,給

人們帶來了視覺的假象,感覺就像播放動畫同樣。

3.1繪制貼圖

要在屏幕中繪制一張靜態(tài)貼圖,需要使用GUI.DrawTexttureO方

法,該方法可設(shè)定圖片的顯示位置、縮放比例和渲染混合等,該方法的原型

如下:

其中第一個參數(shù)表達(dá)圖片的繪制區(qū)域,第二個參數(shù)表達(dá)繪制圖片的圖像,

第3個參數(shù)表達(dá)圖片的縮放模式,第四個參數(shù)表達(dá)的是否啟動圖片混合模

式,第五個參數(shù)表達(dá)圖片縮放寬高的比例。

在Pr。ject視圖中將需要加載的圖片存儲在根目錄“Resources”

中。需要說明的是,一定要將加載的圖片保存在“Resources”文獻(xiàn)夾中,

否則程序?qū)o法辨認(rèn)。Resources.Load()方法和Resources.LoadA

11()方法的參數(shù)均為資源文獻(xiàn)夾的完整途徑,只但是前者返回的事讀取的資

源對象,后者返回的是資源對象的數(shù)組。

3.2繪制動畫

本節(jié)中我們開始學(xué)習(xí)幀動畫的繪制。一方面需要一組幀動畫的資源,在

這里我們選擇一套2D人物四宮格行走圖,在繪制幀動畫之前,我們需要學(xué)習(xí)

幀動畫的繪制原理:一方面需要在屏幕中設(shè)定一個顯示區(qū)域,然后將動畫中

的每一個幀動畫按照固定的時間在這個區(qū)域中按順序切換,繼而實現(xiàn)動畫的

播放。

這里我們使用程序?qū)赢嬞Y源存儲在動畫數(shù)組當(dāng)中,然后設(shè)定動畫的刷

新時間,每次刷新動畫時將在原有的顯示區(qū)域中繪制下一幀圖片,到了最后

一幀則從第一幀重新開始,以此類推你。

3.3實例一一人物移動

結(jié)合2D幀動畫的繪制原理,本節(jié)我們將制作一個游戲?qū)嵗?效果如圖

3.4所示。在屏幕中共繪制了四個按鈕,通過點擊這四個按鈕來控制主角

的移動,并且播放主角在相應(yīng)方向上的行走的動畫。

程序需要監(jiān)聽用戶出發(fā)的按鈕來切換動畫方向,比如當(dāng)用戶點擊“向上”

按鈕時,將播放主角向上走的動畫。

我們使用x、y全局變量來記錄當(dāng)前主角的坐標(biāo),上下行走為加減x坐標(biāo),

左右行走為加減y坐標(biāo),最后根據(jù)主角的x、y坐標(biāo)來繪制但前動畫在屏幕

中的位置,從而實現(xiàn)控制主角向四個方向行走。

4本部分內(nèi)容小結(jié)

本部分一方面介紹了Unity中GUI界面的相關(guān)組件以及自定義皮膚

的實現(xiàn)方式,其中每一個GUI高級組件都配備了一個小例子供讀者學(xué)習(xí);

然后介紹了GUI與GUILayout的區(qū)別,已介入和使用GUILayout布局來

制作界面;接著介紹了使用GUI繪制2D貼圖與動畫,以及如何控制主角移

動的游戲?qū)嵗?;最后通過制作一個游戲主界面,回顧了前面所學(xué)的游戲界面

的相關(guān)內(nèi)容。請大家認(rèn)真閱讀本章內(nèi)容,打好游戲界面設(shè)計的基礎(chǔ),為后面

進(jìn)一步學(xué)習(xí)做好準(zhǔn)備。

三、實驗內(nèi)容及環(huán)節(jié)

1.熟悉GUI高級控件,練習(xí)使用GUI的高級控件制作2?3個游戲界面。

2.練習(xí)使用GUI自定義皮膚,實現(xiàn)游戲界面的字體,背景顏色等設(shè)

立。

3.熟悉GUILayout的使用,聯(lián)系使用GUILayout的水平線性布局和垂

直線性布局,并加適當(dāng)偏移。

4.熟悉21)貼圖的繪制和幀動畫的實現(xiàn)方法,練習(xí)在界面中繪制靜態(tài)圖

片和動畫。

代碼如下:

#pragmastrict

varstr:String;

varmm:String;

functionStart(){}

functionUpdate(){}

functionOnGUI(){

eGUI.BeginGroup(Rect(Screen.width/2-150,Screen.height/2-10

0,400,300));

GUI.Label(Rect(20,20,80,30),“菜單:”);

if(GUI.Button(Rect(100,40,60,20)J自動漫游")){

。Application.1.oadLevel(“自動漫游“);

)

oif(GUI.Button(Re(1(100,10,60,20),“音頻播放”)){

Applieation.LoadLevel(11音頻播放”);

°}

if(GUl.Button(Rect(100,70,60,20畫線”)){

。Application.LoadLevel("畫線”);

if(GUI.Button(Rect(100,100,60,20)/,視頻播放")){

?Application.LoadLevel("視頻播放“);

GUI.EndGroupO;

)

實驗二Unity游戲腳本

一、實驗?zāi)康呐c規(guī)定

1.熟悉及掌握MonoDevelop腳本編輯器的使用方法。

2.Unity腳本的生命周期。

3.純熟使用腳本來操作游戲?qū)ο蟆?/p>

二、實驗原理及知識點

Unity游戲腳本在整個游戲開發(fā)中可以說是關(guān)鍵要素,游戲?qū)ο笾g

任何邏輯的判斷都需要通過腳本來完畢。假如說游戲貼圖、模型資源的好壞

決定一個游戲的視覺品味,那么腳本將直接決定這個游戲的內(nèi)在質(zhì)量,決定

這個游戲好玩與否。游戲腳本與其他游戲組件用法相同,必須綁定在游戲?qū)?/p>

象中才干執(zhí)行它的生命周期。

Unity一共支持3種語言來編寫腳本,分別是JavaScript、C#、Boo,

這3種語言不分好壞,用哪一種來編寫都可以達(dá)成同樣目的。從編程技巧與

難度上來講,JavaScript更容易上手一些,建議初學(xué)者使用JavaScri

Pt進(jìn)行入門階段學(xué)習(xí),但是進(jìn)階階段推薦使用C#語言來編寫腳本,由于

C#語言在編程思想上更符合Unity引擎的原理。由于與傳統(tǒng)語言相比,Bo

o語言的語法更為怪異,所以開發(fā)中幾乎不會用到它。

1MonoDevelop腳本編輯器

Unity可部署在Wi1I(10亞5與服(205X梁總操作系統(tǒng)下,所以Un

ity需要一個跨平臺的腳本編輯器。MonoDevelop腳本編輯器并不是Unit

y公司所研發(fā)的。它是一個開源項目,任何人或公司都可以使用。由于該編

輯器具有強大的跨平臺功能,并且使用起來非常方便,所以不久被Unity

公司作為核心腳本開發(fā)環(huán)境使用。

2Unity腳本的生命周期

Unity腳本從喚醒到銷毀有著一套比較完善的生命周期,添加任何腳

本都必須遵守自身生命周期法則。下面介紹一下生命周期中有系統(tǒng)自身調(diào)用

的幾個比較重要的方法。

functionAwake(){}。腳本喚醒,此方法為系統(tǒng)執(zhí)行的第一個方法,

用于腳本的初始化,在腳本的生命周期中只執(zhí)行一次。

funetionStart(){}。此方法在Awake()方法之后、Update()

方法之前執(zhí)行,并且只執(zhí)行一次。

funetionUpdate(){)?正常更新,用于更新邏輯。此方法每幀

都會由系統(tǒng)自動調(diào)用一次。

functionLateUpdate(){}?推遲更新,此方法在Update()

方法執(zhí)行完后調(diào)用,同樣每一幀都調(diào)用。

functionFixedllpdate(){)?固定更新,固定更新常用于移動模

型等操作。由于固定更新每一幀調(diào)用的時間相隔都是完全同樣的,所以模型

的移動過程會比較均勻。

functionOnGUI(){}。繪制界面。這個方法大家應(yīng)當(dāng)不會陌生,由于

在第3章中已經(jīng)做過很多例子了。它和Update()方法同樣,每一幀都在調(diào)

用,只是它是用來繪制界面的。

function0nDestroy(){}<)當(dāng)前腳本銷毀時調(diào)用。

3運用腳本來操作游戲?qū)ο?/p>

在Unity場景中出現(xiàn)的所有實體都屬于游戲?qū)ο?,比如系統(tǒng)自帶的立方

體、球體以及由美工制作的.Fbx游戲模型等。游戲?qū)ο笈c腳本聯(lián)系非常緊

密,由于游戲?qū)ο笾g的一切交互都需要使用腳本來完畢。

下面我們開始學(xué)習(xí)如何使用腳本來操作游戲?qū)ο?。使用腳本來調(diào)用游戲

對象的方式有兩種,它們是:可以將腳本綁定在一個游戲?qū)ο笊砩?也可以在

代碼中動態(tài)綁定腳本和刪除腳本。任何一個游戲?qū)ο蠖伎梢酝瑫r綁定多條游

戲腳本,并且這些腳本互不干涉,各自完畢各自的生命周期。

3.1創(chuàng)建游戲?qū)ο?/p>

創(chuàng)建游戲?qū)ο蟮姆绞焦灿幸幌聝煞N。第一種為將模型預(yù)先放入

Hierarchy視圖中,然后在場景視圖中任意拖動該模型在3D世界中的位置,

運營游戲后該模型就會出現(xiàn)在Game視圖中。第二種為在代碼中根據(jù)條件動

態(tài)創(chuàng)建與刪除游戲?qū)ο?,這種解決方式靈活性比較高。

3.2獲取游戲?qū)ο?/p>

在腳本中獲取游戲?qū)ο蟮姆绞揭还灿腥N:第一種為通過對象名稱獲

取,第二種為通過標(biāo)簽(tag)獲取單個游戲?qū)ο?,第三種為通過相同標(biāo)簽獲

取多組游戲?qū)ο蟆?/p>

3.3添加組件與修改組件

新創(chuàng)建的游戲?qū)ο笞陨聿⒉痪哂腥魏翁匦?為了讓它具有一些功能,就

必須給其添加游戲組件。游戲組件的種類非常多,常見的游戲組件有腳本類、

網(wǎng)格類、粒子類、物理類、聲音類和渲染類等。本節(jié)中我們將學(xué)習(xí)如何在代

碼中添加與修改游戲組件。添加游戲組件時,可以使用AddCompone

nt()方法。由于組件自身沒有相應(yīng)的刪除方法,需要使用父類執(zhí)行

Object.Destr。y()方法才干刪除它,其中該方法的參數(shù)為需要刪除的游戲

對象或游戲組件。在刪除某一游戲?qū)ο髸r,將連帶該對象中的所有組件一并

刪除。

3.4克隆游戲?qū)ο?/p>

克隆游戲?qū)ο笈c創(chuàng)建游戲?qū)ο笤谛Ч某尸F(xiàn)方式是完全同樣的,但是從

執(zhí)行效率上來講,克隆游戲?qū)ο蟮男室摺J褂媚_本克隆游戲?qū)ο笤谟螒?/p>

中應(yīng)用非常廣泛,常用于一些完全相同并且數(shù)量龐大的游戲?qū)ο?,比如游?/p>

中發(fā)射的子彈對象,每一顆子彈對象是完全同樣的,每一次發(fā)射子彈都會新

克隆一個子彈對象,并且讓克隆的子彈對象完畢自己的生命周期。在代碼中,

需要使用Instantiate()方法克隆游戲?qū)ο蟆?/p>

4用腳本來控制對象的變換

在3D世界中,任何一個游戲?qū)ο笤趧?chuàng)建的時候都會附帶Transfor

m(變換)組建,并且該組建是無法刪除的。

Transform面板中一共包含3個屬性:Position(位置)、Rotatio

n(旋轉(zhuǎn))和Scale(縮放)。在場景中使用移動工具來拖動和旋轉(zhuǎn)模型,

即可直接在Transform面板中看到編輯后的值,此外也可在Transfo

rm面板的編輯框中修改對象的位置、旋轉(zhuǎn)方式和縮放的數(shù)值。

4.1改變游戲?qū)ο蟮奈恢?/p>

在3D世界中,任何一個模型的三維坐標(biāo)都保存在Vector3容器中,

該容器將記錄模型在x軸、y軸和z軸方向的坐標(biāo)。一旦在程序中修改該模

型在Vector3容器中的坐標(biāo),那么Scene視圖中模型的位置將發(fā)生改變。

4.2旋轉(zhuǎn)游戲?qū)ο?/p>

模型的旋轉(zhuǎn)方式可分為2種:第一種為自身旋轉(zhuǎn),意思是模型沿著自己

的x軸,y軸或z軸方向旋轉(zhuǎn);第二種為圍繞旋轉(zhuǎn),意思是模型圍繞著坐標(biāo)

系中的抹一點或摸一個游戲?qū)ο笳w來做旋轉(zhuǎn)。

下面簡要介紹一下經(jīng)常會用到的一些重要方法和參數(shù)。

>transform.Rotate():該方法用于設(shè)立模型繞自身旋轉(zhuǎn),起參

數(shù)為旋轉(zhuǎn)的速度與旋轉(zhuǎn)的方向。

>transform.RRotateAround():該方法用于設(shè)立模型圍繞某

一個點旋轉(zhuǎn).

>Time.deltaTime:用于記錄上一幀所消耗的時間,這里用作模型

旋轉(zhuǎn)的速度系數(shù)。

>Vector3.right:x軸方向。

>Vector3.up:y軸方向。

>Vector3.forward:z軸方向。

當(dāng)模型繞自身旋轉(zhuǎn)時,可以使用objCube.transform.Rotate()

方法,當(dāng)模型圍繞抹一點旋轉(zhuǎn)時,則使用objCube.transform.Rotat

eAround。方法。

4.3平移游戲?qū)ο?/p>

平移的含義是模型在原有位置的基礎(chǔ)上繼續(xù)移動,在代碼中可以使用t

ransform.Trans1ate()方法來實現(xiàn),此方法的唯一參數(shù)為平移模型的

方向。

4.4縮放游戲?qū)ο?/p>

在Unity中,可以通過代碼動態(tài)縮放游戲中的模型。重要有三種縮放方

式:沿x軸縮放、沿y軸縮放、沿z軸縮放。每個軸都有自身的縮放洗漱,

模型默認(rèn)的縮放系數(shù)是1,就是模型原有大小,因此要在程序中實現(xiàn)模型的

縮放,只需要動態(tài)修改模型的縮放系數(shù)即可。

三、實驗內(nèi)容及環(huán)節(jié)

1.熟悉MonoDevelop腳本編輯器的使用方法,聯(lián)系實現(xiàn)腳本調(diào)試。

設(shè)立默認(rèn)腳本的打開方式:

1UnityPreferencesni

ExternalTools

GeneralExternalScriptEditorMonoDevelop(built-in)t1

EditorAttachingV

ExternalTools

ImageapplicationOp?nbyfileextensiont

Colors

RevisionControlDiff/Merge「e

KeysNosupportedAssetServerdifftoolswerefound.

Pleaseinstalloneofthefollowingtools:

CacheServer-SourceGearDiffMerge

-TkDiff

-P4Merge

-Toi-toiseMerge

-WinMecge

AndroidSDKLocationBrowse...t-

iOSXcode4,xsupport、

腳本調(diào)試:

2.編程實現(xiàn)創(chuàng)建游戲?qū)ο螅⒎襟w,球體),給游戲?qū)ο竺?,改變顏?

添加剛體組件。

源代碼:

usingUnityEngine;

usingSystem.Col1ections;

publicclassduixiang:MonoBehaviour{

//Usethisforinitialization

voidStart(){

}

//Updateisca1ledonceperframe

?voidUpdate(){

)

。voidOnGU1(){

。if(GUILayout.Button("創(chuàng)建立方體”,GUILayout.Heig

ht(50)))

oGameObjectobjCube=GameObject.CreatePrimitive

(PrimitiveType.Cube);

objCube.AddComponent<Rigidbody>();

。objC="Cube";

。?objCube.renderer.materia1.color=Color.b1ue;

objCube.transfbrm.position=newVector3(0.Of,1

O.Of,O.Of);

)

?if(GUILayout.Button("創(chuàng)建球體”,GUILayout.Height(5O)))

(

gGameObjectobjSphere=GameObject.CreatePrim

itive(PrimitiveType.Sphere);

。objSphere.AddComponent<Rigidbody>();

objS=,,Sphere”;

。objSphere.renderer.material.co1or=Co1or.red;

oaobjSphere.transform.position=newVector3(0.0f,10.0f,

0.Of);

6)

)

)

3.分別通過名稱、標(biāo)簽獲得游戲?qū)ο?,通過標(biāo)簽獲得多個游戲?qū)ο蟆?/p>

通過名稱:

源代碼:

pub1icclassfind:MonoBehaviour{

oprivateGameObjectobjCube;

privateGameObjectobjSphere;

privateboolisCubeRoate=false;

privateboo1isSphereRoate=false;

privatestringCubelnfo二〃旋轉(zhuǎn)立方體”;

◎privatestringSpherelnfo=”旋轉(zhuǎn)球體〃;

//Usethisforinitia1ization

voidStart(){

°objCube=GameObject.Find("Cube");

objSphere=GameObject.Find("Spherez/);

a}

//Updateisca1ledonceperframe

voidUpdate(){

ooif(isCubeRoate)

。(

if(objCube)

0d(

oobjCube.transform.Rotate(O.0f,Time.deltaTi

me*200,0.0f);

Odd}

0}

。if(isSphereRoate)

0(

。。if(objSphere)

6(

objSphere.transform.Rotate(0.Of,Tim

e.deltaTime*200,0.0f);

°)

00j

0VOid0nGUI(){

oif(GUILayout.Button(CubeInfo,GUILayout.Height(50)))

a(

if(!isCubeRoate)

°{

oo。isCubeRoate=true;

。CubeInfo=〃停止旋轉(zhuǎn)立方體〃;

O0}

。。0e1se

。(

。。isCubeRoate=fa1se;

?3Cubeinfo="旋轉(zhuǎn)立方體〃;

OOOJ

0?)

。if(GUILayout.Button(Sphereinfo,GUILayout.Height

(50)))

6{

。。oif(!isSphereRoate)

O0{

。。。isSphereRoate=true;

Spherelnfo”停止旋轉(zhuǎn)球體

00}

oelse

isSphereRoate=fa1se;

SphereInfo="旋轉(zhuǎn)球體”;

。)

。if(GUILayout.Button("立即銷毀模型〃,GUILayout.Height(5

0)))

。Destroy(objCube);

o。Destroy(objSphere);

oo)

6}

通過標(biāo)簽:

Tags

Size2

ElementOMyTag|

Element1

源代碼

usingUnityEngine;

usingSystem.Col1ections;

publicclassfind:MonoBehaviour{

。privateGameObjectobjCube;

privateGameObjectobjSphere;

eprivateboolisCubeRoate=false;

privateboolisSphereRoate=faIse;

oprivatestringCubelnfo="旋轉(zhuǎn)立方體”;

privatestringSphereInfo="旋轉(zhuǎn)球體”;

//Usethisforinitialization

voidStart(){

oobjCube=GameObject.FindWithTag("MyTag");

oobjSphere=GameObject.Find(*'Sphere");

)

“/Updateiscalledonceperframe

ovoidUpdate(){

“f(isCubeRoate)

。{

gif(objCube)

3e{

。objCube,transform.Rotate(0.0f,Time.de1t

aTime*200,0.Of);

0o}

6)

"if(isSphereRoate)

°{

if(objSphere)

6{

objSphere.transform.Rotate(0.0f,Time.delta

Time*200,0.0f);

g}

)

woidOnGUI(){

時f(GUILayout.Button(CubeInfo,GUILayout.Height(50)))

if(!isCubeRoate)

。isCubeRoate=true;

。CubeInfo廿'停止旋轉(zhuǎn)立方體”;

)

匕oeIse

Odd|

g。isCubeRoate=fa1se;

^Cubelnfo二"旋轉(zhuǎn)立方體”;

OddI

if(GUILayout.Button(SphereInfo,GUILayout.Hei

ght(50)))

U

g“f(!isSphereRoate)

°(

。isSphereRoate=true;

gSphereInfo="停止旋轉(zhuǎn)球體”;

。else

00{

。。。isSphereRoate=false;

oSphereInfo="旋轉(zhuǎn)球體";

。if(GUILayout.Button(”立即銷毀模型”,GUILayou

t.Height(50)))

Destroy(objCube);

Destroy(objSphere);

。}

}

通過標(biāo)簽獲得多個:

functionStart()

warobjs=GameObject.FindGameObjectsWithTag(HMyTag");

^objs[5].tag="TestTag"

for(varobjinobjs)

oDebug.Log("以"+obj.tag+”標(biāo)簽為游戲?qū)ο蟮拿Q1+

);

if(obj.tag==nTestTagu)

(

?Debug.Log("這個標(biāo)簽為TestTag");

。}

。if(obj.CompareTag("TestTag"))

1,{

。Debug.Log("obj這個對象附帶的標(biāo)簽為TestTag");

?)

)

)

4.通過腳本控制游戲?qū)ο?,改變游戲?qū)ο蟮奈恢茫D(zhuǎn)游戲?qū)ο?,縮放

游戲?qū)ο蟆?/p>

改變游戲?qū)ο蟮奈恢茫?/p>

源代碼:

usingUnityEngine;

usingSystem.Collections;

publieclassweizhi:MonoBehaviour{

?privatef1oatValue_X=0.Of;

?privatef1oatValue_Y=0.Of;

。privatefloatValue_Z=O.Of;

oprivateGameObjectobj;

e//Usethisforinitialization

voidStart(){

。obj=GameObject.Find("Cube");

b}

ovoidOnGUI(){

。oGUILayout.Box("移動立方體x軸");

eValue_X=GUILayout.HorizontalSIider(Va1ue_X,一

10.Of,10.Of,GUILayout.Width(200));

。GUILayout.Box("移動立方體y軸”);

VaIue—Y=GUILayout.Horizonta1Slider(Value_X-1

0.0f,10.0f,GUILayout.Width(200))?

6GUILayout.Box("移動立方體z軸”);

Va1ue—Z=GUILayout.Horizonta1SIider(Va1ue_Z,-10.

0fz10.Of,GUlLayout.Width(200));

ooobj.transform.position=newVector3(Value_X,Va1

ue』Value_Z);

eGUILayout.Label。'立方體當(dāng)前位置:"+obj.transform.posi

tion);

。}

}

旋轉(zhuǎn)游戲?qū)ο螅?/p>

代碼:

usingUnityEngine;

usingSystem.Collections;

pub1icclassxuanzhuan:MonoBehaviour{

oprivateGameObjectobjCube;

oprivateGameObjectobjCylinder;

privateintspeed=100;

voidStart(){

。objCube=GameObject.Find("Cube");。

ooobjCy1inder=GameObject.Find("Cylinder");

)

voidOnGUI(){

eif(GUILayout.RepeatButton("立方體沿x軸旋轉(zhuǎn),GUIL

ayout.Height(50)))

。e{。

objCube.transform.Rotate(Vector3.right*Tim

e.deltaTime*speed);

bJb

if(GUILayout.RepeatButton("立方體沿y軸旋轉(zhuǎn),GU

ILayout.Height(50)))

O{00

。oobjCube.transform.Rotate(Vector3.up*Time.deIta

Time*speed);。

)

ooif(GUlLayout.RepeatBu11on("立方體沿z軸旋轉(zhuǎn)”,GUILay

out.Height(50)))

objCube.transform.Rotate(Vector3.forward*Tim

e.deltaTime*speed);。

}

if(GUILayout.RepeatButton("立方體圍繞圓柱體旋轉(zhuǎn)

0,GUILayout.Height(50)))

。(

oobjCube.transform.RotateAroun

d(objCylinder.transform.position,\Zector3.up,Time.deltaTi

me*speed);

}ab

GUlLayout.Labe1("立方體旋轉(zhuǎn)角度"+objCub

e.transform.rotation);

3}

)

縮放游戲?qū)ο螅?/p>

Fr??Aspact?MaximizeonPlayStatsGizmos

X循縮放

Y軸縮放

9

Z軸縮放

代碼:

usingUnityEngine;

usingSystem.Collections;

publicclasssuofang:MonoBehaviour{

privateGameObjectobj;

privatefloatscaleX=1.Of;

oprivatef1oatscaleY=1.0f;

privatef1oatscaleZ=1.0f;

ovoidStart(){obj=GameObject.Find("Cube");}

ovoidOnGUl(){

GUILayout.Label("X軸縮放");

。sealeX=GUILayout.Horizonta1Slider(scaleX,10f,

2.0f,GUILayout.Width(100));

。。GUILayout.Label("Y軸縮放");

。scaleY=GUILayout.HorizontaISIider(scaleY,l.Of,2.0f,GUILa

yout.Width(100));

^GUILayout.LabeI(”Z軸縮放”);

?oscaleZ=GUILayout.HorizontaISlider(scaleZ,1.0f,2.0f,

GUILayout.Width(100));

obj.transform.IocaIScaIe=newVector3(sca

leX,scaleY.sealeZ);

)

)

實驗三使用游戲元素

一、實驗?zāi)康呐c規(guī)定

1.熟悉及掌握地形元素的使用方法。

2.熟悉及掌握光源的使用方法。

3.熟悉及掌握天空盒子的使用方法。

4.熟悉及掌握攝像機的使用方法。

二、實驗原理及知識點

在3D游戲世界中,通常會將很多豐富多彩的游戲元素融合至游戲中。游

戲元素是制作游戲的必備條件,它種類繁多并且作用也大不相同。游戲元素

可分為常用元素與不常用元素兩利J常用元素是游戲中一些比較重要的元素,

它們需要使用腳本來實現(xiàn)一些特殊功能,比如玩家控制的主角對象、需要襲

擊的敵人、通關(guān)游戲的必要條件等,因此常用元素將直接影響游戲是否可以

繼續(xù)進(jìn)行;而不常用元素在游戲世界中重要起裝飾作用,比如游戲中的天空、

云朵、樹木和地形等,這些元素不會影響到游戲的主線,但是它們可以提高

游戲的整體效果。

1游戲地形

玩過3D游戲的朋友應(yīng)當(dāng)對那些高低起伏的地形很有印象吧。無論是秀

麗的山川還是遼闊的平原,地形元素都會很生動地出現(xiàn)在游戲世界中,這些

高低起伏的地形是2D游戲無法媲美的。Unity中有一套非常好的地形編輯

器,它可以讓開發(fā)者實現(xiàn)游戲中任何復(fù)雜的地形,還可以制作地形上的一些

元素,比如樹木、草坪和石頭等。

1.1創(chuàng)建地形

下面開始學(xué)習(xí)如何創(chuàng)建游戲地形。一方面打開Unity,在導(dǎo)航菜單欄

中選擇"Terrain"-"CreateTerrain”菜單項,創(chuàng)建一個游戲地形。

?UnityFileEditAssetsGameObjectComponentTerrain[WindowHelp

CreateTerrain

ImportHeightmap-Raw...

ExportHeightmap-Raw...

卷SceneSetResolution...

texiund

MassPlaceTrees...

FlattenHeightmap...

RefreshTreeandDetailPrototypes

圖1"Terrain"菜單

1.2地形參數(shù)

地形參數(shù)涉及地形的寬度、高度、長度、分辨率和高度圖等。創(chuàng)建完地

形后,可任意修改它們的參數(shù)。在Unity導(dǎo)航菜單欄中選擇“Terrain”

f"SetResolution”菜單項,此時將彈出"SetHeightmapreso

lution”窗口,在每一個地形參數(shù)右側(cè)直接輸入數(shù)值即可修改它,然后在

界面下點擊右下角的“SetReso1ution”按鈕,即可將當(dāng)前設(shè)立的所有

地形參數(shù)應(yīng)用到地形當(dāng)中。

ICSer

Pleasenotethatmodifyingtheresolutionwillclearthehei§

TerrainWidth2000

TerrainHeight600

TerrainLength2000

HcfghrmapResolution513

DetailResolution1024

DetailResolutionPerPatch8

ControlTextureResolution512

BaseTextureResolution1024

SetResolutFon

圖2設(shè)立地形參數(shù)

1.3編輯地形

到目前

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論