Unity進(jìn)階與實(shí)踐解析 課件 第3章 Unity入門_第1頁
Unity進(jìn)階與實(shí)踐解析 課件 第3章 Unity入門_第2頁
Unity進(jìn)階與實(shí)踐解析 課件 第3章 Unity入門_第3頁
Unity進(jìn)階與實(shí)踐解析 課件 第3章 Unity入門_第4頁
Unity進(jìn)階與實(shí)踐解析 課件 第3章 Unity入門_第5頁
已閱讀5頁,還剩80頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

3.1創(chuàng)建基礎(chǔ)的游戲場景

3.2Unity資源

3.3物理系統(tǒng)

3.4UGUI

3.5EVENT事件3.1創(chuàng)建基礎(chǔ)的游戲場景3.1.1Camera相機(jī)1.相機(jī)簡介相機(jī)是玩家用于捕捉和顯示世界的一種裝置,在一個(gè)場景中可以有數(shù)量不限的相機(jī)。它們能夠以任何順序在屏幕上的任何地方來渲染,或僅僅渲染屏幕的一部分。通過在Hierrchy面板中單擊鼠標(biāo)右鍵,選擇Camera即可建立。相機(jī)在場景中的應(yīng)用如圖3.1所示。2.相機(jī)主要屬性通過相機(jī)的Inspector面板可以看到相機(jī)的屬性,如圖3.2和圖3.3所示。相機(jī)屬性詳細(xì)介紹如表3.1所示。3.1.2Terrain地形1.地形創(chuàng)建在Hierrchy面板中單擊鼠標(biāo)右鍵,在彈出的列表中選擇3DObject下的Terrain選項(xiàng),即可創(chuàng)建一個(gè)地形,如圖3.4所示。2.地形繪制(1)在場景里添加一個(gè)Terrain。(2)添加Terrain后會(huì)自動(dòng)在Inspector中生成Terrain的屬性面板,面板里的4個(gè)按鈕分別具有不同的作用,第一個(gè)按鈕是毛筆形狀,該按鈕可以修改地形的高度、順滑度、基本的地形貼圖等。點(diǎn)擊第一個(gè)按鈕會(huì)出現(xiàn)CreateNeighborTerrains選項(xiàng)卡,在該選項(xiàng)卡的下拉菜單中選擇SetHeight來設(shè)置地形高度,如圖3.5~圖3.7所示。設(shè)置完高度后就可以繪制地形了,點(diǎn)擊鼠標(biāo)左鍵進(jìn)行移動(dòng),可以把鼠標(biāo)經(jīng)過的地方按照設(shè)置好的高度進(jìn)行地形繪制。如果同時(shí)按住Ctrl鍵和鼠標(biāo)左鍵,便不會(huì)對(duì)地形進(jìn)行高度繪制。設(shè)置完地形高度之后選擇PaintTexture,為地形添加一個(gè)貼圖,如圖3.8所示,并對(duì)貼圖進(jìn)行設(shè)置,如圖3.9所示。點(diǎn)擊EditTerrainLayers選擇合適的貼圖,如圖3.9中2所示,并在下方出現(xiàn)的詳細(xì)設(shè)置中,用戶可以根據(jù)情況自行進(jìn)行設(shè)置。(3)拉高地形和降低地形(制作高山和低谷)。選中RaiseorLowerTerrain后選擇下面的筆刷并設(shè)置筆刷大小,然后在地形上就可以繪制了,如圖3.10、圖3.11所示。鼠標(biāo)左鍵用于拉高地形,鼠標(biāo)左鍵?+?Shift用于降低地形。3.種樹工具選中第二個(gè)種樹按鈕,并點(diǎn)擊EditTrees…→Add來添加不同的樹,如圖3.12所示。選擇好樹的模型后,可以點(diǎn)擊MassPlaceTrees按鈕來大面積均勻地在全部地形中種樹,如圖3.13所示。如果想要自定義樹的數(shù)量屬性,可以自行設(shè)置數(shù)值大小,如圖3.14所示。也可以設(shè)置筆刷的大小、種樹的密集程度、樹的高度等,按住Shift操作可以獲得其相反的屬性,如圖3.15所示。4.添加草坪添加草坪的操作和種樹是同理的,點(diǎn)擊3個(gè)按鈕,選擇合適的筆刷并設(shè)置筆刷大小,即可進(jìn)行草坪的繪制,如圖3.16、圖3.17所示。3.1.3Skybox天空盒在Unity新建的項(xiàng)目場景中,都會(huì)默認(rèn)提供一個(gè)基本的天空盒效果,但是這個(gè)天空盒的效果較為普通,可以將其改為自己想要的其他天空盒效果。從菜單欄中依次選擇Windows→AssetStore命令,在搜索欄中輸入Skybox并按回車鍵,選擇FREEONLY就可以看到大量的免費(fèi)天空盒,如圖3.18所示。選擇自己喜歡的天空盒,點(diǎn)擊Download按鈕,如圖3.19所示。下載完成后,點(diǎn)擊對(duì)話框中的Import按鈕,即可將新下載的天空盒導(dǎo)入到場景中。在菜單欄中依次選擇Window→Lighting→Settings命令,在彈出的Lighting對(duì)話框中點(diǎn)擊Environment下的SkyboxMaterial選項(xiàng)右側(cè)的小圓圈,選擇剛才導(dǎo)入的天空盒,如圖3.20所示。3.2Unity資源3.2.1模型導(dǎo)入1.模型導(dǎo)入簡介1)3D模型的導(dǎo)入方式依次選擇菜單欄中的Aseets→ImportPackage→CustomPackage或者直接拖動(dòng)文件到Assets文件夾中,即可導(dǎo)入3D模型。Unity支持使用大多數(shù)常規(guī)3D建模軟件所創(chuàng)建的模型,包括Maya、Cinema4D、3dsMax、Cheetah3D、Modo、Lightwave、Blender等。Unity支持兩種不同類型的網(wǎng)絡(luò)模型文件,一種是從3D建模軟件中導(dǎo)出的?.fbx或?.obj文件,這種類型的文件可以在很多第三方軟件中導(dǎo)入和編輯。而另一種則是部分3D建模軟件的原生格式,如3dsMax中的.max文件,或是Blender中的.blend文件,這類文件在導(dǎo)入U(xiǎn)nity時(shí)會(huì)經(jīng)過一定的轉(zhuǎn)換,因此不能在其他的軟件中直接編輯,當(dāng)然,有一種例外是SketchUp的?.skp文件,可以在SketchUp和Unity中隨意打開和編輯。2)2D圖片的導(dǎo)入方式Unity支持的2D圖片格式有TIFF、PSD、TGA、JPG、PNG、GIF、BMP、IFF、PICT等,其中PNG格式是用得最多的格式。為了優(yōu)化效率,建議圖片尺寸是2的n次冪,如32、64、1024等。依次選擇菜單欄中的Assets→Create→ImportNewAssets(一次只能導(dǎo)一張圖片)或者直接將資源拖動(dòng)到Project視圖中的Assets文件夾中(可以同時(shí)導(dǎo)入多張圖片),即可導(dǎo)入2D圖片。這里需要特別注意的是,如果希望在2D游戲中使用2D圖像文件作為精靈,或者作為2D游戲中的UI圖片元素,那么必須手動(dòng)將其TextureType更改為Sprite(2DandUI)。2.精靈渲染器精靈是Unity2D里面通過圖片紋理實(shí)現(xiàn)的游戲?qū)ο?,通常是游戲里面的玩家、敵人等。在Unity里面創(chuàng)建一個(gè)精靈的操作非常簡單,可以依次選擇GameObject→2DObject→Sprite創(chuàng)建精靈。SpriteRenderer組件用于渲染精靈,還可以通過Components菜單將該組件添加到現(xiàn)有的游戲?qū)ο笊?,精靈渲染器屬性如圖3.21、圖3.22所示,精靈渲染器屬性介紹表如表3.2所示。表3.2精靈渲染器屬性介紹3.2.2材質(zhì)、著色器和紋理1.基本概念材質(zhì):物體的質(zhì)地,指顏色、紋理、光滑度、透明度、反射率、折射率、發(fā)光度等,實(shí)際就是Shader的實(shí)例。Shader著色器:用來控制可編程圖形渲染管線的程序,為了方便游戲開發(fā)者使用,Unity提供了數(shù)量超過60個(gè)的內(nèi)建Shader,包括從最簡單的頂點(diǎn)光照效果到高光、法線、反射等游戲中最常用的材質(zhì)效果。這些內(nèi)建Shader的代碼可以在Unity官方網(wǎng)站下載,開發(fā)者基于這些代碼可以開發(fā)更多個(gè)性化的Shader。在Unity中基于物理著色的內(nèi)建著色器叫做StandarShader(標(biāo)準(zhǔn)著色器)。Texture紋理:附加到物體表面的貼圖。2.標(biāo)準(zhǔn)Shader相關(guān)設(shè)置選項(xiàng)Shader屬性如圖3.23、圖3.24所示。1)標(biāo)準(zhǔn)Shader的四種不同渲染模式(1)Opaque:默認(rèn)的設(shè)置,適合渲染不透明的物體。(2)Cutout:允許渲染帶有完全不透明或完全透明區(qū)域的物體。(3)Fade:允許通過透明度的等級(jí)來實(shí)現(xiàn)物體的漸變顯示。(4)Transparent:允許渲染一些純透明的物體,比如玻璃、透明塑料等。2)標(biāo)準(zhǔn)的Shader的貼圖類型(1)Albedo:用于定義材質(zhì)的色彩和透明度。(2)Metallic:用于定義材質(zhì)表面對(duì)光的反射量,可以通過兩種方式進(jìn)行控制,一種方式是拖動(dòng)Metallic和Smoothness的滑動(dòng)條。Metallic數(shù)值決定了材質(zhì)接近金屬的程度,如果Metallic數(shù)值接近1,那么對(duì)光的反射量就最大。而Smoothness數(shù)值則決定了材質(zhì)表面的光滑度。另一種方式是給Metarial賦予一個(gè)texturemap。當(dāng)給Metallic賦予材質(zhì)時(shí),Metallic滑動(dòng)條都會(huì)消失,材質(zhì)的Red通道決定Metarial值,而Alpha通道則決定了材質(zhì)的表面光滑度。Source值表示選擇哪個(gè)屬性紋理的Alpha通道值。(3)NormalMap:法線貼圖,給物體表面添加類似刮痕或者凹槽的效果。法線貼圖是一種特殊類型的圖片,可以通過3D建模軟件生成,也可以手動(dòng)生成。(4)Height?Map:高度貼圖是一種類似法線貼圖的技術(shù),用于給表面定義凹凸效果。(5)OcclusionMap:剔除貼圖定義物體特殊區(qū)域的間接光亮,通常在3D建模軟件中基于3D模型的拓?fù)浣Y(jié)構(gòu)創(chuàng)建。剔除貼圖是灰度圖,白色代表該區(qū)域?qū)⑼耆邮臻g接光照,黑色則代表該區(qū)域?qū)⒉唤邮杖魏伍g接光照。(6)Emission:發(fā)光,控制材質(zhì)表面所發(fā)射光線的色彩和強(qiáng)度,一旦設(shè)置了Emission值,材質(zhì)看起來就像是從內(nèi)部發(fā)光一樣。(7)SecondaryMaps:允許設(shè)置材質(zhì)的第二個(gè)貼圖。3.創(chuàng)建和使用材質(zhì)要?jiǎng)?chuàng)建新材質(zhì),可從Project視圖中單擊鼠標(biāo)右鍵,在彈出的列表中依次選擇Assets→Create→Material。默認(rèn)情況下會(huì)為新材質(zhì)指定標(biāo)準(zhǔn)著色器,并且所有貼圖屬性都為空。創(chuàng)建材質(zhì)后,可將其應(yīng)用于對(duì)象并在Inspector中調(diào)整其所有屬性。要將材質(zhì)應(yīng)用于對(duì)象,只需將其從Project視圖拖到Scene或Hierarchy視圖中的任何對(duì)象上。設(shè)置材質(zhì)屬性的方法如下:(1)選擇希望特定材質(zhì)使用的著色器,在Inspector中展開Shader的下拉列表中選擇新的著色器,所選的著色器將決定可更改的屬性。(2)屬性可能包括顏色、滑動(dòng)條、紋理、數(shù)字或矢量,如果已將材質(zhì)應(yīng)用于

