官术网_书友最值得收藏!

2.3 實現過程

2.3.1 GUI設置

(1)首先,創建Plane,如圖2-1所示。接著,將圖片BG拖曳至Plane上,圖片拖曳如圖2-2所示。

圖2-1 創建Plane

圖2-2 圖片拖曳

(2)調整相機位置及旋轉角度,并將相機屬性從“Perspective”(透視方式)改為“Orthographic”(正交方式)(“Inspector”→“Camera”→“Projection”→“Orthographic”),修改相機屬性如圖2-3所示。

圖2-3 修改相機屬性

(3)將Plane調整到全屏大小,如圖2-4所示。

圖2-4 將Plane調整到全屏大小

(4)發現無法實現屏幕大小自適應,于是換另一種方法。首先,創建一個空物體:“Create”→“Create Empty”,并命名為BG,創建空物體如圖2-5所示。

圖2-5 創建空物體

(5)選中BG,在Inspector面板中單擊“Add Component”,在搜索框輸入“GUI”后,選擇“GUI Texture”,如圖2-6所示添加GUI Texture屬性。

圖2-6 添加GUI Texture屬性

(6)將圖片BG拖曳至Texture右側參數框中,如圖2-7所示。

圖2-7 圖片拖曳

(7)若此時在 Game 窗口(游戲界面)中未顯示出背景圖片,則需修改 BG對應的Inspector參數,如圖2-8所示。

圖2-8 修改BG對應的Inspector參數

(8)設置完參數后,若Game窗口中仍未顯示背景圖片,則需在主相機(Main Camera)的Inspector面板下單擊“Add Component”,在搜索框內搜索“GUI”并選擇“GUI Layer”,如圖2-9所示添加GUI Layer。

圖2-9 添加GUI Layer

(9)調節背景圖片的顏色和亮度,如圖2-10所示。

圖2-10 調節背景圖片的顏色和亮度

(10)創建 GUI Skin,并使用自定義類型(Custom Style),將其重命名為MyGUISkin,創建過程為依次單擊“Assets”→“Create”→“GUI Skin”,添加按鈕如圖2-11所示。

圖2-11 添加按鈕

(11)在Inspector面板中將Custom Styles的按鈕數目設置成3個,并設置3個按鈕的背景。如圖2-12所示設置“游戲開始”按鈕 start_btn,如圖2-13所示設置“游戲設置”按鈕 setting_btn,如圖2-14所示設置“游戲退出”按鈕exit_btn。

圖2-12 設置“游戲開始”按鈕start_btn

圖2-13 設置“游戲設置”按鈕setting_btn

圖2-14 設置“游戲退出”按鈕exit_btn

此時單擊“運行”還不能出現3個按鈕,因它們只是游戲資源,還不是游戲對象。

在這種情況下,一般不直接在 Unity 中將游戲資源拖曳過去使其變成游戲對象,而是使用腳本進行控制,在Game窗口中實時渲染,此時Scene窗口中沒有內容。

(12)創建C#腳本程序menu.cs,實現按鈕的顯示,將腳本賦給Main Camera。

① 先在腳本中實例化GUISkin。

Public GUISkinMyGUISkin;

② 定義3個按鈕。

RectstartRect;

RectsettingRect;

RectexitRect;

在start()中設置按鈕的高度和寬度,也就是對應貼圖文件的高度和寬度。

startRect.depth=MyGUISkin.GetStyle("start_btn").normal.background.heigh;

startRect.width=MyGUISkin.GetStyle("start_btn").normal.background.width;

③ 在OnGUI()中生成按鈕,并且設置其大小和位置。注意:OnGUI()函數前需要加一行“GUI.skin=MyGUISkin;”,否則,if語句會報錯,找不到“start_btn”。

if(GUI.Button(newRect(0f,Screen.height*0.45f,startRect.width,startRect.height),"","start_btn"))

前面只是實現按鈕的顯示,接下來需要設置單擊按鈕后的觸發效果。

if(GUI.Button(new Rect (new Rect (0f,Screen.height * 0.45f, startRect.width,startRect.height),"","start_btn"),"","start_btn"))

{

Debug.Log("start_btn被按下");

}

if(GUI.Button(new Rect(0f,Screen.height*0.65f,

settingRect.width ,settingRect.height),"","setting_btn"))

