虛擬現(xiàn)實與增強現(xiàn)實理論與實踐 課件 單美賢 第4-8章 游戲場景 -AR系列教程-Vuforia入門_第1頁
虛擬現(xiàn)實與增強現(xiàn)實理論與實踐 課件 單美賢 第4-8章 游戲場景 -AR系列教程-Vuforia入門_第2頁
虛擬現(xiàn)實與增強現(xiàn)實理論與實踐 課件 單美賢 第4-8章 游戲場景 -AR系列教程-Vuforia入門_第3頁
虛擬現(xiàn)實與增強現(xiàn)實理論與實踐 課件 單美賢 第4-8章 游戲場景 -AR系列教程-Vuforia入門_第4頁
虛擬現(xiàn)實與增強現(xiàn)實理論與實踐 課件 單美賢 第4-8章 游戲場景 -AR系列教程-Vuforia入門_第5頁
已閱讀5頁,還剩259頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

游戲場景UNITY場景插件優(yōu)秀行業(yè)案例UNITY場景開發(fā)相關(guān)工具介紹練習(xí):新建地形,并通過地形筆刷工具對其進(jìn)行設(shè)計

導(dǎo)入環(huán)境資源包

如果無此命令,則可以選擇Assets→Import

Package→Custom

Package命令,在文件瀏覽窗口中選擇離線下載好的Environment.unitypackage導(dǎo)入即可練習(xí):為自己構(gòu)建的地形添加紋理、草、樹等細(xì)節(jié)。練習(xí):為自己構(gòu)建的地形添加風(fēng)場細(xì)節(jié)環(huán)境設(shè)置天空盒練習(xí):為自己構(gòu)建的地形設(shè)置燈光,替換合適的天空盒。渲染與烘焙何為渲染?

所有我們能看到的東西都是需要進(jìn)行渲染的。

比如:天空盒,場景模型,角色模型,特效......

如果沒有渲染,世界將是一片黑暗。Unity

各版本渲染引擎

Unity

中的渲染采用材質(zhì)、著色器和紋理。這三者之間有著密切的關(guān)系。

材質(zhì)通過包含對所用紋理的引用、平鋪信息、顏色色調(diào)等來定義表面應(yīng)使用的渲染方式。材質(zhì)的可用選項取決于材質(zhì)使用的著色器。

著色器是一些包含數(shù)學(xué)計算和算法的小腳本,根據(jù)光照輸入和材質(zhì)配置來計算每個像素渲染的顏色。

紋理是位圖圖像。材質(zhì)可包含對紋理的引用,因此材質(zhì)的著色器可在計算游戲?qū)ο蟮谋砻骖伾珪r使用紋理。除了游戲?qū)ο蟊砻娴幕绢伾ǚ凑章剩┲?,紋理還可表示材質(zhì)表面的許多其他方面,例如其反射率或粗糙度。

材質(zhì)指定了要使用的一種特定著色器,而使用的著色器確定材質(zhì)中可用的選項。著色器指定期望使用的一個或多個紋理變量,而

Unity

中的材質(zhì)檢視面板

(Material

Inspector)

允許您將自己的紋理資源分配給這些紋理變量。

對于大多數(shù)正常渲染(例如渲染角色、景物、環(huán)境、實體和透明游戲?qū)ο?、硬表面和軟表面),?biāo)準(zhǔn)著色器通常是最佳選擇。

材質(zhì):現(xiàn)在游戲常用材質(zhì)為PBR(Standard)和不受光材質(zhì)(Unlit)次世代游戲用的是PBR材質(zhì),其中最基本的是4張貼圖:顏色貼圖,Normal貼圖(凹凸貼圖中的一種,為模型提供更多的細(xì)節(jié)),AO貼圖(環(huán)境光遮蔽貼圖,模擬物體之間所產(chǎn)生陰影),高光貼圖

不受光材質(zhì)(Unlit):像魔獸世界把特效關(guān)閉,一個模型的只靠最基本的顏色貼圖,游戲中的燈光用的也是圖片模擬的光暈。

理念:把美術(shù)的質(zhì)量交給手繪顏色貼圖而不是顯卡做過多的計算;把內(nèi)存留出來,給單張顏色貼圖更大的尺寸,讓畫面更多細(xì)節(jié);把GPU,CPU的性能空出來,留給粒子特效和更細(xì)膩的骨骼動畫。著色器shader的重要性

Shader

好比是畫家手中的畫筆和顏料。如果畫家沒有了這兩樣?xùn)|西后,根本就沒辦法畫出好的作品。

在Unity

中所有看到的一切,都離不開Shader

的渲染,無論是天空盒,場景,角色模型,特效……這些我們之所以能在項目中看到它們,它們能顯示出一個五彩繽紛的虛擬世界,其中都是Shader

在起作用。紋理

Unity可從最常見的圖像文件格式導(dǎo)入紋理。

必須使用材質(zhì)將紋理應(yīng)用于對象。材質(zhì)使用稱為著色器的專用圖形程序在網(wǎng)格表面上渲染紋理。

著色器可實現(xiàn)光照和著色效果,從而模擬許多其他事物的閃亮或凹凸表面。此外,它們還可一次使用兩個或更多紋理,將這些紋理組合起來以獲得更大的靈活性。

使用三種材質(zhì)、兩種著色器和一種紋理:

兩個模型對車身使用不同的材質(zhì),分別為“Red

car

material”(紅色汽車材質(zhì))和“Blue

car

material”(藍(lán)色汽車材質(zhì))。

這兩種車身材質(zhì)使用同一個自定義著色器“Carbody

Shader”(車身著色器)。使用自定義著色器的原因是該著色器為專門汽車添加了額外的特性(例如金屬性閃光渲染),或者可能具有自定義損壞遮罩功能。

車身著色器還接受一種色調(diào)顏色;紅色和藍(lán)色汽車設(shè)置為不同的顏色,使每輛汽車的外觀不同,但兩者使用同一種紋理。

每種車身材質(zhì)均引用“Car