Scene

視圖中的活動(dòng)對(duì)象,將看到屬性更改會(huì)實(shí)時(shí)應(yīng)用于對(duì)象。將紋理應(yīng)用于屬性時(shí)可采用兩種方法,分別是:①

將其從Project視圖拖到紋理方塊上。②

單擊Select按鈕后從顯示的下拉列表中選擇紋理。3.2.3音頻Unity音頻相關(guān)組件主要有音頻源(AudioSource)、音頻剪輯(AudioClip)、音頻監(jiān)聽器(AudioListener)、過濾器組件等幾部分。音頻源是場景中某個(gè)位置的發(fā)聲裝置,好像一個(gè)喇叭,播放著音頻剪輯。發(fā)出的聲音將輸出到音頻監(jiān)聽器,或者聲音混淆器(AudioMixer)。一般相機(jī)會(huì)默認(rèn)自帶一個(gè)AudioListener組件,也就是說一個(gè)場景中,存在了默認(rèn)相機(jī)的情況下,只要添加一個(gè)音頻源,設(shè)置了播放的音頻剪輯,就可以完成播放的操作,而對(duì)于聽到的聲音強(qiáng)弱和效果,則根據(jù)后續(xù)需要來決定。音頻源可以播放任意類型的音頻剪輯,它可以被配置為2D音頻源、3D音頻源或者2D、3D音頻源的混合形式(SpatialBlend,即空間混合)。聲音可以通過多個(gè)揚(yáng)聲器進(jìn)行輸出,用于模擬立體聲。