{

Debug.Log("setting_btn被按下");

}

if(GUI.Button(new Rect(0f,Screen.height*0.85f,exitRect.width,exitRect.height),"","exit_btn"))

{

Debug.Log("exit_btn被按下");

}

2.3.2 設置第二組按鈕

用同樣方法設置第二組按鈕(需要修改Inspector面板中的GUISkin設置),如圖2-15所示。

圖2-15 設置第二組按鈕

設置后發現存在按鈕重疊問題,這時就需要用布爾值來解決。設置布爾值bUI,在start()中給bUI賦true值,在OnGUI()中,使用if(bUI)來管理“游戲開始”“游戲設置”和“游戲退出”三個按鈕,并且在單擊“游戲設置”按鈕后,給bUI賦false值。同時,使用if(!bUI)語句來管理“音樂開啟”“音樂關閉”和“游戲退出”三個按鈕,并且在單擊“游戲退出”按鈕后,給bUI賦true值。按照上述方法賦值后,再次演示時,兩組按鈕均可正常顯示。

2.3.3 添加背景音樂

(1)創建聲音源(Audio Source),命名為sound_BG,如圖2-16所示添加背景音樂。

圖2-16 添加背景音樂

(2)對應地,主相機自帶一個 Audio Listenter(聲音監聽器)。(注意:一個場景中只能有一個 Audio Listenter,否則系統會報錯。所以當再次添加相機時,需取消勾選Audio Listenter。)

(3)接下來需要賦給sound_BG的Audio Source一個背景聲音文件,操作步驟是:依次選擇“Assets”→“GameAssets”→“Sounds”→“strashnyi_les_muzyka”。選中文件“strashnyi_les_muzyka”并拖曳至對象sound_BG在Inspector面板中的Audio Clip參數框中。音效拖曳如圖2-17所示。

(4)勾選“Play On Awake”和“Loop”選項,使背景音樂在啟動時就開始循環播放,播放模式設置如圖2-18所示。

圖2-17 音效拖曳

圖2-18 播放模式設置

(5)背景音樂什么時間開始?什么時間停止?具體的邏輯關系是:當程序啟動時背景音樂開始,單擊“游戲設置”按鈕下的“音樂關閉”按鈕后,停止播放。單擊“音樂開啟”按鈕后,恢復背景音樂播放。

以上邏輯關系需通過編寫腳本來實現。

以上腳本可以實現背景音樂播放、音樂關閉和音樂開啟等功能。

2.3.4 添加按鈕聲音

(1)添加聲音,創建Audio Source,命名為sound。需賦給sound的Audio Source一個聲音文件,具體步驟是:依次選擇“Assets”→“GameAssets”→“Sounds”→“dianji”,將文件dianji拖曳至對象sound在Inspector面板中的聲音剪輯(Audio Clip)參數框中,音效拖曳如圖2-19所示。

圖2-19 音效拖曳

(2)為了使按鈕聲音在啟動時不播放,而是通過腳本來控制播放,需取消勾選“Play On Awake”。設置后可在Assets菜單下選中文件“dianji”,在Inspector面板中進行測試,如圖2-20所示設置播放模式。

圖2-20 設置播放模式

(3)以下腳本代碼可以控制按鈕聲音的播放:

//定義公共變量,按鈕按下的聲音

publicAudioSource sound;

在OnGUI()函數中,編寫實現單擊“游戲開始”按鈕后,播放音樂的代碼,即在“Debug.Log("start_btn被按下");”語句后,輸入語句“sound.Play();”。

(4)在 Hierarchy 面板中選擇 Main Camera 對象,將 sound 對象拖曳到Inspector面板中的Sound參數框中;將sound_BG對象拖曳到Inspector面板中的Sound_BG參數框中;將MyGUISkin腳本拖曳到Inspector面板中My GUI Skin參數框中。對象拖曳和腳本拖曳分別如圖2-21和圖2-22所示。

圖2-21 對象拖曳

圖2-22 腳本拖曳

(5)測試:單擊“游戲開始”按鈕后觀察是否有音樂播放功能。若聲音較小,則選中Hierarchy面板中的sound對象,在Inspector面板下調整3D Sound Settings中Min Distance的參數值,或查看sound對象的位置坐標和相機的位置坐標是否相差很大(也就是說Audio Source與Audio Listener不能距離太遠)。