Texture”(汽車紋理),這是包含車身所有細(xì)節(jié)但沒有具體油漆顏色的紋理貼圖。

車輪模型也使用單獨的材質(zhì),但這次兩輛汽車共用相同的車輪材質(zhì),因為每輛汽車的車輪沒有差異。車輪材質(zhì)使用標(biāo)準(zhǔn)著色器,并同樣引用汽車紋理。

注意汽車紋理包含的車身和車輪細(xì)節(jié):這是一個紋理圖集,意味著紋理圖像的不同部分被顯式映射到模型的不同部分。創(chuàng)建材質(zhì)

創(chuàng)建新材質(zhì),可以從主菜單中選擇Assets>Create>Material,或者從Project視圖中選擇Create>Material。

默認(rèn)情況下會為新材質(zhì)指定標(biāo)準(zhǔn)著色器,并且所有貼圖屬性都為空,如圖所示。

創(chuàng)建材質(zhì)后,可以在Inspector視圖(檢視視圖)中調(diào)整其所有屬性。

要將材質(zhì)應(yīng)用于對象,只需將其從Project視圖中拖到“Scene場景視圖”或“層級Hierarchy

視圖”中的對象上即可。渲染方式渲染核心要點顏色空間設(shè)置天空盒與內(nèi)置Shader天空盒內(nèi)置Shader

標(biāo)準(zhǔn)著色器(Shader)是一個內(nèi)置的著色器,具有全面的功能。它可用于渲染“真實世界”的對象,如石頭,木頭,玻璃,塑料和金屬,并支持幾種著色器類型和組合。然后,通過使用或不使用材質(zhì)編輯器中的各種紋理插槽(就是賦予對應(yīng)的貼圖)和參數(shù),來啟用或禁用對應(yīng)的功能。標(biāo)準(zhǔn)Shader的功能布局

主貼圖區(qū)域:Albedo控制材質(zhì)的基色。金屬度(Metallic):材質(zhì)的

Metallic級別由紋理的紅色通道中的值控制;而材質(zhì)的

Smoothness級別由紋理的

Alpha

通道控制。平滑度(Smoothness):微表面的粗糙度。可以選擇參數(shù)來源是Specular/Metallic

Alpha或Albedo

Alpha。法線貼圖(Normal

Map)物體的凹凸質(zhì)感視差高度貼圖(Height

Map)配合法線貼圖使用遮擋貼圖(Occlusion)遮擋貼圖用于提供關(guān)于模型哪些區(qū)域應(yīng)接受高或低間接光照的信息。間接光照來自環(huán)境光照和反射,因此模型的深度凹陷部分(例如裂縫或折疊位置)實際上不會接收到太多的間接光照。Emission

用于控制表面發(fā)光的顏色和強度。在場景中使用發(fā)光材質(zhì)時,此材質(zhì)將顯示為可見光源。游戲?qū)ο罂雌饋頃园l(fā)光??墒褂脝蝹€顏色和發(fā)光級別定義基本發(fā)光材質(zhì)。要啟用

Emission

屬性,請勾選

Emission

復(fù)選框。此時將啟用

Color

Global

Illumination

子屬性。單擊

Color

框可打開

HDR

Color

面板

輔助貼圖(或細(xì)節(jié)貼圖)允許您在上面列出的主紋理上覆蓋第二組紋理。您可以應(yīng)用第二個反照率顏色貼圖和第二個法線貼圖。通常,與主要的反照率貼圖和細(xì)節(jié)貼圖相比,這些輔助貼圖將映射到對象表面上重復(fù)多次且小得多的范圍。

此圖像中的頭盔罩使用

Transparent

模式渲染而成,因為它應(yīng)該表示具有透明屬性的真實物理對象。此處的頭盔罩正在反射場景中的天空盒

此圖像中的全息圖使用

Fade

模式渲染而成,因為它應(yīng)該表示部分淡出的不透明對象

此圖像中的草使用

Cutout

模式渲染而成。此模式為對象提供了清晰的銳利邊緣(通過指定截止閾值進(jìn)行定義)。Alpha

值高于此閾值的圖像的所有部分都是

100%

不透明的,而低于此閾值的所有部分都是不可見的。在圖像的右側(cè),可看到材質(zhì)設(shè)置和所用紋理的

Alpha

通道。主要貼圖(Main

Maps)

反照率(Albedo)和透明度(transparecy)Albedo控制材質(zhì)的基色。alpha控制材質(zhì)的透明度。

金屬度(Metallic):材質(zhì)的

Metallic級別由紋理的紅色通道中的值控制;而材質(zhì)的Smoothness級別由紋理的

Alpha

通道控制。

平滑度(Smoothness):微表面的粗糙度??梢赃x擇參數(shù)來源是

Specular/MetallicAlpha或Albedo

Alpha。

法線貼圖(Normal

Map)物體的凹凸質(zhì)感

視差高度貼圖(Height

Map)配合法線貼圖使用

遮擋貼圖(Occlusion)遮擋貼圖用于提供關(guān)于模型哪些區(qū)域應(yīng)接受高或低間接光照的信息。間接光照來自環(huán)境光照和反射,因此模型的深度凹陷部分(例如裂縫或折疊位置)實際上不會接收到太多的間接光照。

Emission

部分用于控制表面發(fā)光的顏色和強度。在場景中使用發(fā)光材質(zhì)時,此材質(zhì)將顯示為可見光源。游戲?qū)ο罂雌饋頃园l(fā)光。

發(fā)光材質(zhì)通常用于某個部位應(yīng)該看起來從內(nèi)部照亮的游戲?qū)ο?,例如顯示器的屏幕、高速制動的汽車的盤式制動器、控制面板上的發(fā)光按鈕或在黑暗中可見的怪獸眼睛。

可使用單個顏色和發(fā)光級別定義基本發(fā)光材質(zhì)。要啟用

Emission

屬性,請勾選

Emission

復(fù)選框。此時將啟用

Color

Global

Illumination

子屬性。單擊

Color

框可打開

HDR

Color