聲音也可以在3D和2D音頻源之間進(jìn)行空間混合變換,這種變換可以通過距離上的衰減曲線來進(jìn)行控制。另外,如果音頻監(jiān)聽器伴隨著一個(gè)或者多個(gè)回音區(qū)域(ReverbZones),將同時(shí)產(chǎn)生回音。也可以對(duì)音頻源應(yīng)用一些特殊的音頻濾波器來獲得更加豐富的音效體驗(yàn)。音頻源屬性如圖3.25、圖3.26所示,音頻源屬性詳細(xì)介紹如表3.3所示。表3.3音頻源AudioSourc屬性介紹3.3物理系統(tǒng)3.3.1剛體1.剛體概述剛體(Rigidbody)可以讓一個(gè)物體受到物理影響,比如添加Rigidbody組件后,物體會(huì)立馬對(duì)重力做出反應(yīng)。如果物體上還添加了Collider組件,物體在受到碰撞時(shí)也會(huì)移動(dòng)。在Unity中,如果希望兩個(gè)對(duì)象發(fā)生碰撞,那么這兩個(gè)對(duì)象上都要有Collider組件,并且其中一個(gè)對(duì)象上必須有Rigidbody組件。當(dāng)一個(gè)對(duì)象上掛載著Rigidbody組件時(shí),應(yīng)該使用“力”來移動(dòng)物體,由物理引擎來計(jì)算移動(dòng)過程中的物理效果,而不是修改對(duì)象的Transform組件中的Position屬性。在日常開發(fā)中,也會(huì)遇到不該用力移動(dòng)對(duì)象,但仍然希望物體進(jìn)行物理計(jì)算的情況。例如玩家的移動(dòng),這種移動(dòng)稱為動(dòng)力學(xué)運(yùn)動(dòng),此時(shí),可以勾選Rigidbody組件下的IsKinematic屬性。Rigidbody基本屬性如圖3.27所示。2.Rigidbody屬性介紹Rigidbody屬性詳細(xì)介紹如表3.4所示。3.3.2碰撞體1.碰撞體概述碰撞體是物理組件中的一類,3D物理組件和2D物理組件有獨(dú)立的碰撞體組件,它要與剛體一起添加到游戲?qū)ο笊喜拍苡|發(fā)碰撞。如果兩個(gè)剛體碰撞在一起,除非兩個(gè)對(duì)象有碰撞體時(shí)物理引擎才會(huì)計(jì)算碰撞,否則,物理模擬中沒有碰撞體的剛體會(huì)彼此相互穿過。最簡單(并且也是處理器開銷最低)的碰撞體是所謂的原始碰撞體類型。在3D中,這些碰撞體為盒型碰撞體、球形碰撞體和膠囊碰撞體。在2D中,可以使用2D盒型碰撞體和2D圓形碰撞體??梢詫⑷我鈹?shù)量的上述碰撞體添加到單個(gè)對(duì)象以創(chuàng)建復(fù)合碰撞體。一般可以通過選中游戲?qū)ο?,依次選擇菜單欄中的Component→Physics命令來為游戲?qū)ο筇砑硬煌愋偷呐鲎搀w,如圖3.28所示。碰撞體類型分為以下6種:(1)盒型碰撞體(BoxCollider):立方體的原始形狀。(2)球形碰撞體(SphereCollider):球體的原始形狀。(3)膠囊碰撞體(CapsuleCollider):膠囊體的原始形狀。(4)網(wǎng)格碰撞體(MeshCollider):根據(jù)對(duì)象網(wǎng)格創(chuàng)建碰撞體,不能與另一個(gè)網(wǎng)格碰撞體碰撞。(5)車輪碰撞體(WheelCollider):專門用于創(chuàng)建汽車或其他移動(dòng)車輛。(6)地形碰撞體(TerrainCollider):處理與Unity地形系統(tǒng)的碰撞。2.提示兩個(gè)剛體的相對(duì)質(zhì)量決定了它們相互碰撞時(shí)的反應(yīng)情況。使一個(gè)剛體具有比另一個(gè)剛體更大的質(zhì)量并不會(huì)使其在自由落體時(shí)降落得更快,要使用阻力Drag,較低的Drag值會(huì)讓對(duì)象看起來較重,較高的Drag值會(huì)讓對(duì)象看起來較輕。Drag的典型值為0.001(實(shí)心金屬塊)~10(羽毛)之間。3.腳本碰撞回調(diào)發(fā)生碰撞時(shí),物理引擎會(huì)在附加到相關(guān)對(duì)象的所有腳本上調(diào)用特定名稱的函數(shù)??梢栽谶@些函數(shù)中放置所需的任何代碼來響應(yīng)碰撞事件。例如當(dāng)汽車撞到障礙物時(shí),可以播放碰撞音效。在第一個(gè)檢測(cè)到碰撞的物理更新中,將調(diào)用OnCollisionEnter()函數(shù)。在保持接觸的更新期間,將調(diào)用OnCollisionStay()函數(shù),最后由OnCollisionExit()函數(shù)指示接觸已經(jīng)中斷。觸發(fā)碰撞體會(huì)調(diào)用模擬的OnTriggerEnter()、OnTriggerStay()和OnTriggerExit()函數(shù)。請(qǐng)注意,對(duì)于2D物理,可使用在名稱中附加了2D字樣的等效函數(shù),例如OnCollisionEnter2D()函數(shù)。對(duì)于正常的非觸發(fā)碰撞,所涉及的對(duì)象中至少有一個(gè)對(duì)象必須具有非運(yùn)動(dòng)剛體(即必須關(guān)閉IsKinematic)屬性。如果兩個(gè)對(duì)象都是運(yùn)動(dòng)剛體,則不會(huì)調(diào)用OnCollisionEnter()等函數(shù)。對(duì)于觸發(fā)碰撞,此限制不適用,因此運(yùn)動(dòng)和非運(yùn)動(dòng)剛體都會(huì)在進(jìn)入觸發(fā)碰撞體時(shí)提示調(diào)用OnTriggerEnter()函數(shù)。4.碰撞體相互作用碰撞體彼此之間的相互作用因剛體組件的配置不同而不同。剛體組件的3個(gè)重要配置是靜態(tài)碰撞體(StaticCollider)(即完全沒有附加任何剛體)、剛體碰撞體(RigidbodyCollider)和運(yùn)動(dòng)剛體碰撞體(KinematicRigidbodyCollider)。1)靜態(tài)碰撞體靜態(tài)碰撞體是一種具有碰撞體但沒有剛體的游戲?qū)ο?。靜態(tài)碰撞體用于表示關(guān)卡幾何體,始終停留在同一個(gè)地方,永遠(yuǎn)不會(huì)四處移動(dòng)??拷膭傮w對(duì)象將與靜態(tài)碰撞體發(fā)生碰撞,但不會(huì)移動(dòng)靜態(tài)碰撞體。假定靜態(tài)碰撞體永遠(yuǎn)不會(huì)移動(dòng)或改變,并且可以基于此假設(shè)進(jìn)行有用的優(yōu)化。因此,在游戲運(yùn)行過程中不應(yīng)禁用、啟用、移動(dòng)或縮放靜態(tài)碰撞體。如果更改靜態(tài)碰撞體,則會(huì)導(dǎo)致物理引擎進(jìn)行額外的內(nèi)部重新計(jì)算,從而導(dǎo)致游戲性能大幅下降。這些更改有時(shí)會(huì)使碰撞體處于不明確的狀態(tài),從而產(chǎn)生錯(cuò)誤的物理計(jì)算。2)剛體碰撞體剛體碰撞體是一種附加碰撞體和普通非運(yùn)動(dòng)剛體的游戲?qū)ο?。剛體碰撞體完全由物理引擎模擬,并可響應(yīng)通過腳本施加的碰撞和力。剛體碰撞體可與其他對(duì)象(包括靜態(tài)碰撞體)碰撞,是使用物理組件的游戲中最常用的碰撞體配置。3)運(yùn)動(dòng)剛體碰撞體運(yùn)動(dòng)剛體碰撞體是一種附加碰撞體和運(yùn)動(dòng)剛體(即啟用剛體的IsKinematic屬性)的游戲?qū)ο蟆?墒褂媚_本來移動(dòng)運(yùn)動(dòng)剛體對(duì)象(通過修改對(duì)象的變換組件),但該對(duì)象不會(huì)像非運(yùn)動(dòng)剛體一樣響應(yīng)碰撞和力。運(yùn)動(dòng)剛體應(yīng)該用于符合以下特征的碰撞體:偶爾可能被移動(dòng)、禁用或啟用,除此之外的行為應(yīng)該像靜態(tài)碰撞體一樣。與靜態(tài)碰撞體不同,移動(dòng)的運(yùn)動(dòng)剛體會(huì)對(duì)其他對(duì)象施加摩擦力,并在雙方接觸時(shí)“喚醒”其他剛體。即使處于不動(dòng)狀態(tài),運(yùn)動(dòng)剛體碰撞體也會(huì)對(duì)靜態(tài)碰撞體產(chǎn)生不同的行為。如果將碰撞體設(shè)置為觸發(fā)器,則還需要向其添加剛體以便在腳本中接收觸發(fā)器事件。如果不希望觸發(fā)器在重力作用下跌落或在其他方面受物理影響,則可以在其剛體上設(shè)置IsKinematic屬性,使用IsKinematic屬性隨時(shí)讓剛體組件在常態(tài)和運(yùn)動(dòng)行為之間切換。3.3.3觸發(fā)器1.基本概念在Unity3D中,檢測(cè)碰撞發(fā)生的方式有兩種,一種是利用碰撞體,另一種則是利用觸發(fā)器。觸發(fā)器用來觸發(fā)事件,在很多游戲引擎或工具中都有觸發(fā)器。當(dāng)綁定了碰撞體的游戲?qū)ο筮M(jìn)入觸發(fā)器區(qū)域時(shí),會(huì)運(yùn)行觸發(fā)器對(duì)象上的OnTriggerEnter()函數(shù),同時(shí)需要在檢視面板中的碰撞體組件中勾選IsTrigger復(fù)選框,如圖3.29所示。腳本系統(tǒng)可以使用OnCollisionEnter()函數(shù)檢測(cè)何時(shí)發(fā)生碰撞并啟動(dòng)操作。但是,也可以直接使用物理引擎檢測(cè)碰撞體何時(shí)進(jìn)入另一個(gè)對(duì)象的空間而不會(huì)產(chǎn)生碰撞。配置為觸發(fā)器(使用IsTrigger屬性)的碰撞體不會(huì)表現(xiàn)為實(shí)體對(duì)象,只會(huì)允許其他碰撞體穿過。當(dāng)碰撞體進(jìn)入其空間時(shí),觸發(fā)器將在觸發(fā)器對(duì)象的腳本上調(diào)用OnTriggerEnter()函數(shù)。2.3D觸發(fā)器與碰撞器的區(qū)別1)觸發(fā)信息檢測(cè)使用的相關(guān)函數(shù)MonoBehaviour.OnTriggerEnter(Collidercollider)是當(dāng)進(jìn)入觸發(fā)器時(shí)執(zhí)行一次。MonoBehaviour.OnTriggerExit(Collider

collider)是當(dāng)退出觸發(fā)器時(shí)執(zhí)行一次。MonoBehaviour.OnTriggerStay(Collider

collider)是當(dāng)逗留觸發(fā)器時(shí)不斷執(zhí)行。2)碰撞信息檢測(cè)使用的相關(guān)函數(shù)MonoBehaviour.OnCollisionEnter(Collisioncollision)是當(dāng)進(jìn)入碰撞器時(shí)執(zhí)行一次。MonoBehaviour.OnCollisionExit(Collisioncollision)是當(dāng)退出碰撞器時(shí)執(zhí)行一次。MonoBehaviour.OnCollisionStay(Collisioncollision)是當(dāng)逗留碰撞器時(shí)不斷執(zhí)行。3.2D觸發(fā)器與碰撞器的區(qū)別1)觸發(fā)信息檢測(cè)使用的相關(guān)函數(shù)MonoBehaviour.OnTriggerEnter2D(Collider2D)是當(dāng)進(jìn)入2D觸發(fā)器時(shí)執(zhí)行一次。MonoBehaviour.OnTriggerExit2D(Collider2D)是當(dāng)退出2D觸發(fā)器時(shí)執(zhí)行一次。MonoBehaviour.OnTriggerStay2D(Collider2D)是當(dāng)逗留2D觸發(fā)器時(shí)不斷執(zhí)行。2)碰撞信息檢測(cè)使用的相關(guān)函數(shù)MonoBehaviour.OnCollisionEnter2D(Collision2D)是當(dāng)進(jìn)入2D碰撞器時(shí)執(zhí)行一次。MonoBehaviour.OnCollisionExit2D(Collision2D)是當(dāng)退出2D碰撞器時(shí)執(zhí)行一次。MonoBehaviour.OnCollisionStay2D(Collision2D)是當(dāng)逗留2D碰撞器時(shí)不斷執(zhí)行。4.物體發(fā)生碰撞的必要條件碰撞器是觸發(fā)器的載體,而觸發(fā)器只是碰撞器的一個(gè)屬性。發(fā)生碰撞的兩個(gè)物體都必須帶有碰撞器,其中一個(gè)物體還必須帶有Rigidbody剛體。碰撞器是一群組件,它包含了很多種類,如BoxCollider,MeshCollider等,這些碰撞器應(yīng)用的場合不同,但都必須加到游戲?qū)ο笊?。觸發(fā)器只需要在檢視面板中的碰撞器組件中勾選IsTrigger屬性復(fù)選框。5.產(chǎn)生碰撞的條件若要產(chǎn)生碰撞,必須雙方都要有碰撞器。運(yùn)動(dòng)的一方一定要有剛體,另一方有無剛體則無所謂。注:如果運(yùn)動(dòng)的一方無剛體,它去碰撞靜止的剛體就相當(dāng)于沒有撞上。6.接觸的兩種方式Collision碰撞會(huì)造成物理碰撞,可以在碰撞時(shí)執(zhí)行OnCollision事件。Trigger觸發(fā)則會(huì)取消所有的物理碰撞,可以在觸發(fā)時(shí)執(zhí)行OnTrigger事件。注:兩個(gè)物體接觸不可能同時(shí)產(chǎn)生碰撞和觸發(fā),最多產(chǎn)生其中一種。但是可以AB兩個(gè)物體產(chǎn)生碰撞,而AC兩個(gè)物體產(chǎn)生觸發(fā)。7.產(chǎn)生不同方式接觸的條件1)Collision碰撞(1)雙方都有碰撞體。(2)運(yùn)動(dòng)的一方必須有剛體。(3)雙方不可同時(shí)勾選Kinematic選項(xiàng)。(4)雙方都不可勾選Trigger觸發(fā)器。2)Trigger觸發(fā)(1)雙方都有碰撞體,運(yùn)動(dòng)的一方必須是剛體。(2)至少一方勾選Trigger觸發(fā)器。3.3.4關(guān)節(jié)1.關(guān)節(jié)的分類關(guān)節(jié)可分為鉸鏈關(guān)節(jié)、固定關(guān)節(jié)、彈簧關(guān)節(jié)、角色關(guān)節(jié)和可配置關(guān)節(jié)五大類。2.鉸鏈關(guān)節(jié)鉸鏈關(guān)節(jié)(HingeJoint)將兩個(gè)物體以鏈條的形式綁在一起,當(dāng)力量大于鏈條的固定力矩時(shí),兩個(gè)物體就會(huì)產(chǎn)生相互的拉力。鉸鏈關(guān)節(jié)將兩個(gè)剛體組合在一起,對(duì)剛體進(jìn)行約束,讓它們就像通過鉸鏈連接一樣移動(dòng)。鉸鏈關(guān)節(jié)非常適合用于門,但也可用于模擬鏈條、鐘擺等對(duì)象。鉸鏈關(guān)節(jié)具體屬性如圖3.30、圖3.31所示,屬性具體內(nèi)容如表3.5所示。3.固定關(guān)節(jié)

