![2023年河北工業(yè)大學(xué)U三D實驗報告_第1頁](http://file4.renrendoc.com/view/9f71e22a7b20b473513631cbb95b56df/9f71e22a7b20b473513631cbb95b56df1.gif)
![2023年河北工業(yè)大學(xué)U三D實驗報告_第2頁](http://file4.renrendoc.com/view/9f71e22a7b20b473513631cbb95b56df/9f71e22a7b20b473513631cbb95b56df2.gif)
![2023年河北工業(yè)大學(xué)U三D實驗報告_第3頁](http://file4.renrendoc.com/view/9f71e22a7b20b473513631cbb95b56df/9f71e22a7b20b473513631cbb95b56df3.gif)
![2023年河北工業(yè)大學(xué)U三D實驗報告_第4頁](http://file4.renrendoc.com/view/9f71e22a7b20b473513631cbb95b56df/9f71e22a7b20b473513631cbb95b56df4.gif)
![2023年河北工業(yè)大學(xué)U三D實驗報告_第5頁](http://file4.renrendoc.com/view/9f71e22a7b20b473513631cbb95b56df/9f71e22a7b20b473513631cbb95b56df5.gif)
版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國紫外線凈化器市場調(diào)查研究報告
- 2025至2030年中國空氣綜合治理超濃縮液數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國空調(diào)裝配生產(chǎn)線數(shù)據(jù)監(jiān)測研究報告
- 2025年新法克毒靈項目可行性研究報告
- 2025至2030年中國三層減震墊鐵數(shù)據(jù)監(jiān)測研究報告
- 2025年中國網(wǎng)箱托盤市場調(diào)查研究報告
- 專業(yè)音響調(diào)試與安裝服務(wù)考核試卷
- 二零二五年度創(chuàng)業(yè)投資公司股權(quán)轉(zhuǎn)讓及投資協(xié)議
- 批發(fā)業(yè)客戶數(shù)據(jù)分析與精準(zhǔn)營銷考核試卷
- 2025-2030年文化主題畫框行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報告
- 小學(xué)六年級數(shù)學(xué)上冊《簡便計算》練習(xí)題(310題-附答案)
- 2024年河南省《輔警招聘考試必刷500題》考試題庫及答案【全優(yōu)】
- 安全隱患報告和舉報獎勵制度
- 2024年中國養(yǎng)老產(chǎn)業(yè)商學(xué)研究報告-銀發(fā)經(jīng)濟專題
- 高教版2023年中職教科書《語文》(基礎(chǔ)模塊)下冊教案全冊
- 人教版英語七年級上冊閱讀理解專項訓(xùn)練16篇(含答案)
- 古樹名木保護建設(shè)項目可行性研究報告
- DB50-T 867.36-2022 安全生產(chǎn)技術(shù)規(guī)范+第36+部分:倉儲企業(yè)
- 幼小銜接學(xué)拼音
- 運動技能學(xué)習(xí)與控制課件第九章運動技能學(xué)習(xí)概述
- 在全縣生豬生產(chǎn)統(tǒng)計監(jiān)測工作會議的講話范文(通用3篇)
評論
0/150
提交評論