(6)按鈕聲音大小問題解決后,可以在OnGUI()函數中給每個按鈕生成的 if 語句中加上“sound.Play();”語句。這樣,單擊每個按鈕時都會產生相應的按鍵聲音。

2.3.5 解決UI的自適應問題

在計算按鈕的位置之前需要新增一個自定義函數ApplyVirtualScreen(),用該函數來實現屏幕自適應功能。

設置ApplyVirtualScreen()函數,通過縮放屏幕尺寸大小,解決屏幕自適應問題,并使第一組按鈕顯示出來。

創建好的界面效果圖如圖2-23所示。

圖2-23 界面效果圖

2.3.6 連接第二個場景

Menu界面做好后,創建第二個場景,命名為Factory。修改腳本文件menu.cs中的代碼,在OnGUI()函數中“sound.Play();”語句后輸入“Application.LoadLevel("factory");”語句,進行場景跳轉測試。

2.3.7 解決轉場問題

單擊“游戲開始”按鈕后,發現在按鈕聲音還未結束時就直接加載第二個場景;單擊“游戲退出”按鈕后,按鈕聲音還未播放完畢,就已經退出場景。出現這樣的情況是由于同步加載問題,為解決此問題,應在menu.cs腳本中進行如下修改:

//定義兩個布爾變量

//監聽聲音是否播放完

boolbPlay;

boolbexit;

在Update()函數中增加下列代碼:

在OnGUI()函數的“游戲開始”“游戲退出”按鈕單擊語句中,增加下列代碼:

經測試,發現問題得到解決。

2.3.8 搭建第二個場景

(1)進入新創建的Factory場景,并在Assets菜單中Game_Prefab目錄下先將做好的地形MainGround拖曳至Hierarchy面板中(注意:預制體本身就具有位置坐標信息,若拖曳至Scence視圖中,則會改變預制體原有的坐標信息。故應直接拖曳至 Hierarchy 面板中,這樣,坐標信息就可以保持不變。必須先拖曳MainGround后,才能拖曳其他物體),場景搭建如圖2-24所示。

圖2-24 場景搭建

(2)在場景中添加一束平行光,使場景變亮。

2.3.9 拖曳地形

從Assets菜單中Game_Prefab目錄下將其他模型拖曳至Hierarchy面板中,需將地形上移一點,使其與模型更加貼近。(其中 MainGround 已拖曳,FireHeavy_01、FireHeavy_01 1、FireHeavy_01 2這3個粒子系統,Lights(燈光),sound_qiang,PlayerControl和clouddome(動態云)先不拖曳。注意:所有預制體的位置都不能修改。)

2.3.10 設置動態云

選中動態云(clouddome)對象,在Inspector面板中單擊“Remove Component”取消其腳本屬性,動態云設置如圖2-25所示。Inspector 面板中 whisps01下的Shader屬性不變,為Particles/Additive,即粒子透明。

圖2-25 動態云設置

2.3.11 制作天空盒

(1)依次選擇菜單“Assets”→“GameAssets”→“MySky”,刪除 MySky材質球。

(2)制作天空盒的6個面:制作6個紋理貼圖對應天空盒的6個面,將其放到Assets文件夾中。在Assets文件夾中選擇每一個貼圖后,都需在Inspector面板中修改Wrap Mode后的循環模式為Clamp。否則,邊緣的顏色將無法完美匹配。圖片屬性修改如圖2-26所示。

圖2-26 圖片屬性修改

(3)依次選擇“Assets”→“Create”→“Material”選項創建一個新的材質,選中該材質資源,在Inspector面板中Shader屬性后單擊下拉菜單,選擇“Skybox”→“6 Sided”,即將此材質設置成天空盒材質。創建材質如圖2-27所示,修改材質屬性如圖2-28所示。

圖2-27 創建材質

圖2-28 修改材質屬性

(4)天空盒貼圖:只需分別將紋理貼圖文件拖曳至天空盒的6個面即可,如圖2-29所示制作天空盒表面。

圖2-29 制作天空盒表面

(5)選中“Main Camera”,在Inspector面板中單擊“Add Component”,在搜索框中輸入“sky”并單擊下方“Skybox”選項添加天空盒組件,如圖2-30所示。

圖2-30 添加天空盒組件