面板。輔助貼圖(細(xì)節(jié)貼圖)

輔助貼圖(或細(xì)節(jié)貼圖)允許您在上面列出的主紋理上覆蓋第二組紋理。您可以應(yīng)用第二個反照率顏色貼圖和第二個法線貼圖。通常,與主要的反照率貼圖和細(xì)節(jié)貼圖相比,這些輔助貼圖將映射到對象表面上重復(fù)多次且小得多的范圍。這樣做的原因是允許材質(zhì)在近距離觀察時具有清晰的細(xì)節(jié),同時在從更遠(yuǎn)處觀察時具有正常的細(xì)節(jié)級別,而不必使用單個極高的紋理貼圖來實現(xiàn)兩個目標(biāo)。

Directional

Light—平行光(太陽光),有旋轉(zhuǎn)屬性,無位置屬性

創(chuàng)建Cube,觀察陰影

Point

Light:燈光偏弱的地方使用

創(chuàng)建多個Point

Light

,指定不同顏色

Spot

Light:方向性光源(射燈)

Area

Light:

僅支持烘焙

LIGHT共用屬性:

Color

Mode(realtime-用的最多的

,

mixed,

baked-靜態(tài)變成光照貼圖)

Shadow

Type:

hard;

soft-會適當(dāng)節(jié)省資源

Lightmapper(

Enlighten-室內(nèi)畫面展示;Progressive-開放式環(huán)境中使用)

Lighmap

resolution越大越好。輸出時一般40-60完全滿足要求;預(yù)覽/測試時10-20烘焙分辨率:其實就是生成的光照貼圖的分辨率。值越大,效果越好,體積也就越大,烘焙時間也就越長,反之亦然。這個參數(shù)是最影響烘焙時間的。一般在開發(fā)階段,不要設(shè)置太高,否則需要很長的時間來渲染光照貼圖階段測試,最終發(fā)布的時候,設(shè)置高一點,渲染一個最佳的效果即可。

Lightmap

Size(圖集尺寸)越大細(xì)節(jié)越多。

Ambient

Occlusion:為環(huán)境提供陰影練習(xí):創(chuàng)建一簡單的場景,完成烘焙效果。光照系統(tǒng)之燈光探頭組光照系統(tǒng)之烘焙反射探頭Unity制作煙花

煙花

拖尾

后期特效

要制作煙花,需要先制作煙花爆炸前的煙花炮彈。

首先在場景中添加一個粒子系統(tǒng),然后將該粒子系統(tǒng)transform的rotation設(shè)置為(-90,0,0),這樣粒子系統(tǒng)就會向上發(fā)送粒子。

然后設(shè)置該粒子系統(tǒng)的基礎(chǔ)設(shè)置,首先把Start

Size和Start

Speed等設(shè)置為合適的值,而Start

Lifetime為粒子的存活時間,這里設(shè)置為Random

Between

TwoConstants,規(guī)定為2-4之間的隨機數(shù),這樣煙花就會在發(fā)射后不同時間爆炸,同時將Gravity

Modifier設(shè)置為0.3,這樣煙花發(fā)射后就有拋物線的弧度。

將粒子系統(tǒng)的粒子發(fā)射速率設(shè)置為1。

將粒子系統(tǒng)的發(fā)射半徑設(shè)置為0.01,發(fā)射角度規(guī)定為35°以內(nèi),這樣看起來就有個漏斗形狀,更符合煙花彈發(fā)射的效果。

勾選Size

over

Lifetime,設(shè)置粒子的大小隨時間而改變,這樣煙花彈就有一個忽明忽暗的效果,更加逼真。

再把基礎(chǔ)資源(Assets->Import

Package->particleSystems)中的火焰材料拖到粒子系統(tǒng)的Renderer中的material中,讓煙花彈更加好看。

拖尾:為了讓煙花彈的效果更加逼真,給煙花彈添加一個拖尾效果。勾選SubEmitters,并添加一個子發(fā)射器命名為tail。

設(shè)置tail的基礎(chǔ)設(shè)置,拖尾粒子的存活時間應(yīng)該比較短,設(shè)置為1-2之間的隨機值,大小也比較小,設(shè)置為0.5,并且也需要添加重力效果,設(shè)置為0.2。

將tail粒子的形狀設(shè)置為球形,并將半徑設(shè)置為0.003。

為了使拖尾效果更加炫酷,需要勾選Color

over

Lifetime,使得粒子顏色隨時間的變化而改變。

同時為了拖尾粒子消失不那么突兀,勾選Size

over

Lifetime,使得粒子大小隨著時間推移變小,最終消失。

拉長粒子,設(shè)置Speed

Scale為0.15,Length

Scale為2,這樣粒子就會邊長,讓拖尾效果更加逼真。Unity

簡介Unity

也叫Unity

3D,是由Unity

Technologies開發(fā)的一個全面整合的專業(yè)游戲引擎,可以讓玩家輕松完成各種游戲創(chuàng)意和三維互動開發(fā)。優(yōu)勢之一:跨平臺特性開發(fā)的產(chǎn)品可以同時部署在所有的主流游戲平臺優(yōu)勢之二:易于上手提供了簡單易用的開發(fā)編輯界面和高度聚合的腳本編輯,支持C#腳本編程語言,支持3Ds、FBX等格式模型的直接導(dǎo)入,在很大程度上減少了開發(fā)者的上手時間。Unity項目入門MonoBehaviour是

Unity中所有腳本的基類using

UnityEngine

是Unity編程中最重要的,因為它讓C#腳本知道所有標(biāo)準(zhǔn)的Unity對象,包括MonoBehaviour

、

GameObject

、剛體、變換等。讓場景中的叫CUBE的物體每幀向上走1mm三維向量(Vector3):三個浮點數(shù)的集合三維向量是3D軟件中常見的數(shù)據(jù)類型,常用于存儲對象的三維空間位置。Vector3position=newVector3(0.0f,3.0f,

4.0f);print(position.x);