固定關(guān)節(jié)將兩個(gè)物體永遠(yuǎn)以相對(duì)的位置固定在一起,即使發(fā)生物理改變,它們之間的相對(duì)位置也不變。這類似于管控,但是實(shí)現(xiàn)的方式是通過物理系統(tǒng)而不是變換(Transform)層級(jí)視圖。使用固定關(guān)節(jié)的最佳場合是在希望對(duì)象可以輕松相互分離時(shí),或者在沒有管控情況下連接兩個(gè)對(duì)象的移動(dòng),固定關(guān)節(jié)的屬性如圖3.32、圖3.33所示。固定關(guān)節(jié)的屬性介紹如表3.6所示。4.彈簧關(guān)節(jié)

彈簧關(guān)節(jié)將兩個(gè)物體以彈簧的形式綁定在一起,擠壓它們會(huì)得到向外的力,拉伸它們將得到向里的力,彈簧關(guān)節(jié)具體屬性如圖3.34、圖3.35所示。

彈簧關(guān)節(jié)將兩個(gè)剛體連接在一起,但允許兩者之間的距離改變,就好像它們通過彈簧連接一樣。彈簧關(guān)節(jié)的屬性介紹如表3.7所示。5.角色關(guān)節(jié)

角色關(guān)節(jié)可以模擬角色的骨骼關(guān)節(jié),主要用于布娃娃效果。此類關(guān)節(jié)是延長的球窩關(guān)節(jié),可在每個(gè)軸上限制該關(guān)節(jié)。角色關(guān)節(jié)提供了很多約束運(yùn)動(dòng)的可能性,就像使用萬向節(jié)一樣。

