




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、計(jì)算機(jī)游戲程序設(shè)計(jì)實(shí)驗(yàn) 1-4報(bào)告實(shí)驗(yàn)一GUI 游戲界面的實(shí)現(xiàn)一、實(shí)驗(yàn)?zāi)康呐c要求1. 熟悉及掌握GUI 的高級(jí)控件,以及用法。2. 掌握GUI 自定義皮膚用法3. 熟悉GUILayout的使用。4. 熟悉2D 貼圖的繪制和幀動(dòng)畫的實(shí)現(xiàn)方法。二、實(shí)驗(yàn)原理及知識(shí)點(diǎn)在游戲的整個(gè)開發(fā)過程中,游戲界面設(shè)計(jì)占據(jù)非常重要的地位。因?yàn)橛螒騿?dòng)后,第一個(gè)映入玩家眼簾的就是游戲的UI 界面。 UI 界面主要包括貼圖, 按鈕和高級(jí)控件等。通常游戲界面的展現(xiàn)方式有很多種,大多數(shù)都由自定義圖形界面組成。Unity 為開發(fā)者提供了一套非常完善的圖形化界面引擎,它包括常見的游戲窗口、文本框、輸入框、拖動(dòng)條、按鈕、貼圖框等,
2、無論是做軟件還是做游戲,都可以很方便地使用。另外, Unity 提供了界面自定義皮膚的功能??丶粌H可以使用默認(rèn)的皮膚, 還可以自定義皮膚,自定義皮膚不僅可以美化游戲界面,還可以提升游戲品質(zhì)。Unity 游戲界面主要由GUI 完成。 在本章中,我們將使用JavaScript腳本向讀者詳細(xì)介紹Unity 中有關(guān) GUI 界面的所有高級(jí)控件。2 . GUI 高級(jí)控件系統(tǒng)高級(jí)UI 控件已經(jīng)成為游戲開發(fā)中不可缺少的一部分,高級(jí)界面由系統(tǒng)提供,所以運(yùn)行效率要遠(yuǎn)遠(yuǎn)高于低級(jí)界面(高級(jí)界面為系統(tǒng)實(shí)現(xiàn),低級(jí)界面為自己手動(dòng)實(shí)現(xiàn))。拿按鈕控件來說吧,不使用系統(tǒng)提供的按鈕控件,我們也可以使用低級(jí)界面模擬實(shí)現(xiàn)按鈕的功能
3、。不過, 低級(jí)界面實(shí)現(xiàn)的 “按鈕”沒有高級(jí)界面實(shí)現(xiàn)的效率高,但是低級(jí)界面制作的“按鈕”比較靈活,可以任意修改。GUI 高級(jí)控件的種類非常繁多,包括標(biāo)簽、按鈕、輸入框和拖動(dòng)條等。他們可用于任何游戲或軟件的界面研發(fā)。GUI 高級(jí)控件的應(yīng)用也非常廣泛,比如網(wǎng)絡(luò)游戲中輸入賬號(hào)與密碼的提示框,通關(guān)游戲后上傳游戲積分的按鈕,創(chuàng)建角色時(shí)輸入的角色信息等。下面將分別向讀者介紹GUI 高級(jí)控件的相關(guān)用法。2.1 Label 控件使用 Label 控件(標(biāo)簽控件),可以在游戲界面中以文本的形式展示出一段字符串信息。使用 Label 控件, 我們不僅可以輸入字符串,還可以貼圖。2.2 Button 控件在開發(fā)中,B
4、utton 控件(按鈕控件)是十分常見的控件之一,可以用來判斷用戶在程序中的一些操作行為,比如對(duì)話框中的“確定”和“取消”按 鈕。按鈕共有3 個(gè)基本狀態(tài)組成:未點(diǎn)擊狀態(tài)、擊中狀態(tài)、點(diǎn)擊后狀態(tài)。一般情況下,游戲界面的按鈕只監(jiān)聽“未點(diǎn)擊狀態(tài)”和“點(diǎn)擊后狀態(tài)”。按照展現(xiàn)方式,按鈕可以分為兩種: “普通按鈕”和“圖片按鈕”。普通按鈕為系統(tǒng)默認(rèn)顯示的按鈕,而圖片按鈕可以設(shè)定按鈕的背景圖案。2.3 TextField 控件TextField 控件主要用于監(jiān)聽用戶輸入的信息,其應(yīng)用非常普遍,比如在游戲登陸界面中,玩家輸入用戶名和密碼后,點(diǎn)擊“確認(rèn)”按鈕判斷其輸入 是否正確,或者游戲通關(guān)后填寫勝利者姓名與輸入
5、相關(guān)的游戲信息等。一般情況下,使用 GUI.TextField ()方法顯示輸入框,該方法的返回值 為用戶輸入的字符串信息。使用 GUI.PasswordField ()方法,可以將用戶輸 入的信息顯示為任意字符串,一般在輸入密碼時(shí)將密碼以“* ”的形式顯示。后面的參數(shù)“*”【 0】用來將輸入的字符串顯示為“* ”。2.4 Slider 控件Slider 控件由滑塊和滑動(dòng)條組成。使用Slider 控件,可以計(jì)算出滑塊在滑動(dòng)過程中占整個(gè)滑動(dòng)條的比例。如果滑動(dòng)條的整體長(zhǎng)度為100,則滑塊滑動(dòng)的范圍就是0 至 100 。按照展示方式,滑動(dòng)條可分為兩種:一種為水平滑動(dòng)條 ( HorizontalSli
6、der) ,另一種為垂直滑動(dòng)條(VerticalSlider) ,它們之間的用法完全相同。在開發(fā)中,我們常使用滑動(dòng)條來調(diào)節(jié)音量或者顏色等。2.5 ScrollView 控件如果游戲界面中的GUI 控件過多,超出了屏幕的顯示范圍,就需要使用 ScrollView 控件來完成它的展示效果。ScrollView 控件可設(shè)定一個(gè)滾動(dòng)顯示區(qū)域。如果橫向或縱向的GUI 控件超出了其顯示區(qū)域。視圖下方或者右方將會(huì)出現(xiàn)滾動(dòng)條。在開發(fā)中使用ScrollView 控件的情況非常普遍,比如如果游戲中幫助信息或者關(guān)于信息過長(zhǎng),就可以使用滾動(dòng)條來查看相關(guān)信息。2.6 群組控件(GroupView 控件)群組視圖(Gro
7、upView 控件)可將多個(gè)視圖全部放在一個(gè)群組當(dāng)中。將視圖添加進(jìn)群組當(dāng)中后,群組中任何視圖的坐標(biāo)都是相對(duì)坐標(biāo),它是相對(duì)群組視圖左上角的坐標(biāo)。修改群組視圖坐標(biāo)后,群組中所有視圖的坐標(biāo)都會(huì)跟著修改。推薦使用群組視圖來制作游戲界面,因?yàn)樵O(shè)備的屏幕尺寸不同,這樣做可以避免對(duì)坐標(biāo)進(jìn)行多次修改的麻煩。2.7 窗口窗口在游戲開發(fā)中并不陌生,所有視圖都需要依賴窗口來顯示,我們可以把窗口理解為視圖的父類。前面我們介紹了各式各樣的游戲視圖,它們都屬于窗口的子類。游戲界面可以由若干個(gè)窗口組成,窗口又由若干個(gè)視圖組成。創(chuàng)建窗口時(shí)需要設(shè)定它的顯示區(qū)域,在窗口中可以添加任意組件,前提是組件的顯示區(qū)域必須在窗口當(dāng)中,否則
8、無法顯示。另外, 窗口中所有控件的坐標(biāo)均采取相對(duì)坐標(biāo),相對(duì)窗口左上角的坐標(biāo)。2.9 GUI Skin通過之前章節(jié)的學(xué)習(xí),我想大家已經(jīng)掌握了Unity 大部分的GUI 控件,但是直接使用這些控件開發(fā)游戲還遠(yuǎn)遠(yuǎn)不夠,因?yàn)橄到y(tǒng)默認(rèn)的界面實(shí)在過于粗糙與單調(diào)。為了讓自己的游戲界面活靈活現(xiàn),我們需要使用GUI Skin 為控件添加一個(gè)漂亮的皮膚。3 GUILayout 游戲界面布局游戲界面的制作效果有很多中,有復(fù)雜絢麗的界面,也有簡(jiǎn)單明了的界面,而設(shè)計(jì)方式的仁者見仁,智者見智。在跨平臺(tái)游戲界面開發(fā)中,最麻煩的事就是各個(gè)平臺(tái)的分辨率不一樣,甚至相同平臺(tái)的分辨率也不一樣,這無疑給移植造成非常大的麻煩。因此,
9、在制作游戲界面時(shí),使用絕對(duì)坐標(biāo)值是相當(dāng)危險(xiǎn)的一件事。因?yàn)槿绻缙脚_(tái)移植的話,分辨率發(fā)生了改變,開發(fā)者就得為其重新設(shè)計(jì)坐標(biāo),這在開發(fā)效率上將大打折扣。為了避免后期對(duì)坐標(biāo)重新進(jìn)行計(jì)算,前期制作界面時(shí)可以考慮自適應(yīng)屏幕布局,GUI 為開發(fā)者提供了游戲布局的概念,并且在布局的過程中所有的坐標(biāo)點(diǎn)都是對(duì)稱坐標(biāo),所以使用GUI 游戲界面布局來制作界面將更有效地實(shí)現(xiàn)自適應(yīng)屏幕。3.1 GUI 與 GUILayout 的區(qū)別通過之前的學(xué)習(xí),我相信大家對(duì)GUI 應(yīng)該并不陌生了,那么 GUILayout是什么東西呢?它是游戲界面的布局。從命名中就可以看到這兩個(gè)東西非常相像,但是在使用過程中兩者還是存在一定區(qū)別的。使
10、用GUI繪制控件的時(shí)候,需要設(shè)置控件的Rect ()方法,也就是說需要設(shè)定控件的整體顯示區(qū)域。這樣設(shè)置的控件非常不靈活,因?yàn)樗淖鴺?biāo)以及大小已經(jīng)固定死了,這是如果控件中的內(nèi)容長(zhǎng)度發(fā)生改變,就會(huì)直接影響展示效果。例如, 在界面中繪制一個(gè)按鈕時(shí),按鈕中的顯示文本剛好填充在整個(gè)按鈕當(dāng)中,如果動(dòng)態(tài)加長(zhǎng)文本的顯示長(zhǎng)度,就會(huì)超出按鈕的顯示范圍,使按鈕控件變得不倫不類。我們需要制作控件的自適應(yīng),所以不能使用Rect()方法固定控件的顯示區(qū)域,而是需要使用界面布局制作界面。使用 GUILayout 來制作界面,可以很方便的為我們解決上述難題。使用GUI 制作界面的時(shí)候,需要給每一個(gè)控件設(shè)定顯示區(qū)域,系統(tǒng)會(huì)自動(dòng)
11、幫我們計(jì)算控件的顯示區(qū)域,并且保證他們不會(huì)重合。(注意之前介紹的大部分GUI 控件都可以使用GUILayout 進(jìn)行繪制)3.2 線性布局線性布局是以線性連續(xù)排列的形式將GUI 控件有規(guī)律的顯示在屏幕中,共分為兩種:一種為水平線性布局,另一種為垂直線性布局。默認(rèn)的界 面是以垂直線性布局的方式來排列。創(chuàng)建水平線性布局時(shí),首先需要使用BeginHorizontal ()方法,然后將控件添加至線性布局當(dāng)中,最后使用EndHorizontal ()方法來結(jié)束當(dāng)前線性布局。而如果使用垂直線性布局,則需要使用BeginVertical ()方法與EndVertical ()方法。無論是水平線性布局還是垂直
12、線性布局,都可以使用嵌套的形式來制作游戲界面,也就是說,父類布局中可以繼續(xù)嵌套一個(gè)子類布局,子類布局完全受父類布局的限制。善用布局之間的嵌套,可以方便我們制作更為復(fù)雜的游戲界面。3.3 控件偏移布局與布局之間都是以一種線性方式緊密排列的,無法直接修改布局當(dāng)中兩個(gè)相連控件的距離,為了解決這個(gè)問題,就需要使用空間偏移。在控件中使用 Space0方法可以設(shè)置控件之間的偏移量。4 2D 貼圖與幀動(dòng)畫2D 貼圖好比在屏幕中繪制了一張靜態(tài)圖片,其繪制方式有兩種,第一種由 GUI 繪制,第二種是將貼圖以材質(zhì)的形式繪制在游戲?qū)ο笾?,在本?jié)中,我們將著重介紹第一種方式。幀動(dòng)畫的實(shí)現(xiàn)原理就是使用若干張靜態(tài)圖片以一
13、定的時(shí)間一幀一幀地在屏幕中切換播放,好比在屏幕中預(yù)先設(shè)定一個(gè)現(xiàn)實(shí)動(dòng)畫的區(qū)域。然后將圖片在這個(gè)現(xiàn)實(shí)區(qū)域中頻繁切換播放。由于繪制的圖片有規(guī)律的切換播放,給人們帶來了視覺的假象,感覺就像播放動(dòng)畫一樣。4.1 繪制貼圖要在屏幕中繪制一張靜態(tài)貼圖,需要使用GUI.DrawTextture() 方法,該方法可設(shè)定圖片的顯示位置、縮放比例和渲染混合等,該方法的原型如下:其中第一個(gè)參數(shù)表示圖片的繪制區(qū)域,第二個(gè)參數(shù)表示繪制圖片的圖像, 第 3 個(gè)參數(shù)表示圖片的縮放模式,第四個(gè)參數(shù)表示的是否開啟圖片混合模式,第五個(gè)參數(shù)表示圖片縮放寬高的比例。在Project視圖中將需要加載的圖片存儲(chǔ)在根目錄“ Resource
14、s中。需 要說明的是,一定要將加載的圖片保存在“ Resources文件夾中,否則程序 將無法識(shí)別。Resources.Load(方法和Resources.LoadAll(訪法的參數(shù)均為資源 文件夾的完整路徑,只不過前者返回的事讀取的資源對(duì)象,后者返回的是資源對(duì)象的數(shù)組。4.2 繪制動(dòng)畫本節(jié)中我們開始學(xué)習(xí)幀動(dòng)畫的繪制。首先需要一組幀動(dòng)畫的資源,在這里我們選擇一套2D 人物四宮格行走圖,在繪制幀動(dòng)畫之前,我們需要學(xué)習(xí)幀動(dòng)畫的繪制原理:首先需要在屏幕中設(shè)定一個(gè)顯示區(qū)域,然后將動(dòng)畫中的每一個(gè)幀動(dòng)畫按照固定的時(shí)間在這個(gè)區(qū)域中按順序切換,繼而實(shí)現(xiàn)動(dòng)畫的播放。這里我們使用程序?qū)?dòng)畫資源存儲(chǔ)在動(dòng)畫數(shù)組當(dāng)中,
15、然后設(shè)定動(dòng)畫的刷新時(shí)間,每次刷新動(dòng)畫時(shí)將在原有的顯示區(qū)域中繪制下一幀圖片,到了最后一幀則從第一幀重新開始,以此類推你。4.3 實(shí)例人物移動(dòng)結(jié)合 2D 幀動(dòng)畫的繪制原理,本節(jié)我們將制作一個(gè)游戲?qū)嵗Ч鐖D4.4 所示。在屏幕中共繪制了四個(gè)按鈕,通過點(diǎn)擊這四個(gè)按鈕來控制主角的移動(dòng),并且播放主角在對(duì)應(yīng)方向上的行走的動(dòng)畫。程序需要監(jiān)聽用戶出發(fā)的按鈕來切換動(dòng)畫方向,比如當(dāng)用戶點(diǎn)擊 “向上”按鈕時(shí),將播放主角向上走的動(dòng)畫。我們使用x、 y 全局變量來記錄當(dāng)前主角的坐標(biāo),上下行走為加減x 坐標(biāo),左右行走為加減y 坐標(biāo),最后根據(jù)主角的x、 y 坐標(biāo)來繪制但前動(dòng)畫在屏幕中的位置,從而實(shí)現(xiàn)控制主角向四個(gè)方向行走
16、。5 本部分內(nèi)容小結(jié)本部分首先介紹了Unity 中 GUI 界面的相關(guān)組件以及自定義皮膚的實(shí)現(xiàn)方式,其中每一個(gè)GUI 高級(jí)組件都配備了一個(gè)小例子供讀者學(xué)習(xí);然后介紹了 GUI 與 GUILayout 的區(qū)別, 已介入和使用GUILayout 布局來制作界面;接著介紹了使用GUI 繪制 2D 貼圖與動(dòng)畫,以及如何控制主角移動(dòng)的游戲?qū)嵗?最后通過制作一個(gè)游戲主界面,回顧了前面所學(xué)的游戲界面的相關(guān)內(nèi)容。 請(qǐng)大家認(rèn)真閱讀本章內(nèi)容,打好游戲界面設(shè)計(jì)的基礎(chǔ),為后面深入學(xué)習(xí)做好準(zhǔn)備。三、實(shí)驗(yàn)內(nèi)容及步驟1. 熟悉 GUI 高級(jí)控件,練習(xí)使用GUI 的高級(jí)控件制作23 個(gè)游戲界面。2. 練習(xí)使用GUI 自定義
17、皮膚,實(shí)現(xiàn)游戲界面的字體,背景顏色等設(shè)置。3. 熟悉 GUILayout 的使用,聯(lián)系使用GUILayout 的水平線性布局和垂直線性布局,并加適當(dāng)偏移。4. 熟悉 2D 貼圖的繪制和幀動(dòng)畫的實(shí)現(xiàn)方法,練習(xí)在界面中繪制靜態(tài)圖片和動(dòng)畫。代碼如下:#pragma strict var str:String;var mm:String;function Start () function Update () function OnGUI()GUI.BeginGroup(Rect(Screen.width/2-150,Screen.height/2-100,400,300);GUI.Label(Rec
18、t(20,20,80,30),噪單:");if(GUI.Button(Rect(100,40,60,20),"自動(dòng)漫游")Application.LoadLevel("自動(dòng)漫游)if(GUI.Button(Rect(100,10,60,20),"音頻播放")Application.LoadLevel("音頻播放");if(GUI.Button(Rect(100,70,60,20),"畫線")Application.LoadLevel("畫線");if(GUI.Button(R
19、ect(100,100,60,20),"視頻播放")Application.LoadLevel("視頻播放");GUI.EndGroup();編輯版 word實(shí)驗(yàn)二 Unity游戲腳本一、實(shí)驗(yàn)?zāi)康呐c要求1 .熟悉及掌握MonoDevelop腳本編輯器的使用方法。2 . Unity腳本的生命周期。3 .熟練使用腳本來操作游戲?qū)ο?。二、?shí)驗(yàn)原理及知識(shí)點(diǎn)Unity游戲腳本在整個(gè)游戲開發(fā)中可以說是關(guān)鍵要素,游戲?qū)ο笾g任何邏輯的判斷都需要通過腳本來完成。如果說游戲貼圖、模型資源的好壞決定一個(gè)游戲的視覺品味,那么腳本將直接決定這個(gè)游戲的內(nèi)在質(zhì)量,決定這個(gè)游戲好玩與
20、否。游戲腳本與其他游戲組件用法相同,必須綁定在游戲?qū)ο笾胁拍軋?zhí)行它的生命周期。Unity 一共支持3種語言來編寫腳本,分別是 JavaScript C#、Boo,這3種語言不分好壞,用哪一種來編寫都可以達(dá)到同樣目的。從編程技巧與難度上來講,JavaScript更容易上手一些,建議初學(xué)者使用 JavaScript進(jìn)行入門 階段學(xué)習(xí),但是進(jìn)階階段推薦使用C#語言來編寫腳本,因?yàn)?C#語言在編程思想上更符合 Unity引擎的原理。由于與傳統(tǒng)語言相比,Boo語言的語法更為怪異,所以開發(fā)中幾乎不會(huì)用到它。1 MonoDevelop 腳本編輯器Unity 可部署在Windows 與 Mac OS X 梁總
21、操作系統(tǒng)下,所以 Unity 需要一個(gè)跨平臺(tái)的腳本編輯器。MonoDevelop 腳本編輯器并不是Unity 公司所研發(fā)的。 它是一個(gè)開源項(xiàng)目,任何人或公司都可以使用。由于該編輯器具有強(qiáng)大的跨平臺(tái)功能,并且使用起來非常方便,所以很快被Unity 公司作為核心腳本開發(fā)環(huán)境使用。2 Unity 腳本的生命周期Unity 腳本從喚醒到銷毀有著一套比較完善的生命周期,添加任何腳本都必須遵守自身生命周期法則。下面介紹一下生命周期中有系統(tǒng)自身調(diào)用的幾個(gè)比較重要的方法。function Awake() 。腳本喚醒,此方法為系統(tǒng)執(zhí)行的第一個(gè)方法,用于腳本的初始化,在腳本的生命周期中只執(zhí)行一次。function
22、 Start()。此方法在Awake()方法之后、Update。方法之前執(zhí)行,并且只執(zhí)行一次。function Update() 。正常更新,用于更新邏輯。此方法每幀都會(huì)由系統(tǒng)自動(dòng)調(diào)用一次。function LateUpdate()。推遲更新,此方法在Update。方法執(zhí)行完后調(diào)用,同樣每一幀都調(diào)用。function FixedUpdate() 。固定更新,固定更新常用于移動(dòng)模型等操作。因?yàn)楣潭ǜ旅恳粠{(diào)用的時(shí)間相隔都是完全一樣的,所以模型的移動(dòng)過程會(huì)比較均勻。function OnGUI() 。繪制界面。這個(gè)方法大家應(yīng)該不會(huì)陌生,因?yàn)樵诘?章中已經(jīng)做過很多例子了。它和Update()方法一
23、樣,每一幀都在調(diào)用,只是它是用來繪制界面的。function OnDestroy() 。當(dāng)前腳本銷毀時(shí)調(diào)用。3 利用腳本來操作游戲?qū)ο笤?Unity 場(chǎng)景中出現(xiàn)的所有實(shí)體都屬于游戲?qū)ο螅热缦到y(tǒng)自帶的立方體、球體以及由美工制作的.Fbx游戲模型等。游戲?qū)ο笈c腳本聯(lián)系非常緊密,因?yàn)橛螒驅(qū)ο笾g的一切交互都需要使用腳本來完成。下面我們開始學(xué)習(xí)如何使用腳本來操作游戲?qū)ο?。使用腳本來調(diào)用游戲?qū)ο蟮姆绞接袃煞N,它們是:可以將腳本綁定在一個(gè)游戲?qū)ο笊砩?,也可以在代碼中動(dòng)態(tài)綁定腳本和刪除腳本。任何一個(gè)游戲?qū)ο蠖伎梢酝瑫r(shí)綁定多條游戲腳本,并且這些腳本互不干涉,各自完成各自的生命周期。3.1 創(chuàng)建游戲?qū)ο髣?chuàng)建游
24、戲?qū)ο蟮姆绞焦灿幸幌聝煞N。第一種為將模型預(yù)先放入Hierarchy視圖中,然后在場(chǎng)景視圖中任意拖動(dòng)該模型在3D 世界中的位置,運(yùn)行游戲后該模型就會(huì)出現(xiàn)在Game視圖中。第二種為在代碼中根據(jù)條件動(dòng)態(tài)創(chuàng)建與刪除游戲?qū)ο?,這種處理方式靈活性比較高。3.2 獲取游戲?qū)ο笤谀_本中獲取游戲?qū)ο蟮姆绞揭还灿腥N:第一種為通過對(duì)象名稱獲取,第二種為通過標(biāo)簽(tag)獲取單個(gè)游戲?qū)ο螅谌N為通過相同標(biāo)簽獲取多組游戲?qū)ο蟆?.3 添加組件與修改組件新創(chuàng)建的游戲?qū)ο蟊旧聿⒉痪邆淙魏翁匦?,為了讓它具備一些功能,就必須給其添加游戲組件。游戲組件的種類非常多,常見的游戲組件有腳本類、網(wǎng)格類、粒子類、物理類、聲音類和渲染
25、類等。本節(jié)中我們將學(xué)習(xí)如何在代碼中添加與修改游戲組件。添加游戲組件時(shí),可以使用AddComponent()方法。 由于組件自身沒有對(duì)應(yīng)的刪除方法,需要使用父類執(zhí)行Object.Destroy()方法才能刪除它,其中該方法的參數(shù)為需要?jiǎng)h除的游戲?qū)ο蠡蛴螒蚪M件。在 刪除某一游戲?qū)ο髸r(shí),將連帶該對(duì)象中的所有組件一并刪除。3.4 克隆游戲?qū)ο罂寺∮螒驅(qū)ο笈c創(chuàng)建游戲?qū)ο笤谛Ч某尸F(xiàn)方式是完全一樣的,但是從執(zhí)行效率上來講,克隆游戲?qū)ο蟮男室摺J褂媚_本克隆游戲?qū)ο笤谟螒蛑袘?yīng)用非常廣泛,常用于一些完全相同并且數(shù)量龐大的游戲?qū)ο螅热缬螒蛑邪l(fā)射的子彈對(duì)象,每一顆子彈對(duì)象是完全一樣的,每一次發(fā)射子彈都會(huì)新克隆
26、一個(gè)子彈對(duì)象,并且讓克隆的子彈對(duì)象完成自己的生命周期。在代碼中,需要使用Instantiate。方法克隆游戲?qū)ο蟆? 用腳本來控制對(duì)象的變換在3D世界中,任何一個(gè)游戲?qū)ο笤趧?chuàng)建的時(shí)候都會(huì)附帶Transform(變換 )組建,并且該組建是無法刪除的。Transform 面板中一共包含 3個(gè)屬性:Position(位置)、Rotation(旋轉(zhuǎn))和 Scaled放)。在場(chǎng)景中使用移動(dòng)工具來拖動(dòng)和旋轉(zhuǎn)模型,即可直接在 Transform 面板中看到編輯后的值,此外也可在Transform 面板的編輯框中修改對(duì)象的位置、旋轉(zhuǎn)方式和縮放的數(shù)值。4.1 改變游戲?qū)ο蟮奈恢迷?3D 世界中,任何一個(gè)模型的三
27、維坐標(biāo)都保存在Vector3 容器中,該容器將記錄模型在x 軸、 y 軸和 z 軸方向的坐標(biāo)。一旦在程序中修改該模型在Vector3容器中的坐標(biāo),那么Scene視圖中模型的位置將發(fā)生改變。4.2 旋轉(zhuǎn)游戲?qū)ο竽P偷男D(zhuǎn)方式可分為2 種: 第一種為自身旋轉(zhuǎn),意思是模型沿著自己的 x 軸, y 軸或 z 軸方向旋轉(zhuǎn);第二種為圍繞旋轉(zhuǎn),意思是模型圍繞著坐標(biāo)系中的抹一點(diǎn)或摸一個(gè)游戲?qū)ο笳w來做旋轉(zhuǎn)。下面簡(jiǎn)要介紹一下經(jīng)常會(huì)用到的一些重要方法和參數(shù)。? transform.Rotate():該方法用于設(shè)置模型繞自身旋轉(zhuǎn),起參數(shù)為旋轉(zhuǎn)的速度與旋轉(zhuǎn)的方向。? transform.RRotateAround()
28、:該方法用于設(shè)置模型圍繞某一個(gè)點(diǎn)旋轉(zhuǎn)。? Time.deltaTime:用于記錄上一幀所消耗的時(shí)間,這里用作模型旋轉(zhuǎn)的速度系數(shù)。?Vector3.right: x 軸方向。?Vector3.up: y 軸方向。? Vector3.forward: z 軸方向。當(dāng)模型繞自身旋轉(zhuǎn)時(shí),可以使用objCube.transform.Rotate()方法,當(dāng)模型 圍繞抹一點(diǎn)旋轉(zhuǎn)時(shí),則使用 objCube.transform.RotateAround()方法。4.3 平移游戲?qū)ο笃揭频暮x是模型在原有位置的基礎(chǔ)上繼續(xù)移動(dòng),在代碼中可以使用transform.Translate()方法來實(shí)現(xiàn),此方法的唯一參數(shù)
29、為平移模型的方向。4.4 縮放游戲?qū)ο笤?Unity 中,可以通過代碼動(dòng)態(tài)縮放游戲中的模型。主要有三種縮放方式:沿 x 軸縮放、沿y 軸縮放、沿z 軸縮放。每個(gè)軸都有自身的縮放洗漱,模型默認(rèn)的縮放系數(shù)是1,就是模型原有大小,因此要在程序中實(shí)現(xiàn)模型的縮放,只需要?jiǎng)討B(tài)修改模型的縮放系數(shù)即可。三、實(shí)驗(yàn)內(nèi)容及步驟1. 熟悉 MonoDevelop 腳本編輯器的使用方法,聯(lián)系實(shí)現(xiàn)腳本調(diào)試。設(shè)置默認(rèn)腳本的打開方式:編輯版 wordI Unity Prcfsren11GeneralExternaliColorsKgy寸Caiche Server Ext«rnal Too IsExternal Sc
30、rips Editor1 Mcnini!D»v»l-ap fbuak-vn) 口Editor Atta chi ipqVTtTi-riQft ApplsCritionOpen byaxuhsienP ur iiiurii 仁 wTtPl Oiff/Mtfp Mu '*No support-ed Aset server diff 廿0* were f«udr Picciae inst-iBilP -sni-e of tiie fnilsKiinq tncPs :-SoLiM-ceGear L3 ffMerge-TkDifF- P4Mer ae- rlp|
31、187;rMeli de- WihMergAh-dpid bDK Ld工qtJQh如口m_.rOS Xcod v 君 iJC kiipUQi t卡腳本調(diào)試:2.編程實(shí)現(xiàn)創(chuàng)建游戲?qū)ο螅⒎襟w,球體),給游戲?qū)ο竺淖冾伨庉嫲鎤ord色,添加剛體組件。源代碼:using UnityEngine;using System.Collections;public class duixiang : MonoBehaviour / Use this for initializationvoid Start () / Update is called once per framevoid Update (
32、) void OnGUI()if(GUILayout.Button(" 創(chuàng)建立方體",GUILayout.Height(50)GameObjectobjCube=GameObject.CreatePrimitive(PrimitiveType.Cube);objCube.AddComponent<Rigidbody>();objC="Cube"objCube.renderer.material.color=Color.blue;objCube.transform.position=new Vector3(0.0f,10.0f,
33、0.0f);if(GUILayout.Button(" 創(chuàng)建球體",GUILayout.Height(50)GameObjectobjSphere=GameObject.CreatePrimitive(PrimitiveType.Sphere);objSphere.AddComponent<Rigidbody>();objS="Sphere"objSphere.renderer.material.color=Color.red;objSphere.transform.position=new Vector3(0.0f,10
34、.0f,0.0f);3.分別通過名稱、標(biāo)簽獲得游戲?qū)ο?,通過標(biāo)簽獲得多個(gè)游戲?qū)ο蟆Mㄟ^名稱:源代碼:public class find : MonoBehaviour private GameObject objCube;private GameObject objSphere;private bool isCubeRoate=false;private bool isSphereRoate=false;private string CubeInfo="旋轉(zhuǎn)立方體" private string SphereInfo="旋轉(zhuǎn)球體"/ Use this f
35、or initializationvoid Start () objCube=GameObject.Find("Cube");objSphere=GameObject.Find("Sphere");/ Update is called once per framevoid Update () if(isCubeRoate)if(objCube)objCube.transform.Rotate(0.0f,Time.deltaTime*200,0.0f);if(isSphereRoate)if(objSphere)objSphere.transform.Ro
36、tate(0.0f,Time.deltaTime*200,0.0f);void OnGUI()if(GUILayout.Button(CubeInfo,GUILayout.Height(50)if(!isCubeRoate)isCubeRoate = true;CubeInfo = " 停止旋轉(zhuǎn)立方體"elseisCubeRoate = false;CubeInfo = " 旋轉(zhuǎn)立方體"if(GUILayout.Button(SphereInfo,GUILayout.Height(50)if(!isSphereRoate)isSphereRoate =
37、true;SphereInfo = "停止旋轉(zhuǎn)球體"elseisSphereRoate = false;SphereInfo = "旋轉(zhuǎn)球體"if(GUILayout.Button(" 立即銷毀模型",GUILayout.Height(50)Destroy (objCube);Destroy (objSphere);通過標(biāo)簽:源代碼using UnityEngine;using System.Collections;public class find : MonoBehaviour private GameObject objCube
38、;private GameObject objSphere;private bool isCubeRoate=false;private bool isSphereRoate=false;private string CubeInfo="旋轉(zhuǎn)立方體"private string SphereInfo="旋轉(zhuǎn)球體 "/ Use this for initializationvoid Start () objCube=GameObject.FindWithTag("MyTag");objSphere=GameObject.Find(&qu
39、ot;Sphere");/ Update is called once per frame void Update () if(isCubeRoate)if(objCube)objCube.transform.Rotate(0.0f,Time.deltaTime*200,0.0f);if(isSphereRoate)if(objSphere)objSphere.transform.Rotate(0.0f,Time.deltaTime*200,0.0f);void OnGUI()if(GUILayout.Button(CubeInfo,GUILayout.Height(50)if(!i
40、sCubeRoate)isCubeRoate = true;CubeInfo = " 停止旋轉(zhuǎn)立方體"elseisCubeRoate = false;CubeInfo = " 旋轉(zhuǎn)立方體"if(GUILayout.Button(SphereInfo,GUILayout.Height(50)if(!isSphereRoate)isSphereRoate = true;Sphereinfo ="停止旋車t球體"elseisSphereRoate = false;Sphereinfo ="旋轉(zhuǎn)球體"if(GUILayou
41、t.Button("立即銷毀模型",GUILayout.Height(50)Destroy (objCube);Destroy (objSphere);通過標(biāo)簽獲得多個(gè):function Start ()編輯版 wordvar objs = GameObject.FindGameObjectsWithTag ("MyTag");objs5.tag = "TestTag" for (var obj in objs) Debug.Log("以"+ obj.tag+”標(biāo)簽為游戲?qū)ο蟮拿Q "+
42、);if(obj.tag = "TestTag") Debug.Log("這個(gè)標(biāo)簽為 TestTag");if(obj.CompareTag("TestTag") Debug.Log("obj這個(gè)對(duì)象附帶的標(biāo)簽為TestTag");4.通過腳本控制游戲?qū)ο?,改變游戲?qū)ο蟮奈恢茫D(zhuǎn)游戲?qū)ο?,縮 放游戲?qū)ο蟆8淖冇螒驅(qū)ο蟮奈恢茫涸创a:using UnityEngine;using System.Collections;public class weizhi : MonoBehaviour private float
43、 Value_X = 0.0f;private float Value_Y = 0.0f;private float Value_Z = 0.0f;private GameObject obj;/ Use this for initializationvoid Start () obj = GameObject.Find("Cube");void OnGUI()GUILayout.Box("移動(dòng)立方體x軸)Value_X = GUILayout.HorizontalSlider(Value_X, -10.0f, 10.0f,GUILayout.Width(200)
44、;GUILayout.Box("移動(dòng)立方體y軸)Value_Y = GUILayout.HorizontalSlider(Value_Y, -10.0f, 10.0f,GUILayout.Width(200);GUILayout.Box("移動(dòng)立方體z軸)Value_Z = GUILayout.HorizontalSlider(Value_Z, -10.0f,10.0f,GUILayout.Width(200);obj.transform.position = new Vector3(Value_X,Value_Y,Value_Z);GUILayout.Label(&quo
45、t;立方體當(dāng)前位置:"+ obj.transform.position);旋轉(zhuǎn)游戲?qū)ο螅捍a:using UnityEngine;using System.Collections;public class xuanzhuan : MonoBehaviour private GameObject objCube;private GameObject objCylinder;private int speed = 100;void Start () objCube = GameObject.Find("Cube");objCylinder = GameObject.F
46、ind("Cylinder");void OnGUI()if(GUILayout.RepeatButton("立方體沿 x 軸旋轉(zhuǎn) ”,GUILayout.Height(50)objCube.transform.Rotate(Vector3.right * Time.deltaTime * speed);if(GUILayout.RepeatButton("立方體沿 y 軸旋轉(zhuǎn)”,GUILayout.Height(50)objCube.transform.Rotate(Vector3.up * Time.deltaTime * speed);if(GUI
47、Layout.RepeatButton("立方體沿 z 軸旋轉(zhuǎn) ”,GUILayout.Height(50)objCube.transform.Rotate(Vector3.forward * Time.deltaTime * speed);if(GUILayout.RepeatButton(" 立方體圍繞圓柱體旋轉(zhuǎn) ”,GUILayout.Height(50)objCube.transform.RotateAround(objCylinder.transform.position,Vector3.upTime.deltaTime * speed);立 方 體 旋 轉(zhuǎn) 角
48、度GUILayout.Label("+objCube.transform.rotation);縮放游戲?qū)ο螅簒wnrflt代碼:using UnityEngine;using System.Collections;public class suofang : MonoBehaviour private GameObject obj;private float scaleX = 1.0f;private float scaleY = 1.0f;private float scaleZ = 1.0f;void Start()obj=GameObject.Find("Cube&q
49、uot;);void OnGUI()GUILayout.Label("X 軸縮放");scaleX=GUILayout.HorizontalSlider(scaleX,1.0f,2.0f,GUILayout.Width(100);GUILayout.Label("Y 軸縮放");scaleY=GUILayout.HorizontalSlider(scaleY,1.0f,2.0f,GUILayout.Width(100);GUILayout.Label("Z 軸縮放");scaleZ=GUILayout.HorizontalSlider
50、(scaleZ,1.0f,2.0f,GUILayout.Width(100);obj.transform.localScale=new Vector3(scaleX,scaleY,scaleZ);編輯版word實(shí)驗(yàn)三使用游戲元素一、實(shí)驗(yàn)?zāi)康呐c要求1. 熟悉及掌握地形元素的使用方法。2. 熟悉及掌握光源的使用方法。3. 熟悉及掌握天空盒子的使用方法。4. 熟悉及掌握攝像機(jī)的使用方法。二、實(shí)驗(yàn)原理及知識(shí)點(diǎn)在 3D 游戲世界中,通常會(huì)將很多豐富多彩的游戲元素融合至游戲中。游戲元素是制作游戲的必備條件,它種類繁多并且作用也大不相同。游戲元素可分為常用元素與不常用元素兩種,常用元素是游戲中一些比較重要的
51、元素, 它們需要使用腳本來實(shí)現(xiàn)一些特殊功能,比如玩家控制的主角對(duì)象、需要攻擊的敵人、通關(guān)游戲的必要條件等,因此常用元素將直接影響游戲是否可以繼續(xù)進(jìn)行;而不常用元素在游戲世界中主要起裝飾作用,比如游戲中的天空、云朵、樹木和地形等,這些元素不會(huì)影響到游戲的主線,但是它們可以提升游戲的整體效果。1 游戲地形玩過 3D 游戲的朋友應(yīng)該對(duì)那些高低起伏的地形很有印象吧。無論是秀麗的山川還是遼闊的平原,地形元素都會(huì)很生動(dòng)地出現(xiàn)在游戲世界中,這些高低起伏的地形是2D 游戲無法媲美的。Unity 中有一套非常好的地形編輯器, 它可以讓開發(fā)者實(shí)現(xiàn)游戲中任何復(fù)雜的地形,還可以制作地形上的一些元素,比如樹木、草坪和石
52、頭等。1.1 創(chuàng)建地形下面開始學(xué)習(xí)如何創(chuàng)建游戲地形。首先打開Unity,在導(dǎo)航菜單欄中選擇"Terrain" - "Create Terrain”菜單項(xiàng),創(chuàng)建一個(gè)游戲地形。 Unity File Edit 貼制5 GameObjecr ComponentWindow HelpTerrain圖 1 "Terrain”菜單1.2 地形參數(shù)地形參數(shù)包括地形的寬度、高度、長(zhǎng)度、分辨率和高度圖等。創(chuàng)建完地形后,可任意修改它們的參數(shù)。在Unity導(dǎo)航菜單欄中選擇"Terrain" 一 "SetResolution”菜單項(xiàng),此時(shí)將彈出&q
53、uot; Set Heightmap resolution”窗口,在每一個(gè)地形參數(shù)右側(cè)直接輸入數(shù)值即可修改它,然后在界面下點(diǎn)擊右下角的“ SetResolution”按鈕,即可將當(dāng)前設(shè)置的所有地形參數(shù)應(yīng)用到地形當(dāng)中。圖2設(shè)置地形參數(shù)1.3 編輯地形到目前為止,我們創(chuàng)建愛你的地形還是一個(gè)巨大的平面,下面我們將學(xué)習(xí)如何編輯地形,實(shí)現(xiàn)高低起伏的地形效果。首先在 Hierarchy視圖中選擇"Terrain”地形,此時(shí)在右側(cè)的Inspector視圖中將顯示用來編輯游戲地形的菜單??梢钥吹剑匦尾藛螜谥幸还埠?個(gè)按鈕(第一個(gè)方框內(nèi)),它們的含義難以分別為編輯地形高度、編輯地形特定高度、平滑過
54、渡地形、地形貼圖、添加草與網(wǎng)絡(luò)模型、其他一些設(shè)置。圖3編輯地形1.4 地形貼圖給地形添加貼圖,讓地形看起來更為美觀。Unity提供了地形標(biāo)準(zhǔn)資源包,其中包含很多現(xiàn)成的地形資源以及貼圖,它們都是免費(fèi)供開發(fā)者使用的。首先需要將地形資源包將成功導(dǎo)入當(dāng)前工程中。下面我們來學(xué)習(xí)如何給地形添加新的貼圖。在地形菜單欄中點(diǎn)擊第四個(gè)按鈕(地形貼圖),可以發(fā)現(xiàn)目前在"Textures”列表中沒有任何地形貼圖。1.5 地形元素一般情況下,在游戲地形上會(huì)放置很多元素, 這些元素與地形是分開的,主要包括樹木、草地或自定義網(wǎng)格模型。地形元素在游戲世界中起裝飾作用, 所以不必將它們看做游戲?qū)ο螅蛘邽樗鼈兲砑訌?fù)雜
55、的游戲腳本。2光源在3D游戲中,光源是一個(gè)非常具有特色的游戲組件,為什么這么說呢?因?yàn)樗梢蕴嵘螒虻漠嬅尜|(zhì)感。在新創(chuàng)建的場(chǎng)景中,默認(rèn)是沒有光源的,場(chǎng)景非?;璋担杂螒蜷_發(fā)中必須在場(chǎng)景中添加光源組件。Unity引擎一共為開發(fā)者提供了3種不同的光源類型一一點(diǎn)光源、聚光燈和平行光,它們可以模擬自然界中的任何一種光。光源屬于游戲?qū)ο?,可在編輯版wordScene視圖中編輯它的位置以及光照的相關(guān)參數(shù)。此外,光源還支持移動(dòng)、旋轉(zhuǎn)和縮放等操作。在實(shí)際開發(fā)中,大家可根據(jù)不同的場(chǎng)景而使用不同的光源。1.1 點(diǎn)光源(Point Light)顧名思義,點(diǎn)光源是在3D 世界中從某一個(gè)點(diǎn)向周圍擴(kuò)散發(fā)出光的光源。點(diǎn)光
56、源好像包圍在一個(gè)類似球形的物體中,讀者可將球形理解為點(diǎn)光源的照射范圍,就像家里的燈泡可以照亮整個(gè)屋子一樣。創(chuàng)建點(diǎn)光源的方式為在Hierarchy 視圖中點(diǎn)擊“Create" - "Point Light”菜單項(xiàng)。1.2 聚光燈聚光燈的原理很簡(jiǎn)單,它在 3D 世界中以某一個(gè)點(diǎn)為起點(diǎn)向以另一個(gè)點(diǎn)為圓心的平面發(fā)射一組平行光,以射線的形式照射在平面中,與手電筒的原理如出一轍。聚光燈在游戲中的應(yīng)用非常廣泛,比如在第一人稱游戲中,可將聚光燈綁定在主角身上,當(dāng)玩家控制主角移動(dòng)時(shí),該光源也會(huì)跟著移動(dòng),始終照亮主角前方的路。創(chuàng)建聚光燈的方法如下:在Hierarchy 視圖中選擇“Create&qu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- JJF 2187-2025半徑樣板校準(zhǔn)規(guī)范
- 2025至2030年中國(guó)丸鐵輸送機(jī)數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 統(tǒng)編版三年級(jí)語文下冊(cè)第八單元達(dá)標(biāo)測(cè)試卷(含答案)
- 2025年《義務(wù)教育小學(xué)體育課程標(biāo)準(zhǔn)測(cè)試卷2022版》測(cè)試題庫及答案
- 2025年軍隊(duì)文職人員招聘之軍隊(duì)文職管理學(xué)題庫附答案(典型題)
- 2019-2025年消防設(shè)施操作員之消防設(shè)備中級(jí)技能過關(guān)檢測(cè)試卷A卷附答案
- 2024年遼寧省中考道德與法治試卷(含答案)
- 高等教育自學(xué)考試《00102世界市場(chǎng)行情》模擬試卷一
- 2024年廣東省公務(wù)員《申論(縣鎮(zhèn)級(jí))》試題真題及答案
- 2025年法制宣傳日普法知識(shí)競(jìng)賽題庫及答案(三)
- 配電室高低壓運(yùn)行記錄表
- 美術(shù)課件:審美自律(中國(guó))
- 中國(guó)地理4-河流與湖泊-于
- 端子壓接標(biāo)準(zhǔn)
- 中國(guó)對(duì)蝦養(yǎng)殖技術(shù)操作規(guī)范.docx
- 巡檢記錄表模板
- comsol學(xué)生操作手冊(cè)4函數(shù)定義用戶指南
- 出口退稅手冊(cè)核銷操作步驟
- 潘通色卡TCX棉布色彩電子版查詢部分
- 第三章社科信息檢索原理與技術(shù)PPT課件
- 《當(dāng)代廣播電視概論》試題A卷及答案
評(píng)論
0/150
提交評(píng)論