//類的實例變量通過“點語法”訪問print(position.y);print(position.z);變量命名規(guī)則:變量名稱應(yīng)使用小寫字母開頭;函數(shù)名稱應(yīng)使用大寫字母開頭;類名稱應(yīng)使用大寫字母開頭;私有變量名稱應(yīng)以下畫線開頭;靜態(tài)變量名稱應(yīng)全部使用大寫字母。Transform組件:唯一一個所有GameObject都必有的組件Cube

(Mesh

Filter-網(wǎng)格過濾器):為GameObject提供3D外形,并以三角形構(gòu)成的網(wǎng)格建立模型。游戲中的3D模型通常是中空的,僅具有表面。Box

Collider(盒碰撞器):允許GameObject在Unity的物理模擬系統(tǒng)中與其他對象發(fā)生交互。具有碰撞器組件的GameObject會被當(dāng)作空間中不可移動的物體,可與其他物體發(fā)生碰撞。Mesh

Renderer(網(wǎng)格渲染器):雖然網(wǎng)絡(luò)過濾器可以提供GameObject的實際幾何開關(guān),但要使其顯示在屏幕上,要通過網(wǎng)絡(luò)渲染器。讓場景中的叫CUBE的物體每幀向上走1mmpublicclassHELLO:MonoBehaviour

{publicstringhello="hello

world";//Usethisfor

initializationvoidStart()

{print(hello);}//Updateiscalledonceper

framevoidUpdate()

{GameObject.Find("Cube").transform.Translate(new

Vector3(0,0.001f,0));}

//找到一個對象,索引到其組件,找到相關(guān)方法來使用。}publicclassHELLO:MonoBehaviour

{publicstringhello="hello

world";//privateGameObject

cube;//Usethisfor

initializationvoidStart()

{print(hello);//

cube=GameObject.Find(“Cube”);}//Updateiscalledonceper

framevoidUpdate()

{//GameObject.Find("Cube").transform.Translate(newVector3(0,0.01f,0));Move();}publicvoid

Move(){//cube.transform.Translate(newVector3(0,0.001f,

0));//cube.GetComponent<MeshRenderer>().material.color-=newColor(0.001f,

0.001f,0.001f);GameObject.Find("Cube").transform.Translate(newVector3(0,0.001f,

0));GameObject.Find("Cube").GetComponent<MeshRenderer>().material.color-=

newColor(0.001f,0.001f,0.001f);}}privateGameObject

cube;BoollIsLightOn=true;voidUpdate()

{//GameObject.Find("Cube").transform.Translate(newVector3(0,0.001f,0));if(Input.GetMouseButtonDown(0)){if

(IsLightOn){cube.GetComponent<MeshRenderer>().material.color=newColor(1,0,0);IsLightOn=

false;}else{cube.GetComponent<MeshRenderer>().material.color=newColor(1,1,1);IsLightOn=

true;}}move();}privatevoidOnMouseEnter()

{cube.GetComponent<MeshRenderer>().material.color=new

Color(1,0,0);}privatevoid