扭轉(zhuǎn)軸可在很大程度上控制關(guān)節(jié)活動(dòng)的上限和下限,允許按照度數(shù)指定上限和下限。設(shè)置LowTwistLimit→Limit中的值為-30和HighTwistLimit→Limit中的值為60可將圍繞扭轉(zhuǎn)軸的旋轉(zhuǎn)范圍限制在-30~60度之間。Swing1Limit可限制擺動(dòng)軸的旋轉(zhuǎn)范圍,且限制角度是對(duì)稱的。因此該值為30會(huì)將旋轉(zhuǎn)限制在?-30~30度之間。Swing2Limit的軸未顯示在輔助圖標(biāo)上,但該軸垂直于其他兩個(gè)軸,且角度是對(duì)稱的,因此該值為40可將圍繞該軸的旋轉(zhuǎn)范圍限制在?-40~40度之間。角色關(guān)節(jié)屬性如圖3.36、圖3.37所示。角色關(guān)節(jié)的屬性介紹如表3.8所示。6.可配置關(guān)節(jié)

可配置關(guān)節(jié)可以模擬任意關(guān)節(jié)的效果??膳渲藐P(guān)節(jié)組件支持用戶自定義關(guān)節(jié),它開放了Physics引擎中所有與關(guān)節(jié)相關(guān)的屬性,因此可像其他的類型的關(guān)節(jié)那樣來創(chuàng)建各種行為。可配置關(guān)節(jié)有兩類主要的功能,即移動(dòng)/旋轉(zhuǎn)限制和移動(dòng)/旋轉(zhuǎn)加速器。

可配置關(guān)節(jié)屬性如圖3.38、圖3.39所示,屬性詳細(xì)內(nèi)容見表3.9所示。3.3.5物理材質(zhì)

物理材質(zhì)用于調(diào)整碰撞對(duì)象的摩擦力和反彈效果。要?jiǎng)?chuàng)建物理材質(zhì),可從菜單欄中依次選擇Assets→Create→PhysicMaterial后,將物理材質(zhì)從Project視圖拖入到場景中的碰撞體。

當(dāng)碰撞體相互作用時(shí),它們的表面需要模擬所應(yīng)代表的材質(zhì)的屬性,雖然碰撞時(shí)碰撞體的形狀不會(huì)變形,但可以使用物理材質(zhì)配置碰撞體的摩擦力和彈力,要進(jìn)行多次試驗(yàn)和糾錯(cuò)后獲得正確參數(shù),比如冰材質(zhì)將具有零(或非常低的)摩擦力,而橡膠材質(zhì)則具有高摩擦力和近乎完美的彈性。請(qǐng)注意,由于歷史原因,3D資源實(shí)際上稱為PhysicMaterial(物理材質(zhì))(不帶s),而等效的2D資源則稱為PhysicsMaterial2D(2D物理材質(zhì))(帶s)。物理材質(zhì)的屬性如圖3.40所示。3.3.6角色控制器

第一人稱或第三人稱在游戲中的角色通常需要一些基于碰撞的物理效果,這樣角色就不會(huì)跌穿地板或穿過墻壁。但是,通常情況下,角色的加速度和移動(dòng)在物理上并不真實(shí),因此角色可以不受動(dòng)量影響而幾乎瞬間加速、制動(dòng)和改變方向。

在3D物理中,可以使用角色控制器創(chuàng)建此類行為。該組件為角色提供了一個(gè)始終處于直立狀態(tài)的簡單膠囊碰撞體??刂破饔凶约旱奶厥夂瘮?shù)來設(shè)置對(duì)象的速度和方向,但與真正的碰撞體不同,控制器不需要?jiǎng)傮w,動(dòng)量效果也不真實(shí),如圖3.41所示。

角色控制器無法穿過場景中的靜態(tài)碰撞體,因此將緊貼地板并被墻壁阻擋??刂破骺梢栽谝苿?dòng)時(shí)將剛體對(duì)象推到一邊,但不會(huì)被接近的碰撞加速。這意味著可以使用標(biāo)準(zhǔn)3D碰撞體來創(chuàng)建供控制器行走的場景,但不受角色本身的真實(shí)物理行為的限制,角色控制器屬性如圖3.42、圖3.43所示。角色控制器的基本屬性介紹如表3.11所示。3.4UGUI3.4.1畫布1.畫布概述