(6)將創建好的天空盒“MySky”拖曳至Custom Skybox參數框中,如圖2-31所示。

圖2-31 天空盒拖曳

2.3.12 動態云腳本控制

為了使動態云真正運動起來,需添加腳本文件 CloudDomeScript.cs,并將其綁定到clouddome上,調節scrollSpeed的值,將clouddome的Y軸坐標值調整到-700左右。相應的代碼如下所示:

2.3.13 風車動畫制作

風車旋轉效果可通過動畫控制或腳本控制方式實現。下面介紹風車動畫的制作方式。

(1)依次單擊Hierarchy面板中的“Structures”→“Vetryak”→“Vint”(風車風葉模型)選項。

(2)依次單擊菜單中“Window”→“Animation”選項,如圖2-32所示創建動畫。

圖2-32 創建動畫

(3)在Animation面板中依次單擊“Vint_Vetryak”→“Create New Clip…”選項建立動畫文件,并命名為 myAniForFengche,如圖2-33所示新建動畫并命名。

圖2-33 新建動畫并命名

(4)單擊“Add Property”按鈕,選擇“Transform”→“Rotation”選項(因為風車動畫的實質就是風葉沿著Z軸旋轉,故選擇“Rotation”選項),如圖2-34所示選擇動畫參數。

圖2-34 選擇動畫參數

(5)單擊“錄制”按鈕,設置初始幀,將風車風葉模型參數 Rotation.x、Rotation.y、Rotation.z的值均設置為0,如圖2-35所示制作動畫(一)。

圖2-35 制作動畫(一)

(6)移動白色線條到1:00或2:00位置,將該幀風車風葉模型參數Rotation.x、Rotation.y、Rotation.z的值分別設置為0、0、-360,如圖2-36所示制作動畫(二)。

圖2-36 制作動畫(二)

(7)再次單擊“錄制”按鈕,停止錄制。單擊“運行”按鈕,測試動畫效果。

(8)關閉Animation窗口,即完成了動畫設置。在Unity3D窗口中運行游戲,該模型將按設置的動畫運行。

在關閉 Animation 窗口前,可以用鼠標右鍵單擊“Vint:Rotation”后選擇“Romove Properties”取消在模型上綁定的動畫(另外兩種方法是:① 選中該模型,在Unity3D菜單中依次選擇“Component”→“Miscellmoues”→“Animation”后,將Assets下剛建立好的動畫文件myAniForFengche拖曳至Inspector面板下的Animation參數框中;② 利用腳本控制Vint旋轉并設置旋轉速度。這兩種方法能達到同樣的效果),動畫拖曳如圖2-37所示。

圖2-37 動畫拖曳

(9)鳥飛的動畫(Crow)

在Hierarchy面板中,名稱為Crow的空物體下有Crow、Plane001、Plane002、Plane003這4個部分。其中,Crow是一個空物體,Plane001、Plane002、Plane003是3只鳥的模型。給鳥添加飛翔盤旋的效果,具體操作方法參照風車動畫制作步驟。

2.3.14 加入燈光

從Assets菜單中將燈光“Lights”預制體拖曳到Hierarchy面板中,其中只有一束平行光,其他都是點光源,點光源用于實現不同地方的光線強弱不同的效果。

2.3.15 加入第三人稱

加入PlayerControl模型(第三人稱)步驟如下。

(1)該模型由 CameraControl 和 UniversalTrooperHD_Ruby 組成。其中,CameraControl中自帶相機,UniversalTrooperHD_Ruby是實際人物模型。

(2)設置人物碰撞屬性:選擇Hierarchy面板中的UniversalTrooperHD_Ruby模型(依次選擇菜單中“Component”→“Physics”→“Character Control”選項),給對象設置人物碰撞屬性,調節半徑(Radius)、高度、位置等屬性。

(3)加入第三人稱控制腳本:選擇Hierarchy面板中的UniversalTrooperHD_Ruby模型(依次選擇菜單中“Component”→“Scripts”→“Third Person Controller”選項),將已經導入的動畫文件分別填充到Inspector面板中的Idle Animation、Walk Animation、Run Animation、Jump Pose Animation的動畫填充欄,完成對該人物的動畫設置。