OnMouseExit(){cube.GetComponent<MeshRenderer>().material.color=newColor(1,1,

1);Unity中所有顯示在屏幕上的元素都是GameOjbect,并且所有的GameOjbect都由組件組成。當(dāng)你在層級視圖或場景視圖上選擇一個GameObject時,該GameObject的組件會顯示在檢視視圖中。腳本常用必然事件(Certain

Event)using

UnityEngine;using

System.Collections;publicclassOrder:MonoBehaviour

{void

Awake(){Debug.Log("Hereis

Awake");}void

Start(){Debug.Log("Hereis

Start");}void

FixedUpdate()void

Update(){Debug.Log("Hereis

Update");}void

LateUpdate(){Debug.Log("Hereis

LateUpdate");}}Awake()用于在游戲開始之前初始化變量或游戲狀態(tài)。在腳本整個生命周期內(nèi)它僅被調(diào)用一次。{Debug.Log("Hereis

FixedUpdate");}

Start()僅在Update函數(shù)第一次運行調(diào)用,用于游戲?qū)ο蟮某跏蓟?。FixedUpdate(

)

每個固定物理時間間隔調(diào)用一次用于物理狀態(tài)的更新,可在Edit->ProjectSetting->time下面的Fixed

timestep更改,默認(rèn)是20ms。Update(

)

每幀調(diào)用一次,用于更新游戲場景和狀態(tài)。LateUpdate(

)

每幀調(diào)用一次(在Update調(diào)用之后),用于更新游戲場景和狀態(tài),以及和相機有關(guān)的一些更新。Unity

3D腳本中的Awake()和Start()的本質(zhì)區(qū)別Awake()是在腳本對象實例化時被調(diào)用的,而Start()是在對象的第一幀時被調(diào)用的,而且是在Update()之前。在使用上,有幾點值得注意:腳本的一些成員,如果想在創(chuàng)建之后的代碼中立即使用,則必須寫在Awake()里面;當(dāng)關(guān)卡加載時,腳本的Awake的次序是不能控制的;至于在關(guān)卡加載時,對象實例化和Awake()的調(diào)用關(guān)系,得看源碼才知道了。腳本中訪問游戲?qū)ο蟮娜N方式1.在腳本中定義類型為GameObject的成員變量,權(quán)限設(shè)置為publicpublic

GameObject Sphere; //在編輯框中就可以直接拖拽物體選擇2.通過名字訪問對象(消耗資源較多)GameObjectcube=

GameObject.Find(“cube");3.通過標(biāo)簽訪問對象,但注意事先給對象打上標(biāo)簽:GameObject

cube

= GameObject.FindWithTag("標(biāo)簽名");泛型方法的調(diào)用函數(shù)名<類型名>()GetComponent

<Rigidbody>()腳本中獲取游戲?qū)ο蟮慕M件Transformts=

GameObject.Find(“cube").GetComponent<Transform>();添加Rigidbody組件剛體組件對GameObject進(jìn)行物理模擬,其中包括重力、碰撞等機械力??稍试S具有碰撞器的游戲?qū)ο笤诳臻g中移動。方法一:選中游戲?qū)ο?,選擇菜單欄中的component->Physics->rigidbody方法二:Rigidbody

剛體剛體組件的具體參數(shù):Mass 質(zhì)量,以千克計算Drag

空氣阻力,當(dāng)物體受力運動時空氣的阻力,以牛頓計算Angular

drag

空氣角阻力,當(dāng)物體受扭矩力運動時空氣的阻力,以牛頓計算Usegravity

使用重力,當(dāng)開啟此項,物體會受到重力作用Is

Kinematic

是否開啟動力學(xué),開啟此項,物體不受力的作用Constrants

約束,用于控制剛體運動的約束調(diào)整場景視圖中的攝像機Alt鍵+鼠標(biāo)左鍵:攝像機將以地面為中心旋轉(zhuǎn)Alt鍵+Ctrl

(Command)鍵+鼠標(biāo)左鍵:攝像機將平行移動鼠標(biāo)滾輪:畫面將向著場景深處前后移動入門教程創(chuàng)建項目用玩家角色把右邊飛來的小球彈開點擊左鍵使用玩家角色起跳點擊右鍵發(fā)射小球讓游戲更有趣創(chuàng)建新項目創(chuàng)建地面(游戲?qū)ο?保存場景調(diào)整場景視圖的攝像機創(chuàng)建方塊和小球(游戲?qū)ο?并調(diào)整坐標(biāo)運行程序模擬物理運動(添加Rigidbody組件)讓玩家角色跳起來(添加游戲腳本)修改游戲?qū)ο蟮念伾?創(chuàng)建材質(zhì))調(diào)整游戲畫面的尺寸(調(diào)整播放器設(shè)置)從項目視圖的create菜單中選擇C#Script,生成一個腳本文件雙擊打開腳本文件Unity規(guī)定C#腳本中類名必須與文件名相同。讓玩家角色跳起來(添加游戲腳本)把腳本拖曳到游戲?qū)ο笊闲薷挠螒驅(qū)捻椖恳晥D的菜象的顏色(創(chuàng)建材質(zhì))單中點擊create->Material添加地面讓游戲更有趣讓小球飛起來(物理運動和速度)創(chuàng)建大量小球(預(yù)設(shè)游戲?qū)ο?發(fā)射小球(通過腳本創(chuàng)建游戲?qū)ο?刪除畫面外的小球(通過腳本刪除游戲?qū)ο?防止玩家角色在空中起跳(發(fā)生碰撞時的處理)禁止玩家角色旋轉(zhuǎn)讓玩家角色不被彈開(設(shè)置重量)讓小球強烈反彈(設(shè)置物理材質(zhì))讓小球飛起來(物理運動和速度)給小球添加剛體組件創(chuàng)建一個叫Ball的腳本voidStart

(){this.GetComponent<Rigidbody>().velocity

=newVector3(-8.0f,8.0f,

0.0f);}創(chuàng)建大量小球(預(yù)設(shè)游戲?qū)ο?把層級視圖中的小球?qū)ο笸弦返巾椖恳晥D中項目視圖中將出現(xiàn)Ball項層級視圖中的Ball項文本變?yōu)樗{(lán)色關(guān)于預(yù)設(shè)預(yù)設(shè)是Unity開發(fā)中的必備技能之一??梢院唵蔚亟忉尦伞坝糜趧?chuàng)建大量相同的物件而使用的模板”。預(yù)設(shè)=印章從預(yù)設(shè)生成的游戲?qū)ο?印出的圖案整理項目視圖從項目視圖的菜單中點擊create->Folder發(fā)射小球(通過腳本創(chuàng)建游戲?qū)ο?在菜單欄中點擊GameObject->Create

empty此游戲?qū)ο蟊挥米靼l(fā)射臺,命名為Launcher創(chuàng)建Launcher腳本,并添加到游戲?qū)ο驦auncher上。publicclassLauncher:MonoBehaviour

{publicGameObject

ballPrefab;//小球預(yù)設(shè)voidUpdate(){if(Input.GetMouseButtonDown(1)){ //點擊鼠標(biāo)右鍵觸發(fā)Instantiate

(this.ballPrefab); //創(chuàng)建ballPrefab的實例}}}刪除畫面外的小球(通過腳本刪除游戲?qū)ο?在Ball.cs中添加OnBecameInvisible方法publicclassBall:MonoBehaviour

{//Usethisfor

initializationvoidStart()

{this.GetComponent<Rigidbody>().velocity=newVector3(-8.0f,8.0f,

0.0f);}void

OnBecameInvisible(){Destroy(this.gameObject); //刪除游戲?qū)ο髛}防止玩家角色在空中起跳(發(fā)生碰撞時的處理)為了防止玩家角色在空中再次起跳,需要:添加著陸標(biāo)記著陸標(biāo)記值為FALSE時不允許起跳將起跳瞬間的著陸標(biāo)記設(shè)為FALSE將著陸瞬間的著陸標(biāo)記設(shè)為TUREpublicclassPlayer:MonoBehaviour{protectedfloatjump_speed=5.0f;publicboolis_landing=

false;voidStart()

{this.is_landing=

false;}voidUpdate()

{if(this.is_landing

){ //著陸后觸發(fā)……if(Input.GetMouseButtonDown(0))

{this.is_landing=

false;this.GetComponent<Rigidbody>().velocity=Vector3.up*

this.jump_speed;}}}voidOnCollisionEnter(Collision

collision){this.is_landing=

true;}}禁止玩家角色旋轉(zhuǎn)讓玩家角色不被彈開(設(shè)置重量)將Mass的值改為0.01.當(dāng)兩個游戲?qū)ο蟀l(fā)生碰撞時,

Mass值較大的將保持原速度繼續(xù)運動,Mass較小的物體則容易受到?jīng)_擊而改變移動的方向。讓小球強烈反彈(設(shè)置物理材質(zhì))Bounciness值越大,游戲?qū)ο缶驮饺菀妆弧皬楅_”從項目視圖中選擇Ball預(yù)設(shè),把剛創(chuàng)建的物理材質(zhì)拖曳到檢視面板中Sphere

Collider標(biāo)簽下的Material。防止玩家角色在空中起跳(發(fā)生碰撞時的處理)為了防止玩家角色在空中再次起跳,需要:添加著陸標(biāo)記著陸標(biāo)記值為FALSE時不允許起跳將起跳瞬間的著陸標(biāo)記設(shè)為FALSE將著陸瞬間的著陸標(biāo)記設(shè)為TUREpublicclassPlayer:MonoBehaviour{protectedfloatjump_speed=5.0f;publicboolis_landing=

false;voidStart()

{this.is_landing=

false;}voidUpdate()

{if(this.is_landing

){ //著陸后觸發(fā)……if(Input.GetMouseButtonDown(0))

{this.is_landing=

false;this.GetComponent<Rigidbody>().velocity=Vector3.up*

this.jump_speed;}}}voidOnCollisionEnter(Collision

collision){this.is_landing=

true;}}unity游戲發(fā)布1.在Edit

-Preferences配置SDK文件 2.在File-

Build

setting打開發(fā)布平臺3.選擇要添加的場景和要發(fā)布的平臺UI界面設(shè)計UI對象是獨立的畫布創(chuàng)建:UI->Button創(chuàng)建一個空的游戲?qū)ο髣?chuàng)建一個腳本創(chuàng)建:UI->Button(退出按鈕)創(chuàng)建:空的游戲?qū)ο驫UIT1創(chuàng)建腳本quit第二個項目使用