畫布(Canvas)是容納所有UI元素的區(qū)域,所有UI元素都必須是畫布的子項(xiàng),畫布如圖3.44所示。依次選擇菜單欄中的GameObject→UI→Image創(chuàng)建圖像,此時(shí)如果場景中還沒有畫布,則會(huì)自動(dòng)創(chuàng)建畫布,UI元素為此畫布的子項(xiàng)。畫布區(qū)域在Scene視圖中顯示為矩形,能夠比較容易地定位UI元素,畫布使用EventSystem對(duì)象來協(xié)助消息系統(tǒng)。2.繪制元素的順序

畫布中的UI元素按照它們?cè)贖ierarchy中顯示的順序繪制。首先繪制第一個(gè)子項(xiàng),然后繪制第二個(gè)子項(xiàng),依次類推。如果兩個(gè)UI元素重疊,則后一個(gè)元素將顯示在前一個(gè)元素之上。

要更改元素的顯示順序,只需在Hierarchy中拖動(dòng)元素進(jìn)行重新排序。也可以通過在變換組件上使用SetAsFirstSibling、SetAsLastSibling和SetSiblingIndex方法從腳本中控制順序。3.渲染模式

畫布具有渲染模式(RenderMode)設(shè)置,可用于在屏幕空間或世界空間中進(jìn)行渲染。3.4.2基本布局

本部分將介紹如何相對(duì)于畫布以及彼此來定位UI元素??梢来芜x擇菜單欄中的GameObject→UI→Image創(chuàng)建一個(gè)圖像。1.矩形工具

為了便于布局,每個(gè)UI元素都表示為矩形??墒褂霉ぞ邫谥械木匦喂ぞ?RectTool)在Scene視圖中操縱此矩形。矩形工具既可用于Unity的2D功能,也可用于UI,甚至還可用于3D對(duì)象,如圖3.45所示。

使用矩形工具可對(duì)UI元素進(jìn)行移動(dòng)、大小調(diào)整和旋轉(zhuǎn)。選擇UI元素后,可通過單擊矩形內(nèi)的任意位置并拖動(dòng)來對(duì)元素進(jìn)行移動(dòng)。通過單擊邊或角并拖動(dòng),可調(diào)整元素大小。若要旋轉(zhuǎn)元素,則可在稍微遠(yuǎn)離角點(diǎn)的位置懸停光標(biāo),直到光標(biāo)看起來像旋轉(zhuǎn)符號(hào),然后單擊并向任一方向拖動(dòng)進(jìn)行旋轉(zhuǎn)。與其他工具一樣,矩形工具使用工具欄中設(shè)置的當(dāng)前軸心模式和空間。使用UI時(shí),通常最好將這些設(shè)置保持為Pivot和Local,如圖3.46所示。2.矩形變換

矩形變換是一種用于所有UI元素的新型變換組件,而不是常規(guī)的變換組件。與常規(guī)變換一樣,矩形變換具有位置、旋轉(zhuǎn)和縮放,但還具有寬度和高度,用于指定矩形的尺寸,如圖3.47所示。3.調(diào)整大小與縮放

使用矩形工具可以對(duì)2D系統(tǒng)中的精靈以及3D對(duì)象進(jìn)行大小更改,改變對(duì)象的局部縮放。但是,在帶有矩形變換的對(duì)象上使用時(shí),該工具改變的是寬度和高度,局部縮放將保持不變。該調(diào)整不會(huì)影響字體大小、切片圖像上的邊框等。4.軸心

旋轉(zhuǎn)、大小調(diào)整和縮放都是圍繞軸心進(jìn)行的,因此軸心的位置會(huì)影響旋轉(zhuǎn)、大小調(diào)整或縮放的結(jié)果。工具欄中的Pivot按鈕設(shè)置為軸心模式時(shí),可在Scene視圖中移動(dòng)矩形變換的軸心。5.錨點(diǎn)

矩形變換包含一種稱為錨點(diǎn)的布局概念,錨點(diǎn)在Scene視圖中顯示為4個(gè)小三角形控制柄,如圖3.48所示,錨點(diǎn)信息也顯示在Inspector中,4個(gè)錨點(diǎn)相當(dāng)于四根釘子,釘在Image的父級(jí)元素上,4個(gè)實(shí)心藍(lán)點(diǎn)相當(dāng)于4個(gè)紐扣,縫在Image的4個(gè)邊上。6.錨點(diǎn)預(yù)設(shè)

在Inspector中,可在矩形變換組件的左上角找到AnchorPreset按鈕。單擊該按鈕將顯示AnchorPresets下拉選單,從此選單中可以快速選擇一些最常用的錨定選項(xiàng),如圖3.49所示??蓪I元素錨定到父項(xiàng)的邊或中間,或者與父項(xiàng)大小一起拉伸。水平錨定和垂直錨定是獨(dú)立的。AnchorPresets按鈕將顯示當(dāng)前所選的預(yù)設(shè)選項(xiàng)(如果有)。如果水平軸或垂直軸上的錨點(diǎn)設(shè)置為與任何預(yù)設(shè)不同的位置,則會(huì)顯示自定義選項(xiàng)。

通過單擊Anchors擴(kuò)展箭頭可顯示錨點(diǎn)數(shù)值字段(如果這些字段尚不可見),AnchorMin對(duì)應(yīng)于Scene視圖中的左下角錨點(diǎn)控制柄,而

AnchorMax對(duì)應(yīng)于右上角控制柄。

根據(jù)錨點(diǎn)是在一起(產(chǎn)生固定的寬度和高度)還是分開(使得矩形與父矩形一起拉伸),矩形的位置字段顯示不同。當(dāng)所有錨點(diǎn)控制柄在一起時(shí),顯示的字段為PosX、PosY、Width和Height。PosX和PosY值表示軸心相對(duì)于錨點(diǎn)的位置,如圖3.50所示。

當(dāng)錨點(diǎn)分開時(shí),字段可能部分或完全變?yōu)長eft、Right、Top和Bottom,這些字段定義了由錨點(diǎn)定義的矩形內(nèi)的填充。如果錨點(diǎn)在水平方向分開,則使用Left和Right字段,如果在垂直方向分開,則使用Top和Bottom字段。

注意,更改錨點(diǎn)或軸心字段中的值通常會(huì)反向調(diào)整定位值,以使矩形保持原位。如果不需要此行為,則可通過單擊Inspector中的

R

按鈕啟用

Raweditmode。這樣在更改錨點(diǎn)和軸心值時(shí)可以不改變?nèi)魏纹渌?,因此可能?huì)導(dǎo)致矩形在視覺上出現(xiàn)移動(dòng)或大小調(diào)整,因?yàn)榫匦蔚奈恢煤痛笮∪Q于錨點(diǎn)和軸心值。3.4.3可視組件

隨著UI系統(tǒng)的引入,Unity添加了各種新組件來幫助開發(fā)者創(chuàng)建GUI特定功能。本部分將介紹可創(chuàng)建的新組件的基本信息。1.文本(Text)Text組件可以設(shè)置字體、字體樣式、字體大小以及文本是否支持富文本功能,如圖3.51、圖3.52所示。有一些選項(xiàng)可以設(shè)置文本的對(duì)齊方式、水平和垂直溢出的設(shè)置(控制文本大于矩形的寬度或高度時(shí)會(huì)發(fā)生什么情況)以及一個(gè)使文本調(diào)整大小來適應(yīng)可用空間的BestFit選項(xiàng)。2.圖像(Image)