(4)添加相機控制腳本:選擇Hierarchy面板中的UniversalTrooperHD_Ruby模型,(依次選擇菜單中“Component”→“Scripts”→“Third Person Camera”選項),此步驟完成后相機和人物就實現了綁定。

(5)為實現用鼠標控制人物移動的功能(鍵盤的“A”“S”“D”“W”鍵也可實現控制移動的功能),可將playercamer.js文件綁定到空物體“CameraControl”上,并通過如圖2-38所示的對象拖曳將 Inspector 面板中的 Cam 參數賦值為UniversalTrooperHD_Ruby,將Target參數賦值為Main Camera。

圖2-38 對象拖曳

測試運行時發現相機位置太低,為解決這一問題可單擊空物體“CameraControl”,在Inspector面板中,將Offset參數的Y值修改為3~4。Max Distance和Min Distance分別表示相機與人物之間的最大距離和最小距離,可以按需調節。由于游戲中使用的是人物自帶的相機,故需關閉原有的相機,且在人物自帶的相機上添加天空盒。

至此,第三人稱制作完成。

2.3.16 添加單擊鼠標左鍵時的游戲音效

(1)創建腳本文件 player_sound.cs,并將其拖曳至 PlayerControl 模型上,Sound變量的名稱可以與menu.cs中的公共變量名稱一致。

(2)將菜單中“Assets”→“Game Prefab”下的預制體 sound_qiang 拖曳至PlayerControl模型的Inspector面板下對應的Sound變量上,其目的是在每次單擊鼠標左鍵時,都基于預制體 sound_qiang 產生一個物體的實例化。預制體sound_qiang的創建的步驟如下。

① 建立一個空物體,命名為sound_qiang。

② 選擇該空物體(依次單擊菜單中“Component”→“Audio”→“Audio Source”選項),并將菜單“Assets”→“GameAsset”→“Sounds”下的音頻文件“ak47_conversion_singleshot2”拖曳至Inspector面板中的AudioClip參數框中。將制作好的預制體sound_qiang 拖曳至Game_Prefab 文件夾中,這樣預制體就設置好了,設置預制體如圖2-39所示。

圖2-39 設置預制體

腳本文件中Input.GetMouseButton(0)對應的是單擊鼠標左鍵,在Unity3D中,依次選擇菜單中“Edit”→“Project Setting”→“Input”→“Axis”選項可以查看到。

這時實現的效果是每單擊一次鼠標左鍵,發出一聲AK47的槍聲音效,通常設置參數為time>3。若感覺槍聲音效播放速度太快,則增大time參數。

由于預制體 sound_qiang 一直增加,需要再增加一個腳本文件 life.cs 來控制預制體sound_qiang實例化所產生對象的生命周期。單擊預制體sound_qiang,可以看到其對應的Inspector面板,再從“Assets”菜單的“Game Script”目錄中將life.cs拖曳至預制體sound_qiang的Inspector面板中,設置時間值。

在非最大化窗口的前提下運行測試,觀察有life.cs腳本文件時和沒有此腳本文件時,在Hierarchy面板中預制體的產生與消失情況。

2.3.17 設置動畫聲源

作品基本制作完成,演示發現以下問題:當人物移動到風車附近時,風車轉動的聲音較大,但當人物移動到其他地方時聲音卻很小。這時需要調節 Audio Source參數,依次選擇“Structures”→“Vetryak”,將Audio Source最大距離值設置為30.193。

2.3.18 發布.exe格式文件

在Unity3D編譯環境下運行時,單擊“退出”按鈕后,發現此操作無應答,這是因為“Application.Quit()”語句只針對.exe格式文件運行時才起作用。發布本游戲后,測試能正常運行。至此,此作品制作完畢。

主站蜘蛛池模板: 沙雅县| 西充县| 霍州市| 社旗县| 信丰县| 洛宁县| 西乌珠穆沁旗| 阆中市| 资兴市| 林西县| 和田市| 雅安市| 峡江县| 哈密市| 大余县| 岚皋县| 桂东县| 黔南| 嘉荫县| 湘潭县| 肃宁县| 彭泽县| 黔西| 崇左市| 永宁县| 遵化市| 莒南县| 松潘县| 会东县| 肃南| 祁门县| 西安市| 治多县| 当阳市| 青神县| 灌阳县| 定陶县| 襄樊市| 渑池县| 新乡市| 亳州市|