Transform

組件實現(xiàn)月球繞地球轉(zhuǎn)、地球繞太陽轉(zhuǎn),同時太陽、地球、月球都在自轉(zhuǎn)。步驟1:創(chuàng)建3個球(菜單欄中GameObject->3D

Object->Sphere),命名為:Sun、Earth、Moon,分別代表太陽、地球、月球,調(diào)整位置坐標(biāo)分別為:(0,0,0)、(2,0,0)、(3,0,0),調(diào)整縮放系數(shù)分別為:1、0.7、0.5,再將3張圖片分別拖至對應(yīng)星球上。步驟2:創(chuàng)建1個Plane對象(GameObject->3D

Object->Plane),重命名為“BackGround”。在項目視圖(Project)中創(chuàng)建材質(zhì)球,方法是在項目視圖中選擇Create->Material,選中創(chuàng)建的材質(zhì)球,在Inspector窗口給材質(zhì)球添加黑色。再將該材質(zhì)球拖拽到BackGround游戲?qū)ο笊?。步驟3:在項目視圖(Project)中創(chuàng)建3個腳本,可以在Assets窗口右鍵,選擇Create->C#

Script,分別重命名為Sun、Earth、Moon,將3個Script組件分別拖拽至對應(yīng)星球上。publicclassSun:MonoBehaviour

{voidStart()

{}voidUpdate()

{transform.Rotate(-2*

Vector3.up);}}publicclassEarth:MonoBehaviour{privateTransform

center;voidStart()

{center=

GameObject.Find("Sun").transform;}voidUpdate()

{transform.RotateAround(center.position,-Vector3.up,2);transform.Rotate(-4*

Vector3.up);}}publicclassMoon:MonoBehaviour{privateTransform

center;privatefloattheta=

0f;voidStart()

{center=

GameObject.Find("Earth").transform;}voidUpdate()

{theta=theta+

0.08f;transform.position=newVector3(center.position.x+Mathf.Cos(theta),0f,center.position.z+

Mathf.Sin(theta));transform.Rotate(-3*

Vector3.up);}}Time.deltaTime每秒物體移動的速度如果要加上或減去一個值,應(yīng)該乘以Time.deltaTimeUpdate()的刷新是按照每幀來顯示的,但是Time.deltaTime按照每秒來統(tǒng)計的。THANKS項目2:吃金幣游戲剛體碰撞聲音UI設(shè)計游戲?qū)ο笮▲B

quad背景

quad

(scale:x=100,y=8,z=1)地面和天花板

cube (scale:x=100)背景建立一個背景對象quad;材質(zhì)的處理:

project中Create->Materials剛體球體碰撞器腳本需要把Mesh

Collider刪除當(dāng)兩個游戲?qū)ο髶碛袆傮w和碰撞器,不管腳本掛哪個游戲?qū)ο?,都可以進(jìn)入Oncollision,兩者都掛在碰撞器腳本,都會調(diào)用各自身腳本上的OnCollision方法。剛體碰撞有三個消息:OnCollisionEnterOnCollisionExitOncollisionStay碰撞穿過:OnTriggerEnter1、只要有剛體有碰撞器,并且與其他碰撞器碰撞就會進(jìn)入自身的碰撞器方法2、沒有剛體,有碰撞器的物體被一個擁有剛體的碰撞器碰撞,都會調(diào)用自身的碰撞器方法。3、沒有剛體的兩個碰撞器相撞不會調(diào)用任何碰撞器方法?最終結(jié)論:碰撞器(Collider)不需要剛體(Rigidbody)剛體(Rigidbody)要發(fā)生碰撞,一定需要碰撞器(Collider)碰撞器決定了碰撞發(fā)生時的邊界條件剛體決定了碰撞發(fā)生后的物體的運動效果沒有碰撞器的剛體,會在物理模擬中相互穿透。publicclassBirdMotion

:MonoBehaviour{Rigidbody

rigidBody;voidStart()

{rigidBody=GetComponent<Rigidbody>

();}floatmoveSpeed=2;boolflyEnable=true

;voidUpdate()

{if(flyEnable)

{transform.position+=newVector3(moveSpeed*Time.deltaTime,0,0);if(Input.GetMouseButtonDown(0))

{rigidBody.velocity=newVector3(0,3.0f,0);//thespeedof

rigidBody}}}publicvoidSetFlyEnable(bool

enable){flyEnable=

enable;if(!enable)

{rigidBody.velocity=newVector3(0,0,

0);//same

as: rigidBody.velocity=

Vector3.zero;}}}Time.deltaTime讓游戲中的運動基于時間,是指不管游戲的幀速率為多少,運動都保持恒定的速度Time.deltaTime 每秒物體移動的速度,能告訴我們從上一幀到現(xiàn)在經(jīng)歷了多少時間。對于25fps(幀/秒)的游戲來說,