圖像屬性如圖3.53、圖3.54所示,圖像具有矩形變換組件和圖像組件,可在TargetGraphic字段下將精靈應(yīng)用于圖像組件,并可在Color字段中設(shè)置其顏色,還可將材質(zhì)應(yīng)用于圖像組件。ImageType字段可定義應(yīng)用的精靈顯示方式,提供的選項(xiàng)包括:(1)Simple:均勻縮放整個(gè)精靈。(2)Sliced:使用3?×?3精靈分區(qū),確保大小調(diào)整不會(huì)扭曲角點(diǎn),僅是拉伸中心部分。(3)Tiled:類似于Sliced,但僅是平鋪(重復(fù))中心部分而不是對(duì)其進(jìn)行拉伸。對(duì)于完全沒有邊框的精靈,整個(gè)精靈都是平鋪的。(4)Filled:按照與Simple相同的方式顯示精靈,不同之處是使用定義的方向、方法和數(shù)量從原點(diǎn)開始填充精靈。

選擇Simple或Filled時(shí)顯示的SetNativeSize選項(xiàng)會(huì)將圖像重置為原始精靈大小。

通過從TextureType設(shè)置中選擇Sprite(2D/UI),可以將圖像導(dǎo)入為UI精靈。與舊的GUI精靈相比,現(xiàn)在的精靈有額外的導(dǎo)入設(shè)置,最大的區(qū)別是增加了SpriteEditor(精靈編輯器)。SpriteEditor提供圖像9切片選項(xiàng),此選項(xiàng)將圖像分成9個(gè)區(qū)域,如此一來,當(dāng)精靈調(diào)整大小時(shí),角點(diǎn)就不會(huì)被拉伸或扭曲。3.原始圖像(RawImage)

圖像組件采用精靈,但原始圖像采用紋理(無邊框等)。只有在必要時(shí)才使用原始圖像,否則大多數(shù)情況都使用圖像。4.遮罩(Mask)

遮罩不是可見的UI控件,而是一種修改控件子元素外觀的方法。遮罩將子元素限制(即掩蓋)為父元素的形狀。因此,如果子項(xiàng)比父項(xiàng)大,則子項(xiàng)僅包含在父項(xiàng)以內(nèi)的部分才可見。5.效果

可視組件也可應(yīng)用各種簡單效果,例如簡單的投射陰影或輪廓。3.4.4交互組件

本部分將介紹UI系統(tǒng)中的交互組件,這些組件可用于處理交互,例如鼠標(biāo)或觸摸事件以及使用鍵盤或控制器進(jìn)行的交互。交互組件本身不可見,必須與一個(gè)或多個(gè)可視元素組合才能正常工作。大多數(shù)交互組件都有一些共同點(diǎn)。這些組件是可選擇的組件,這意味著它們具有共享的內(nèi)置功能,可用于對(duì)狀態(tài)(正常、突出顯示、按下、禁用)之間的過渡進(jìn)行可視化,也可用于通過鍵盤或控制器導(dǎo)航到其他可選擇的組件。

交互組件至少有一個(gè)UnityEvent,當(dāng)用戶以特定方式與組件交互時(shí)將調(diào)用該UnityEvent。UI系統(tǒng)會(huì)捕獲并記錄從附加到UnityEvent的代碼傳出的任何異常。1.按鈕(Button)

按鈕有一個(gè)OnClickUnityEvent用于定義單擊按鈕時(shí)將執(zhí)行的操作,Button組件如圖3.55所示。2.開關(guān)(Toggle)

開關(guān)有一個(gè)IsOn復(fù)選框用于確定開關(guān)當(dāng)前是打開還是關(guān)閉狀態(tài)。當(dāng)用戶單擊開關(guān)時(shí),此值將反轉(zhuǎn),并可相應(yīng)打開或關(guān)閉可視復(fù)選標(biāo)記。按鈕還有一個(gè)OnValueChangedUnityEvent用于定義更改該值時(shí)將執(zhí)行的操作,Toggle組件如圖3.56所示。3.滑動(dòng)條(Slider)

滑動(dòng)條具有十進(jìn)制數(shù)值,用戶可以在最小值和最大值之間拖動(dòng)?;瑒?dòng)條可以是水平或垂直的?;瑒?dòng)條也有一個(gè)OnValueChangedUnityEvent用于定義更改該值時(shí)將執(zhí)行的操作,Slider組件如圖3.57所示。4.滾動(dòng)條(Scrollbar)

滾動(dòng)條具有一個(gè)介于0~1之間的十進(jìn)制數(shù)值。當(dāng)用戶拖動(dòng)滾動(dòng)條時(shí),該值將相應(yīng)變化。滾動(dòng)條通常與滾動(dòng)矩形(ScrollRect)和遮罩(Mask)一起用于創(chuàng)建滾動(dòng)視圖。滾動(dòng)條具有一個(gè)介于0~1之間的Size值,該值用于確定控制柄的大小(占整個(gè)滾動(dòng)條長度的一個(gè)比例)。滾動(dòng)條通常由另一個(gè)組件控制,旨在指示滾動(dòng)視圖中可見的內(nèi)容比例。滾動(dòng)矩形組件可自動(dòng)執(zhí)行此過程。滾動(dòng)條可以是水平或垂直的。滑動(dòng)條也有一個(gè)OnValueChangedUnityEvent用于定義更改該值時(shí)將執(zhí)行的操作。5.下拉選單(Dropdown)

下拉選單有一個(gè)可供選擇的選項(xiàng)列表??蔀槊總€(gè)選項(xiàng)指定文本字符串和可選的圖像,可在Inspector中進(jìn)行此設(shè)置,也可從代碼中進(jìn)行動(dòng)態(tài)設(shè)置。下拉選單有一個(gè)OnValueChangedUnityEvent用于定義當(dāng)更改當(dāng)前選擇的選項(xiàng)時(shí)將執(zhí)行的操作,Dropdown屬性如圖3.58所示。6.輸入字段(InputField)

輸入字段用于使文本元素的文本可由用戶編輯。輸入字段有一個(gè)UnityEvent用于定義當(dāng)更改文本內(nèi)容時(shí)將執(zhí)行的操作,另一個(gè)用于定義用戶完成編輯后將執(zhí)行的操作,InputField組件如圖3.59所示。7.滾動(dòng)矩形/滾動(dòng)視圖(ScrollRect/ScrollView)

當(dāng)占用大量空間的內(nèi)容需要在小區(qū)域中顯示時(shí),可使用滾動(dòng)矩形。滾動(dòng)矩形提供了滾動(dòng)此內(nèi)容的功能。通常情況下,滾動(dòng)矩形與遮罩(Mask)相結(jié)合來創(chuàng)建滾動(dòng)視圖,在產(chǎn)生的視圖中只有滾動(dòng)矩形內(nèi)的可滾動(dòng)內(nèi)容為可見狀態(tài)。此外,滾動(dòng)矩形還可與一個(gè)或兩個(gè)可拖動(dòng)以便水平或垂直滾動(dòng)的滾動(dòng)條(Scrollbar)組合使用,ScrollRect/ScrollView組件如圖3.60所示。3.5EVENT事件