Time.deltaTime為0.04f,即每幀的時間為4/100秒。如果要加上或減去一個值,應(yīng)該乘以Time.deltaTimeUpdate()的刷新是按照每幀來顯示的,但是Time.deltaTime按照每秒來統(tǒng)計的。CameraControl.cspublicclassCameraControl

:MonoBehaviour{publicTransformtransBird;//Updateiscalledonceper

framevoidUpdate()

{if(transform.position.x<transBird.position.x){Vector3posCam=transform.position;posCam.x=transBird.position.x;transform.position=

posCam;}}}選中游戲?qū)ο骲ird,選擇菜單欄中的Edit->Project

Settings->PhysicsLimit.cspublicclassLimit

:MonoBehaviour

{voidOnCollisionEnter(Collision

co1){if(co1.gameO=="bird")

{co1.gameObject.GetComponent<BirdMotion>().SetFlyEnable(false

);//audio_1.instance.PlayhitWall

();StartCoroutine

("WaitReset"); //啟動協(xié)程}//Debug.Log(co1.transform

.name);}IEnumerator

WaitReset(){//協(xié)程game

over,you

should

be

waiting.yieldreturnnewWaitForSeconds

(1.5f);//audio_1.instance.PlaygameOver

();Time.timeScale=0;//Time.deltaTime

//time.Time//dialogmanage.instance.ActiveDialogReset

(true);//Debug.Log

("failed");}}復(fù)習(xí)項目2:小鳥吃金幣游戲場景和相關(guān)的游戲?qū)ο笮▲B運動攝像機跟隨小鳥運動小鳥與地面碰撞添加聲音創(chuàng)建金幣統(tǒng)計小鳥吃金幣數(shù)(UI設(shè)計)游戲勝利進(jìn)入第二個游戲場景項目2:小鳥吃金幣游戲場景和相關(guān)的游戲?qū)ο笮▲B運動攝像機跟隨小鳥運動小鳥與地面碰撞添加聲音創(chuàng)建金幣統(tǒng)計小鳥吃金幣數(shù)(UI設(shè)計)游戲勝利進(jìn)入第二個游戲場景聲音?audio_1.cspublicclassaudio_1:MonoBehaviour

{AudioSourceaudio;publicAudioClipgold;publicAudioClip

hitWall;publicAudioClip

gameOver;publicAudioClip

Victory;staticpublicaudio_1

instance;void

Awake(){ instance

=

this; }voidStart

()

{ audio=GetComponent<AudioSource>

();}publicvoid

PlayGold(){ audio.clip

=gold; audio.Play(); }publicvoid

PlayhitWall(){ audio.clip

=hitWall

; audio.Play(); }audio.Play(); }publicvoid

PlaygameOver(){ audio.clip=gameOver

;publicvoid

PlayVictory(){ audio.clip=Victory

;audio.Play(); }}需要把它刪除Limit.cspublicclassLimit

:MonoBehaviour

{voidOnCollisionEnter(Collision

co1){if(co1.gameO=="bird")

{co1.gameObject.GetComponent<BirdMotion>().SetFlyEnable(false

);//audio_1.instance.PlayhitWall

();StartCoroutine

("WaitReset"); //啟動協(xié)程}//Debug.Log(co1.transform

.name);}IEnumerator

WaitReset(){//協(xié)程game

over,you

should

be

waiting.yieldreturnnewWaitForSeconds

(1.5f);//audio_1.instance.PlaygameOver

();Time.timeScale=0;//Time.deltaTime

//time.Time//dialogmanage.instance.ActiveDialogReset

(true);//Debug.Log

("failed");}}創(chuàng)建金幣UI設(shè)計金幣數(shù)統(tǒng)計(Canvas->Raw

Image)游戲勝利(Canvas->Image)游戲失敗(Canvas->Image)金幣數(shù)統(tǒng)計新建游戲?qū)ο蟛藛螜?GameObject->UI->Canvas->Raw

Image把游戲?qū)ο竺麨?goldcount設(shè)置紋理游戲?qū)ο?金幣gold.cspublicclassgold:MonoBehaviour{staticpublicintgoldCountTotal=

0;staticpublicintgoldCountCurrent=

0;voidOnTriggerEnter(Collider

co1){ if(=="bird"){goldCountCurrent++;goldcount.instance.SetGoldCount

(goldCountCurrent);//Debug.Log("goldCountCurrent="+goldCountCurrent);audio_1.instance.PlayGold

();Destroy

(gameObject);}}staticpublicvoid

ResetGoldCountCurrent(){ goldCountTotal=0;goldCountCurrent=

0;}staticpublicvoid

ResetAll(){ goldCountTotal=0;goldCountCurrent=

0;}}goldcount.csUsing

UnityEngine.UI;publicclassgoldcount:MonoBehaviour{staticpublicgoldcount

instance;publicText

goldCount;//Usethisfor

initializationvoidAwake(){instance=

this;}publicvoidSetGoldCount(int

count){goldCount.text=count.ToString

();}}運行結(jié)束finishlevel.cspublicclassfinishlevel:MonoBehaviour

{voidOnTriggerEnter(Colliderco1){if(=="bird")

{Time.timeScale=

0;//dialogmanage.instance.ActiveDialogVictory(true);audio_1.instance.PlayVictory

();}}}相關(guān)處理在Canvas中創(chuàng)建Image:Dialogreset --

failureDialogvictory---

success添加Text和Button在菜單欄中的GameObject->Create

Empty:SceneEmtyDialogmanage在項目視圖中創(chuàng)建C#腳本:sceneEmtydialogmanagedialogmanage.cspublicclassdialogmanage:MonoBehaviour{staticpublicdialogmanage

instance;voidAwake(){instance=

this;}publicGameObjectdialogreset;publicGameObject