使用事件系統(tǒng)可以根據(jù)輸入(即鍵盤、鼠標(biāo)、觸摸或自定義輸入)將事件發(fā)送到應(yīng)用程序中的對(duì)象,事件系統(tǒng)包含一些共同協(xié)作以發(fā)送事件的組件。

將事件系統(tǒng)組件添加到游戲?qū)ο髸r(shí),應(yīng)該會(huì)注意到該組件未公開太多功能,這是因?yàn)槭录到y(tǒng)本身設(shè)計(jì)為事件系統(tǒng)模塊之間通信的管理器和協(xié)調(diào)器。

事件系統(tǒng)的主要作用如下:(1)管理視為選中狀態(tài)的游戲?qū)ο蟆?2)管理正在使用的輸入模塊。(3)管理射線投射(如果需要)。(4)根據(jù)需要更新所有輸入模塊。

輸入模塊包含定義事件系統(tǒng)行為方式的主要邏輯,可用于:(1)處理輸入。(2)管理事件狀態(tài)。(3)將事件發(fā)送到場景對(duì)象。

事件系統(tǒng)中一次只能有一個(gè)輸入模塊處于激活狀態(tài),這些輸入模塊必須是與事件系統(tǒng)組件位于同一游戲?qū)ο笊系慕M件。如果希望編寫自定義輸入模塊,建議發(fā)送Unity中現(xiàn)有UI組件支持的事件,也可以擴(kuò)展事件和編寫自定義的事件。3.5.1射線投射器和消息系統(tǒng)1.射線投射器

射線投射器用于確定指針在哪個(gè)對(duì)象上方,輸入模塊通常使用場景中配置的射線投射器來計(jì)算指針設(shè)備位于哪個(gè)對(duì)象上方,默認(rèn)情況下提供了以下3種射線投射器:(1)圖形射線投射器(GraphicRaycaster):用于UI元素。(2)2D物理射線投射器(Physics2DRaycaster):用于2D物理元素。(3)物理射線投射器(PhysicsRaycaster):用于3D物理元素。

如果在場景中配置了2D/3D射線投射器,很容易讓非UI元素接收來自輸入模塊的消息,只需附加一個(gè)腳本來實(shí)現(xiàn)其中一個(gè)事件接口即可。2.消息系統(tǒng)

新的UI系統(tǒng)使用一種消息系統(tǒng)來取代SendMessage,該系統(tǒng)是純C#系統(tǒng),旨在解決SendMessage存在的一些問題。該系統(tǒng)使用可在MonoBehaviour上實(shí)現(xiàn)的自定義接口來指示組件能夠從消息系統(tǒng)接收回調(diào)。調(diào)用時(shí)會(huì)指定目標(biāo)游戲?qū)ο螅撜{(diào)用將在游戲?qū)ο蟮乃?實(shí)現(xiàn)了指定接口以據(jù)此發(fā)出該調(diào)用的)組件上發(fā)出。借助消息系統(tǒng)可傳遞自定義用戶數(shù)據(jù),并可指定事件應(yīng)在游戲?qū)ο髮蛹?jí)視圖中傳播的距離:應(yīng)該僅為指定的游戲?qū)ο髨?zhí)行,還是應(yīng)該在子對(duì)象和父對(duì)象上也執(zhí)行。除此之外,消息框架還提供helper函數(shù)來搜索和查找實(shí)現(xiàn)了給定消息接口的游戲?qū)ο?。消息系統(tǒng)是通用型系統(tǒng),不僅可用于UI系統(tǒng),還可用于一般游戲代碼。添加自定義消息事件相對(duì)簡單,借助UI系統(tǒng)用于所有事件處理的相同框架即可實(shí)現(xiàn)。

如果希望定義自定義消息,此過程相對(duì)簡單。在UnityEngine.EventSystems命名空間中,有一個(gè)名為IEventSystemHandler的基本接口,從此接口擴(kuò)展的任何內(nèi)容都可以視為通過消息系統(tǒng)接收事件的目標(biāo)。示例代碼如下:

一旦定義了此接口,即可由MonoBehaviour實(shí)現(xiàn)。此接口實(shí)現(xiàn)后,定義了在針對(duì)此MonoBehaviour游戲?qū)ο蟀l(fā)出指定消息時(shí)將會(huì)執(zhí)行的函數(shù)。示例代碼如下:

現(xiàn)在有了可接收消息的腳本之后,需要發(fā)出消息。通常,此消息用于響應(yīng)發(fā)生的某個(gè)松散耦合事件。例如,在UI系統(tǒng)中,為PointerEnter和PointerExit等事件發(fā)出事件,以及為了響應(yīng)用戶在應(yīng)用程序中的輸入而發(fā)生的各種其他事件。要發(fā)送消息,可使用一個(gè)靜態(tài)helper類來執(zhí)行此操作。在參數(shù)方面,需要消息的目標(biāo)對(duì)象、一些特定于用戶的數(shù)據(jù)以及一個(gè)映射到所需目標(biāo)消息接口中特定函數(shù)的仿函數(shù)(functor)。示例代碼如下:

此代碼將在游戲?qū)ο竽繕?biāo)上實(shí)現(xiàn)了ICustomMessageTarget接口的所有組件上執(zhí)行Message1函數(shù)。ExecuteEvents類的腳本文檔中介紹了執(zhí)行函數(shù)的其他形式,例如在子對(duì)象或父對(duì)象中執(zhí)行。3.5.2輸入模塊和支持的事件1.輸入模塊

輸入模塊可用于配置和自定義事件系統(tǒng)的主要邏輯。系統(tǒng)提供了兩個(gè)開箱即用的輸入模塊,一個(gè)用于獨(dú)立平臺(tái),另一個(gè)用于觸控輸入。每個(gè)模塊都會(huì)在給定配置上預(yù)期接收和分發(fā)事件。

輸入模塊是執(zhí)行事件系統(tǒng)“業(yè)務(wù)邏輯”的位置。啟用事件系統(tǒng)后,它會(huì)查看所連接的輸入模塊,并將更新處理傳遞給具體模塊。

輸入模塊可根據(jù)希望支持的輸入系統(tǒng)進(jìn)行擴(kuò)展或修改。輸入系統(tǒng)的目的是將特定于硬件的輸入映射到通過消息系統(tǒng)發(fā)送的事件。

內(nèi)置的輸入模塊可支持常見的游戲配置,如觸控輸入、控制器輸入、鍵盤輸入和鼠標(biāo)輸入。如果在MonoBehaviour上實(shí)現(xiàn)特定接口,這些輸入模塊則會(huì)向應(yīng)用程序中的控件發(fā)送各種事件,所有UI組件都實(shí)現(xiàn)了對(duì)具體組件有意義的接口。2.支持的事件

事件系統(tǒng)支持許多事件,并可在用戶編寫的自定義輸入模塊中進(jìn)一步自定義它們。獨(dú)立輸入模塊和觸摸輸入模塊支持的事件由接口提供,通過實(shí)現(xiàn)該接口即可在MonoBehaviour上實(shí)現(xiàn)這些事件。如果配置了有效的

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論