dialogVictory;publicvoidActiveDialogReset(bool

enable){dialogreset.SetActive(enable

);}publicvoidActiveDialogVictory(bool

enable){dialogVictory.SetActive(enable

);}}sceneEmty.cspublicclasssceneEmty:MonoBehaviour

{//Usethisfor

initializationvoidStart(){gold.ResetGoldCountCurrent

();}//Updateiscalledonceper

framevoidUpdate(){}}Limit.cspublicclassLimit:MonoBehaviour{voidOnCollisionEnter(Collision

co1){if(co1.gameO=="bird")

{co1.gameObject.GetComponent<BirdMotion>().SetFlyEnable(false

);audio_1.instance.PlayhitWall();StartCoroutine

("WaitReset"); //啟動協(xié)程}}IEnumerator

WaitReset(){//協(xié)程game

over,

you

should

be

waiting.yieldreturnnewWaitForSeconds(1.5f);audio_1.instance.PlaygameOver

();Time.timeScale=0;//Time.deltaTime

//time.Timedialogmanage.instance.ActiveDialogReset

(true);}}相關(guān)處理在Canvas中創(chuàng)建Image:Dialogreset --

failureDialogvictory---

successButton按鈕on

click事件在菜單欄中的GameObject->Create

Empty:NaviGation在項目視圖中創(chuàng)建C#腳本:NavigationNavigation.csusing

UnityEngine.SceneManagement;publicclassNavigation

:MonoBehaviour{staticpublicNavigation

instance;voidAwake(){instance=

this;}publicvoidLoadScene(string

sceneName){Time.timeScale=1;SceneManager.LoadScene(sceneName

);}}按鈕unity游戲發(fā)布1.在Edit

-Preferences配置SDK文件 2.在File-

Build

setting打開發(fā)布平臺3.選擇要添加的場景和要發(fā)布的平臺實踐項目利用學(xué)習(xí)的知識,創(chuàng)建一個具有一定交互功能的小游戲,要求說明:場景中的游戲?qū)ο笥螒驅(qū)ο蟮膭幼髁斜硐嚓P(guān)的腳本文件游戲?qū)ο罅鞒虉DAR系列教程-Vuforia入門sOhoosewh吐UnitycomponentsyoUJwalilt如downloadand

install,令口

Docume而汕

Cl)n口

醞ros忒

Viswal

St

wdio

Commrwn

ity

17口扣droid

Bu

ild

Support口iOSBuildS1..1pport

口tvOSBuildSupport口

LinuxBuildSupport口MacBwildSupport

(MCl)no)口

UWPBw11dSwpport(.NEDescMpt1onPosition

_you「mouseove「

acomponenttoseeits

descriptionre!J七L

til!lilcl

Sl!lp,p,ort口Windows8U1ildSl!lpport

(IL2CPP)口

Fa岱

book

Gameroom

Bl!lild

Support

Installspace

required:128.3MBUnity2018.2.0f2Download

Assistant<

Ba改

[Next

> J

ICancelAR是什么增強現(xiàn)實技術(shù)(Augmented

Reality,簡稱

AR)是指把現(xiàn)實世界中某一區(qū)域原本不存在的信息,基于某種媒介并經(jīng)過仿真后再疊加到真實世界,被人類感官所感知的技術(shù)。目前通用的定義包括以下三方面的內(nèi)容:將虛擬物與現(xiàn)實結(jié)合即時互動三維AR技術(shù)原理簡介Unity兼容的主流AR

SDKVuforia功能列表適合的學(xué)習(xí)人群1.有一定的Unity基礎(chǔ)的同學(xué);2.對AR技術(shù)感興趣的初學(xué)者;創(chuàng)建項目創(chuàng)建GameObject->Vuforia->AR

CameraFile->BuildSettings->playersettings->XR

Settings(VuforiaAR)選擇游戲?qū)ο驛R

Camera, Open VuforiaConfiguration在官網(wǎng)注冊密匙DirectionalLighlARCame

raCreateEm

ptyCrea

t

e

Em

pty

C

hi

l

d3D

O

b

je

ct2DO

b

je

ctWindow

H叩Ctr

l

+

S

h

ift

+

NAlt+S

hift+

N1

'.

勹立

一t

立血EffectsLightAu

d

ioVid

eo!JI四Ca

me

raCenterOn

ChildrenMakeParentClearParentApplyChangesTo

PrefabBreakPrefabInstanceSet

as

rstsiblingSetaslast

siblingMoveTo

ViewAlignWith

ViewAlignViewto

SelectedToggleActive

StateCtrl+=Ctrl+-Ctrl+Alt+FCtrl+Shift+

FI

m

a

g

eM

u

lt

i

Im

a

g

eCylin

d

ri

ca

lI

ma

geCl

ou

d

Im

a

g

eCa

m

e

ra

Ima

g

eModelTarget3DSca

nVu

M

a

rkG

ro

u

n

d

Pl

a

n

eSe,-vrces PSVit

aCompress

ionMethod色巨D(zhuǎn)Ta

,-getPlatformAi-ch,tectu

,-eCopyPDBfil

esCreateVisualS

tudioSolution

0DevelopmentBuildAutoconnectPrnfrle,-ScnptDebuggingScnptsOnly

Burld093CompanyNameProduct

NameDefault

IconDefault

C

u

rso

r[AddOpenScenes

]Cu1°s

o1°

Hot

s

po

t"" PC,Mac

&LinuxStanda

loneDefaultCompany20220323易一SettingsforPC,Mac&LinuxStanda

loneIconResolutionand

PresentationSplash

Image廣]Other

Setting?XR

SettingsV11iualRealitySuppo代ed

DIVufonaAugmentedReal

rt360Ster·eoCapt

ur

e 0··IARCamer·

aIOStatic

TI

_.,Tag

[

Untagged 令jLayerI

Default今

1

'I'..--.Transfor

m回4

眾.''Z

0Rotation

X阿二丫

0Position X匠二

YOl!

:'X

',Scale

1-Y

1

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論