版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第五章虛擬現(xiàn)實(shí)1開發(fā)工具
UnityHub是Unity新推出的用于簡(jiǎn)化工作流程的桌面應(yīng)用程序,主要的作用是下載和使用多個(gè)版本的Unity軟件、試用UnityBeta甚至Alpha編輯器、管理當(dāng)前機(jī)器上的Unity項(xiàng)目、學(xué)習(xí)界面和資源界面,方便查找教程和資源。5.1UnityHubUnity的主要分五個(gè)窗口,場(chǎng)景窗口(SceneView)、游戲窗口(GameView)、層級(jí)窗口(Hierarchy)、項(xiàng)目視圖(Project)、屬性窗口(Inspector)。5.2Unity的界面布局5.2.1場(chǎng)景窗口(SceneView)
場(chǎng)景視圖,是用于設(shè)置場(chǎng)景以及放置游戲?qū)ο螅菢?gòu)造游戲場(chǎng)景的地方。5.2.2游戲窗口(GameView)游戲場(chǎng)景,是由場(chǎng)景中相機(jī)所渲染的游戲畫面,是游戲發(fā)布后玩家所能看到畫面。5.2.3層級(jí)窗口(Hierarchy)層級(jí)窗口,用于顯示當(dāng)前場(chǎng)景中所有游戲?qū)ο蟮膶蛹?jí)關(guān)系。5.2.4項(xiàng)目視圖(Project)項(xiàng)目視圖:整個(gè)工程中所有可用的資源,例如模型、類等。5.2.5屬性窗口(Inspector)
屬性窗口:用來(lái)顯示當(dāng)前所選擇的游戲?qū)ο蟮南嚓P(guān)屬性與信息。5.2.6Console(控制臺(tái))
打印出來(lái)的提示語(yǔ)句都出現(xiàn)在Console視圖中,用白色字顯示。上面我們提到了紅色字和白色字,在Console視圖中還有一個(gè)種黃色字,黃色代表的是警告,表示代碼存在不合理的地方,但不是語(yǔ)法錯(cuò)誤,也不影響程序的運(yùn)行。變換工具,主要用于Scene窗口,實(shí)現(xiàn)所選擇的游戲?qū)ο蟮奈灰?、旋轉(zhuǎn)以及縮放等操作控制。手型工具,鼠標(biāo)單擊選中手型工具,可在Scene視圖中按住鼠標(biāo)左鍵來(lái)平移整個(gè)場(chǎng)景,選中手型工具后,在Scene視圖中先按住【Alt】鍵,按住鼠標(biāo)左鍵,平移鼠標(biāo)可以旋轉(zhuǎn)場(chǎng)景視角,選中手型工具后,在Scene視圖中先按住【Alt】鍵,按住鼠標(biāo)右擊,平移鼠標(biāo)可以縮放場(chǎng)景視角,此外使用鼠標(biāo)滾輪也能縮放場(chǎng)景視角。5.2.7變換工具
移動(dòng)工具,鼠標(biāo)單擊移動(dòng)工具后,選中一個(gè)物體,在該物體上出現(xiàn)3個(gè)方向的箭頭,代表是物體自身坐標(biāo)系的三個(gè)坐標(biāo)軸,通過(guò)在箭頭所指的方向上拖動(dòng)物體從而改變物體某一軸向上位置。旋轉(zhuǎn)工具,鼠標(biāo)單擊旋轉(zhuǎn)工具后,選中一個(gè)物體,在物體上出現(xiàn)了三種顏色的三個(gè)線圈,在線圈上安裝鼠標(biāo)左鍵平移,則可以沿著對(duì)應(yīng)的軸向旋轉(zhuǎn)物體??s放工具,鼠標(biāo)單擊縮放工具后,選中一個(gè)物體,在該物體上出現(xiàn)3個(gè)方向的線段,通過(guò)在縮放所指的方向上拖動(dòng)物體從而改變物體某一軸向上縮放。矩形工具,允許用戶查看和編輯2D或3D游戲?qū)ο蟮木匦问直?。?duì)于2D游戲?qū)ο螅梢园惭b【Shift】鍵進(jìn)行等比例縮放。5.2.7變換工具
層級(jí)列表,用來(lái)控制游戲?qū)ο笤赟cene視圖中的顯示,在下拉列表中顯示狀態(tài)為的物體將被顯示在Scene視圖中。切換視圖的布局,用戶可以存儲(chǔ)自定義的界面布局5.2.8層級(jí)列表和下拉列表File菜單(文件),Edit菜單(編輯),Asset菜單(資源),GameObject菜單(游戲物體),Component菜單(組件),Windows菜單(窗口),Help菜單(幫助)5.2.9菜單欄謝謝第五章虛擬現(xiàn)實(shí)開發(fā)工具
在介紹Unity的組件之前,我們先介紹一下Unity的特有方法,也稱系統(tǒng)方法,是Unity語(yǔ)言類中獨(dú)有的方法,有以下特點(diǎn):(1)特有方法不需要調(diào)用,滿足一定條件后會(huì)自動(dòng)觸發(fā)。(2)特有方法會(huì)自動(dòng)繼承,如果父類中有特有方法,子類沒(méi)有,那么子類自動(dòng)繼承父類的特有方法,如果子類中有,則相當(dāng)于重寫了該特有方法。5.3Unity的特有方法(1)Start(),開始方法。方法解析:特有方法,在類文件啟動(dòng)的時(shí)候就執(zhí)行。(2)Awake(),覺醒方法。方法解析:特有方法,在類文件在場(chǎng)景實(shí)例的時(shí)候就執(zhí)行。Start和Awake在執(zhí)行效果上都是運(yùn)行的瞬間就執(zhí)行,但是這二者從執(zhí)行順序上有區(qū)別,Awake在Start之前執(zhí)行,而且如果類的Enable屬性被關(guān)閉,也就是類非激活狀態(tài)下,Start方法是不執(zhí)行的,Awake方法依舊會(huì)執(zhí)行。(3)Update(),刷新方法方法解析:特有方法,每幀調(diào)用一次,用于更新游戲場(chǎng)景和狀態(tài)5.3.1類執(zhí)行相關(guān)特有方法(4)FixedUpdate(),物理刷新方法方法解析:特有方法,每個(gè)固定物理幀調(diào)用一次,用于物理狀態(tài)的更新(5)LateUpdate(),后刷新方法方法解析:特有方法,每幀調(diào)用一次,一般與相機(jī)相關(guān)的放到這里。(3)(4)(5)都是刷新方法,但在使用上略有不同,通常需要每幀更新的內(nèi)容都放在Update中,F(xiàn)ixedUpdate中一般放和物理更新相關(guān)的內(nèi)容,LateUpdate一般放相機(jī)相關(guān)的內(nèi)容,從執(zhí)行屬性上來(lái)說(shuō),F(xiàn)ixedUpdate先于Update,LateUpdate最后。
以上五個(gè)方法,執(zhí)行順序由先到后,分別是Awake、Start、FixedUpdate、Update、LateUpdate。5.3.1類執(zhí)行相關(guān)特有方法(6)OnEnable(),激活時(shí)執(zhí)行方法解析:特有方法,類所在物體由非激活變成激活狀態(tài)下執(zhí)行,如果物體是被新創(chuàng)建出來(lái)的可以執(zhí)行。(7)OnDisable(),非激活時(shí)執(zhí)行方法解析:特有方法,類所在物體由激活變成非激活狀態(tài)下執(zhí)行,如果物體是被銷毀的也可以執(zhí)行。(8)OnDestroy(),銷毀時(shí)執(zhí)行方法解析:特有方法,類所在物體被銷毀時(shí)執(zhí)行。5.3.1類執(zhí)行相關(guān)特有方法(9)OnApplicationQuit(),退出時(shí)執(zhí)行方法解析:特有方法,類所在進(jìn)行退出程序的時(shí)候執(zhí)行。(10)OnBecameVisible(),顯示時(shí)執(zhí)行方法解析:特有方法,在物體顯示的時(shí)候執(zhí)行,這里的顯示指的是出現(xiàn)在攝像機(jī)顯示視角范圍內(nèi),可以在屏幕中顯示出來(lái),能被看到。(11)OnBecameInvisible()不顯示時(shí)運(yùn)行方法解析:特有方法,同理,此方法是在物體不顯示的時(shí)候執(zhí)行。5.3.1類執(zhí)行相關(guān)特有方法
鼠標(biāo)相關(guān)的特有方法除了擁有特有方法的特點(diǎn)以外,還有一個(gè)特點(diǎn)就是只對(duì)當(dāng)前方法所在類所掛載的物體起作用。(1)OnMouseEnter(),鼠標(biāo)進(jìn)入方法方法解析:當(dāng)鼠標(biāo)進(jìn)入方法所在類所掛載的物體范圍內(nèi)是執(zhí)行。(2)OnMouseDown(),鼠標(biāo)按下方法方法解析:當(dāng)鼠標(biāo)在物體上面并按下鼠標(biāo)按鍵的時(shí)候執(zhí)行。(3)OnMouseUp(),鼠標(biāo)抬起方法方法解析:當(dāng)鼠標(biāo)在物體上面并抬起鼠標(biāo)按鍵的時(shí)候執(zhí)行。5.3.2鼠標(biāo)相關(guān)特有方法(4)OnMouseOver(),鼠標(biāo)懸停方法方法解析:當(dāng)鼠標(biāo)懸停在物體上面并按下鼠標(biāo)的時(shí)候執(zhí)行,并一直執(zhí)行。(5)OnMouseExit(),鼠標(biāo)離開方法方法解析:當(dāng)鼠標(biāo)離開在物體上面時(shí)執(zhí)行。(6)OnMouseDrag(),鼠標(biāo)拖拽方法方法解析:當(dāng)鼠標(biāo)在物體上面,按住鼠標(biāo),并移動(dòng)鼠標(biāo)時(shí)執(zhí)行。以上方法中,OnMouseEnter方法和OnMouseOver方法執(zhí)行效果都是鼠標(biāo)進(jìn)入物體范圍就執(zhí)行,但Enter只在進(jìn)入的瞬間執(zhí)行一次,而Over會(huì)反復(fù)執(zhí)行。5.3.2鼠標(biāo)相關(guān)特有方法
碰撞相關(guān)特有方法分兩大類別(還有其他的暫時(shí)不討論),分別是碰撞檢測(cè)和觸發(fā)檢測(cè),碰撞和觸發(fā)的區(qū)別會(huì)在講物理組件的時(shí)候詳細(xì)講解。(1)OnTriggerEnter(),觸發(fā)進(jìn)入檢測(cè)語(yǔ)法結(jié)構(gòu):privatevoidOnTriggerEnter(Colliderother)方法解析:當(dāng)發(fā)成觸發(fā)的瞬間執(zhí)行,執(zhí)行一次。Other為碰到的碰撞體。(2)OnTriggerStay(),觸發(fā)持續(xù)檢測(cè)語(yǔ)法結(jié)構(gòu):privatevoidOnTriggerStay(Colliderother)方法解析:當(dāng)進(jìn)入觸發(fā)時(shí)執(zhí)行,持續(xù)執(zhí)行。Other為碰到的碰撞體。5.3.3碰撞相關(guān)特有方法(3)OnTriggerExit(),觸發(fā)離開檢測(cè)語(yǔ)法結(jié)構(gòu):privatevoidOnTriggerExit(Colliderother)方法解析:當(dāng)觸發(fā)結(jié)束瞬間執(zhí)行,執(zhí)行一次。Other為碰到的碰撞體。(4)OnCollisionEnter(),碰撞發(fā)生檢測(cè)語(yǔ)法結(jié)構(gòu):privatevoidOnCollisionEnter(Collidsioncollision)方法解析:當(dāng)發(fā)生碰撞瞬間執(zhí)行,執(zhí)行一次。collision為碰撞事件。5.3.3碰撞相關(guān)特有方法(5)OnCollisionStay(),碰撞持續(xù)方法語(yǔ)法結(jié)構(gòu):privatevoidOnCollisionStay(Collidsioncollision)方法解析:當(dāng)發(fā)生碰撞,且處于接觸狀態(tài)時(shí)執(zhí)行,反復(fù)執(zhí)行。collision為碰撞事件。(6)OnCollisionExit(),碰撞離開方法語(yǔ)法結(jié)構(gòu):privatevoidOnCollisionExit(Collidsioncollision)方法解析:當(dāng)結(jié)束碰撞時(shí)執(zhí)行,執(zhí)行一次。collision為碰撞事件。5.3.3碰撞相關(guān)特有方法
Unity的組件就是Unity官方封裝好的代碼文件,用來(lái)方便我們開發(fā)內(nèi)容的工具,也是一個(gè)代碼和我們自己寫的代碼從使用的方法上來(lái)說(shuō)沒(méi)有任何區(qū)別,對(duì)于一些初學(xué)者要記住的一句話就是“組件就是代碼”,怎么從我們自己的代碼文件中獲得變量和方法,同樣就方法可以應(yīng)用到組件上,同理組件掛載到物體上,在屬性面板中顯示的內(nèi)容,也就都可以獲取和更改(也有特殊情況,暫不考慮)。5.4Unity組件
在unity環(huán)境中,我們可以利用系統(tǒng)自帶的地形系統(tǒng),制作符合我們需要的地形。在Herarchy窗口內(nèi)鼠標(biāo)單擊Create下拉菜單,在3DObject選項(xiàng)卡中選擇Terrain,也可以在Herarchy窗口下鼠標(biāo)右擊,在彈出的窗口的3DObject選項(xiàng)卡中選擇Terrain,選擇Terrain后在Inspector(屬性)面板中查看對(duì)應(yīng)的屬性。5.4.1地形插件
在彈出的窗口中有五個(gè)子按鈕,鼠標(biāo)單擊按鈕,彈出新的面板,在面板中可以設(shè)置地形的寬度、地形的長(zhǎng)度和高度。地形高度這個(gè)值的設(shè)置決定整個(gè)地形最大高度,也可以在編輯完地形之后再調(diào)整,調(diào)整之后會(huì)根據(jù)山脈的高度按比例縮放。5.4.1地形插件2.編輯地形(1)RaiseorLowerTerrian(上升下降地形);(2)PointTexture(添加紋理);(3)SetHeight(設(shè)置高度);(4)SmoothHeight(光滑山體);(5)StampTerrian。上升地形(地形圖章工具);5.4.1地形插件2.植樹BrushSize(筆刷尺寸),調(diào)整批量種植的面積;
TreeDensity(樹的密度)可以調(diào)整種植面積內(nèi)的樹的數(shù)量;
TreeHeight(樹的高度)調(diào)整樹的高度;
LockWidth(鎖定樹的寬高比);
TreeWidth(樹的寬度);5.4.1地形插件
設(shè)置樹的預(yù)制體,通過(guò)鼠標(biāo)單擊,在下拉菜單中選中AddTree,會(huì)彈出一個(gè)窗口,為TreePrefab選擇一個(gè)樹的模型,通過(guò)鼠標(biāo)單擊或者鼠標(biāo)涂抹將選中的樹按照之前的設(shè)置批量種植到所編輯地形中。5.4.1地形插件
4.種草
種草的原理和種樹的原理基本相同,但是用的樹和草的物體是不一樣的,樹是用模型預(yù)制體,但草用的是圖片。草如果用的比較多,比較消耗系統(tǒng)資源。在這個(gè)窗口可以設(shè)置,草的最小寬度、最大寬度、小高度、最大高度,隨機(jī)偏差值、健康的草的顏色、枯萎的草的顏色。主要設(shè)置(細(xì)節(jié)紋理),為其選擇草的圖片。按照之前的設(shè)置批量種植到所編輯地形中。5.4.1地形插件
設(shè)置風(fēng)的力度,在場(chǎng)景中可以設(shè)置風(fēng)的力度,讓草隨風(fēng)擺動(dòng),風(fēng)的設(shè)置在地形組件的設(shè)置中,鼠標(biāo)單擊,WindSettingsforGrass(影響草的風(fēng)設(shè)置),通過(guò)這些設(shè)置調(diào)整風(fēng)力的大小5.4.1地形插件5.添加水面效果
在Unity的早期版本中會(huì)附帶一個(gè)資源包,里面包含了一些常用素材,里面包含了自然場(chǎng)景包、效果素材包、粒子效果包、2D素材、角色控制等。在Unity新的版本中資源包整合到Hub的學(xué)習(xí)模塊中的資源里面。我們要用的水面效果就在Environment(環(huán)境資源包)文件夾中,這里面包含了兩種水的效果Water和Water(Basic),前者效果水更清澈透明,后者水的顏色更藍(lán),透明度相對(duì)較低。拖入到場(chǎng)景中即可。5.4.1地形插件6.添加霧效在Unity中還可以為環(huán)境添加霧的效果,添加方法非常簡(jiǎn)單,首先需要打開對(duì)應(yīng)的窗口,在上面菜單欄中選擇Window,再選擇Rendering,選擇LightingSettings,彈出Lighting窗口,找到OtherSetting窗口,勾選Fog。5.4.1地形插件謝謝第五章虛擬現(xiàn)實(shí)開發(fā)工具
Unity的音頻系統(tǒng)所支持的格式有很多有Ogg、AIFF、Wav、Mp3等,最常用格式是Wav、Mp3,Wav格式文件較大,不需要解碼,Mp3文件相對(duì)較小,但是需要解碼器。Unity的音頻系統(tǒng)包含很多小的組件,最常用兩個(gè)組件是AudioListener和AudioSource。5.4.2音頻系統(tǒng)1.AudioListener(音頻偵聽器)從字面上理解就是“聲音傾聽者”,用來(lái)傾聽場(chǎng)景中的聲音,通常場(chǎng)景中只需要一個(gè)AudioListener,在Camera物體上會(huì)自帶一個(gè)AudioListener,當(dāng)場(chǎng)景中多建一個(gè)Camera。此時(shí)應(yīng)刪除一個(gè),使場(chǎng)景中的聲音監(jiān)聽器保持一個(gè)。
什么是組件?組件就是代碼程序,和我們自己寫的代碼沒(méi)有什么不同,組件只不過(guò)被系統(tǒng)進(jìn)行了封裝,對(duì)組件的引用、對(duì)組件的公共變量的調(diào)用和調(diào)用自己寫的代碼中的變量是一樣的。也是就是我們的代碼怎么用,對(duì)組件就怎么用。5.4.2音頻系統(tǒng)2.AudioSource從字面上理解就是“聲音來(lái)源”,用來(lái)發(fā)聲,Unity中的聲音分為兩種,一個(gè)3D聲音,一個(gè)是2D聲音,3D聲音就是完全模擬現(xiàn)實(shí)世界中的聲音,Unity是一款3D游戲引擎,任何游戲最根本都是一個(gè)模擬的過(guò)程,當(dāng)然也要模擬聲音,現(xiàn)實(shí)世界的聲音的特點(diǎn)是隨著距離的增加音量會(huì)衰減。也就是說(shuō)離聲源越遠(yuǎn)聽到的聲音越小。而2D聲音則不會(huì)發(fā)生衰減。5.4.2音頻系統(tǒng)
在AudioSource組件下有很多公共屬性,下面我們依次講解這些屬性的意義。AudioClip是一個(gè)類,表示的意思是聲音片段,可以理解成是一個(gè)聲音文件,拖拽到這個(gè)變量對(duì)應(yīng)的窗口中。但如果在代碼中調(diào)用這個(gè)變量的時(shí)候,要調(diào)用的變量名字是clip,而不是AudioClip。Mute:靜音。PlayOnAwake:?jiǎn)拘褧r(shí)播放。Loop:循環(huán)。Volume:音量。5.4.2音頻系統(tǒng)
3.其他組件Audio組件還有一些組件的多是混音器,用來(lái)調(diào)整聲音輸出效果。AudioReverbZone:音頻混響。AudioLowPassFilter:音頻低通濾波器。AudioHighPassFilter:音頻高通濾波器。AudioEchoFilter:音頻回聲濾波器。AudioDistortionFilter:音頻是真濾波器。AudioReverbFilter:音頻混響濾波器。AudioChorusFilter:音頻合生濾波器。5.4.2音頻系統(tǒng)
4.Audio類常用的代碼方法(1)Play(),播放音頻。語(yǔ)法結(jié)構(gòu):publicvoidPlay()所屬類:AudioSource;方法解析:實(shí)例方法,需要用實(shí)例.的形式調(diào)用該方法。實(shí)現(xiàn)該AudioSource實(shí)例的播放。例子:AudioSourceas=newAudioSource();//創(chuàng)建AudioSource實(shí)例。as.Play();//as實(shí)例開始播放。
以下實(shí)例統(tǒng)一用as表示AudioSource類變量,用來(lái)存放AudioSource實(shí)例,不再單獨(dú)定義。5.4.2音頻系統(tǒng)(2)Stop(),停止音頻。語(yǔ)法結(jié)構(gòu):publicvoidStop();所屬類:AudioSource;方法解析:實(shí)例方法,需要用實(shí)例.的形式調(diào)用該方法。實(shí)現(xiàn)該AudioSource實(shí)例的停止。再次播放是從頭開始播放。例子:as.Stop();//as實(shí)例停止。5.4.2音頻系統(tǒng)(3)Pause(),暫停音頻。語(yǔ)法結(jié)構(gòu):publicvoidPause();所屬類:AudioSource;方法解析:實(shí)例方法,需要用實(shí)例.的形式調(diào)用該方法。實(shí)現(xiàn)該AudioSource實(shí)例的暫停。再次播放是從暫停的地方播放。例子:as.Pause();//as實(shí)例暫停。5.4.2音頻系統(tǒng)(4)PlayOneShot(),播放一次。語(yǔ)法結(jié)構(gòu):publicvoidPlayOneShot(AudioClipclip);所屬類:AudioSource;方法解析:實(shí)例方法,需要用實(shí)例.的形式調(diào)用該方法。實(shí)現(xiàn)AudioSource實(shí)例的一次播放。該方法包含一個(gè)參數(shù),參數(shù)是要 播放的音頻。該方法有一個(gè)重載方法,包含兩個(gè)參數(shù),除了上面說(shuō)的那個(gè)外,還有個(gè)float的參數(shù),目的是控制播放音量,如果不填,默認(rèn)值為1;例子:as.PlayOneShot(聲音變量);as.PlayOneShot(聲音變量,1);5.4.2音頻系統(tǒng)(5)PlayClipAtPoint(),在場(chǎng)景中的某點(diǎn)坐標(biāo)播放聲音。語(yǔ)法結(jié)構(gòu):publicstaticvoidPlayClipAtPoint(AudioClipclip,Vector3position);所屬類:AudioSource;方法解析:靜態(tài)方法,需要用類名.的形式調(diào)用該方法。調(diào)用時(shí)不需要AudioSource實(shí)例的一次播放。該方法包含兩個(gè)參數(shù),第一個(gè)參數(shù)是要播放的聲音,第二個(gè)參數(shù)是聲源坐標(biāo)。例子:AudioSource.PlayClipAtPoint(聲音變量名,newVector3(1,1,1));//在坐標(biāo)1.1.1的點(diǎn)播放聲音。5.4.2音頻系統(tǒng)謝謝第五章虛擬現(xiàn)實(shí)開發(fā)工具4
Unity的軟件是一款非常優(yōu)秀的游戲引擎,其中一個(gè)原因就是Unity為開發(fā)游戲提供了很大的便利,其中物理系統(tǒng)就是一個(gè)非常方便的工具,可以想象制作任何一款游戲,都離不開物體之間的物理響應(yīng),從而使游戲?qū)ο蟊憩F(xiàn)出與現(xiàn)實(shí)相似的各種物理行為。Unity中內(nèi)置了兩種獨(dú)立的物理引擎,分別是3D物理引擎和2D物理引擎。這兩種物理引擎使用方法非常相似,只是使用的組件不一樣,Rigidbody和Rigidbody2D。5.4.3物理系統(tǒng)1.RigidBody(剛體)組件物體系統(tǒng)中的RigidBody組件為物體提供是物理屬性,組件Collider提供的物理輪廓,通常這兩個(gè)組件Collider組合使用,才能達(dá)到現(xiàn)實(shí)中物體的物理效果。Mass:質(zhì)量。Drag:阻力。AngularDrag:角阻力。UseGravity:使用重力。5.4.3物理系統(tǒng)IsKinemaic:是否開啟動(dòng)力學(xué)。Interpolate:插值,用于控制剛體運(yùn)動(dòng)的抖動(dòng)情況,包含三個(gè)子項(xiàng)分別是None(沒(méi)有插值)、Interpolate(內(nèi)插值,基于前一幀的值來(lái)平滑)、Extrapolate(外插值,基于后一幀的值來(lái)平滑)。5.4.3物理系統(tǒng)CollisionDetection:碰撞檢測(cè)。包括四個(gè)子項(xiàng)Discrete(離線碰撞檢測(cè),用兩個(gè)速度較慢的對(duì)象的碰撞檢測(cè),消耗資源最低)Continuous(連續(xù)碰撞檢測(cè),適用于一個(gè)快速對(duì)象和較慢的對(duì)象的檢測(cè),消耗資源較低)ContinuousDynamic(連續(xù)動(dòng)態(tài)碰撞檢測(cè),適用于兩個(gè)快速的物體間的檢測(cè),消耗資源較高)Continuousspeculative(連續(xù)預(yù)判性檢測(cè))5.4.3物理系統(tǒng)Constraints:約束,用來(lái)控制物體對(duì)碰撞所產(chǎn)生的運(yùn)動(dòng)約束。FreezePosition:凍結(jié)位置,能禁止物體沿世界坐標(biāo)系的三個(gè)方向的位移。FreezeRotation:凍結(jié)旋轉(zhuǎn),能禁止物體沿世界坐標(biāo)系的三個(gè)方向的旋轉(zhuǎn)。5.4.3物理系統(tǒng)2.Collider組件Collider組件,俗稱碰撞器,碰撞器也分為兩類3D碰撞器和2D碰撞器。和剛體一樣,這兩種碰撞器都相似,以下我們只討論3D碰撞器。剛體可以讓物體在物理影響下運(yùn)動(dòng)。但是如果要讓兩個(gè)物體發(fā)生碰撞后的物理效果,就必須再為它們加上碰撞器,兩個(gè)對(duì)象有碰撞體時(shí)物理引擎才會(huì)計(jì)算碰撞,在物理模擬中,沒(méi)有碰撞體的剛體會(huì)彼此相互穿過(guò)。而物體能產(chǎn)生碰撞的輪廓就是由碰撞器提供的。
物體發(fā)生碰撞的必要條件:兩個(gè)物體都必須帶有碰撞器(Collider),其中一個(gè)物體還必須帶有Rigidbody剛體。5.4.3物理系統(tǒng)
在unity3d中,能檢測(cè)碰撞發(fā)生的方式有兩種,一種是利用碰撞器,另一種則是利用觸發(fā)器。
碰撞器是觸發(fā)器的載體,而觸發(fā)器只是碰撞器身上的一個(gè)屬性。
當(dāng)IsTrigger=false時(shí),碰撞器根據(jù)物理引擎引發(fā)碰撞,產(chǎn)生碰撞的效果,可以調(diào)用OnCollisionEnter/Stay/Exit方法;當(dāng)IsTrigger=true時(shí),碰撞器就變成了觸發(fā)器,沒(méi)有碰撞效果,可以調(diào)用OnTriggerEnter/Stay/Exit方法(關(guān)于這幾個(gè)方法的使用在之前的特有方法中有使用方法)。如果要檢測(cè)一個(gè)物體是否經(jīng)過(guò)空間中的某個(gè)區(qū)域這時(shí)就可以用到觸發(fā)器。5.4.3物理系統(tǒng)
(1)碰撞器的類型BoxCollider(盒子碰撞器);
SphereCollider(球形碰撞器);
CapsuleCollider(膠囊體碰撞器);
MeshCollider(網(wǎng)格碰撞器);
WheelCollider(車輪碰撞器);5.4.3物理系統(tǒng)
(2)其它物理組件物理系統(tǒng)所包含的組件很多,下面僅簡(jiǎn)單描述各個(gè)組件的名稱及作用,具體用法不在贅述。Cloth布料組件;HingeJoint鉸鏈關(guān)節(jié);FixedJoint固定關(guān)節(jié);SpringJoint彈簧關(guān)節(jié);CharacterJoint角色關(guān)節(jié);ConfigurableJoint;ConstantForce物理力場(chǎng);5.4.3物理系統(tǒng)剛體類中除了下面要講到的方法,還有很多屬性變量,這些變量在上面提到的面板中都有講過(guò),可以通過(guò)調(diào)取實(shí)例屬性的方式調(diào)取,此處不再贅述。(1)AddForce(),添加力。語(yǔ)法結(jié)構(gòu):publicvoidAddForce(Vector3force)所屬類:Rigidbody;方法解析:實(shí)例方法,需要用實(shí)例.的形式調(diào)用該方法。實(shí)現(xiàn)該Rigidbody實(shí)例添加一個(gè)力,力的方向沿著向量force的方向,力的大小為force的模。剛體類常用的代碼方法例子:Rigidbodyr=newRigidbody();//創(chuàng)建Rigidbody實(shí)例。r.AddForce(transform.forward);//給r添加一個(gè)沿自身前方向移動(dòng)的力,力的大小是1。以下實(shí)例統(tǒng)一用r表示Rigidbody類變量,用來(lái)存放Rigidbody實(shí)例,不再單獨(dú)定義。AddForce是重載方法,其他重載方法如下:publicvoidAddForce(Vector3force,ForceModemode);publicvoidAddForce(floatx,floaty,floatz);publicvoidAddForce(floatx,floaty,floatz,ForceModemode);x、y、z的參數(shù)是將向量force三個(gè)分量分別寫出來(lái)。剛體類常用的代碼方法(2)AddForceAtPosition(),添加點(diǎn)作用力。語(yǔ)法結(jié)構(gòu):publicvoidAddForceAtPosition(Vector3force,Vector3position)所屬類:Rigidbody;方法解析:實(shí)例方法,需要用實(shí)例.的形式調(diào)用該方法。實(shí)現(xiàn)該Rigidbody實(shí)例的一個(gè)位置點(diǎn)添加一個(gè)力,力的方向沿著參數(shù)向量force的方向,力的大小為force的模,position是力的作用點(diǎn)。例子:r.AddForceAtPosition(transform.forward,newVector3(1,1,1,));//給r添加一個(gè)沿自身前方向移動(dòng)的力,力的大小是1,作用點(diǎn)在坐標(biāo)1,1,1的位置。剛體類常用的代碼方法(3)AddExplosionForce(),添加爆炸力語(yǔ)法結(jié)構(gòu):publicvoidAddExplosionForce(floatexplosionForce, Vector3explosionPosition,floatexplosionRadius);方法解析:實(shí)例方法,需要用實(shí)例.的形式調(diào)用該方法。實(shí)現(xiàn)在世界坐標(biāo)下的產(chǎn)生一個(gè)力,力的位置參照explosionPosition,力的位置可以在物體輪廓之外,力的大小依照explosionForce,力的作用范圍半徑explosionRadius,方法內(nèi)部可以根據(jù)力的大小、位置、范圍計(jì)算力的對(duì)物體產(chǎn)生的影響。所屬類:Rigidbody;例子:r.AddExplosionForce(10,newVector3(1,1,1),20);//在世界坐標(biāo)系下1,1,1的點(diǎn)產(chǎn)生一個(gè)力,力的大小為10,力的作用范圍是20。剛體類常用的代碼方法(4)AddTorque(),添加扭矩。語(yǔ)法結(jié)構(gòu):publicvoidAddTorque(Vector3torque);所屬類:Rigidbody;方法解析:實(shí)例方法,需要用實(shí)例.的形式調(diào)用該方法。對(duì)實(shí)例對(duì)象添加一個(gè)扭矩,實(shí)例將以自身中心點(diǎn)為中心,參數(shù)torque方向?yàn)檩S向旋轉(zhuǎn),,旋轉(zhuǎn)速度為參數(shù)向量的模長(zhǎng)。例子:r.AddTorque(newVector3(1,1,1));//實(shí)例r以自身中心點(diǎn)為中心,向量1,1,1為方向?yàn)檩S旋轉(zhuǎn),旋轉(zhuǎn)速度為1,剛體類常用的代碼方法(5)SweepTest(),檢測(cè)第一個(gè)碰撞器。語(yǔ)法結(jié)構(gòu):publicboolSweepTest(Vector3direction,outRaycastHit hitInfo);所屬類:Rigidbody;方法解析:實(shí)例方法,需要用實(shí)例.的形式調(diào)用該方法。該方法用來(lái)檢測(cè)以實(shí)例中心為起點(diǎn),沿著參數(shù)Direction的方向上是否有碰撞器,該方法有返回值,返回一個(gè)bool值,true表示檢測(cè)到碰撞器,false表示沒(méi)有檢測(cè)到碰撞器。該方法中有一個(gè)outRaycastHithitInfo參數(shù),RaycastHit是一個(gè)射線碰撞信息類,用來(lái)保存射線碰撞物體所產(chǎn)生的信息,里面包含所碰到的物體,碰撞點(diǎn)的坐標(biāo)等。剛體類常用的代碼方法
關(guān)鍵字out的意思是可以在方法內(nèi)部對(duì)參數(shù)變量進(jìn)行更改,這么做的目的一般是因?yàn)槲覀冃枰粋€(gè)方法返回兩個(gè)有用的數(shù)據(jù),但是利用常規(guī)的return方法只能返回一個(gè)數(shù)據(jù),所以需要使用out來(lái)返回第二個(gè)返回值。例如當(dāng)前SweepTest方法,會(huì)返回一個(gè)是否碰撞到碰撞器的bool值,還會(huì)out出對(duì)應(yīng)的碰撞器的碰撞信息。該方法的檢測(cè)只檢測(cè)碰到的第一個(gè)碰撞器,檢測(cè)到第一個(gè),方法即結(jié)束。例子:r.SweepTest(transform.forward,outRaycastHithitInfo);//檢測(cè)實(shí)例r的前方向是否有碰撞器,如果有則返回true,并將產(chǎn)生的碰撞的信息存入變量hitInfo中,如果沒(méi)有則返回false。剛體類常用的代碼方法
(6)SweepTestAll(),檢測(cè)所有碰撞器語(yǔ)法結(jié)構(gòu):publicRaycastHit[]SweepTestAll(Vector3direction,out RaycastHithitInfo);所屬類:Rigidbody;方法解析:SweepTestAll方法和SweepTest方法類似,區(qū)別在于SweepTest只檢測(cè)碰到的第一個(gè)碰撞器,而SweepTestAll方法獲取碰撞的所有碰撞器。剛體類常用的代碼方法
物理管理器:在物理管理器中可以設(shè)置場(chǎng)景中所有物理效果的一些參數(shù),例如:重力加速度,反彈力等等。物理管理器所設(shè)置的是世界的物理屬性,剛體所設(shè)置的是物體自身的物理屬性。物理管理器通過(guò)Edit菜單→ProjectSettings→Physics找到。物理面列舉了部分參數(shù)的意思,通常這個(gè)面板最常用的是物理的重力效果。Gravity:重力,重力加速度。DefaultMaterial物理材質(zhì)用于調(diào)整摩擦力和碰撞單位之間的反彈效果。Bouncethreshold反彈值,速度小于這個(gè)值的時(shí)候,就不再反彈。Sleepthreshold休眠值,當(dāng)速度小于這個(gè)值,則靜止。4.物理管理器
Physics類是Unity中個(gè)處理物理相關(guān)功能的類,里面包含了全局物理屬性和輔助方法,該類下的方法和屬性都是靜態(tài),下面我們依次講解。(1)gravity,檢測(cè)所有碰撞器語(yǔ)法結(jié)構(gòu):publicstaticVector3gravity{get;set;}所屬類:Physics;方法解析:場(chǎng)景重力加速度。5.物理類常用的代碼方法(2)RayCast,射線碰撞檢測(cè)語(yǔ)法結(jié)構(gòu):publicstaticboolRaycast(Rayray,outRaycastHithitInfo);所屬類:Physics;方法解析:射線檢測(cè)。使用方法和RigidBody類下的SweepTest相似,方法會(huì)有一個(gè)返回值,如果射線碰到物體則返回true否則返回false,ray為是需要檢測(cè)的射線,hitInfo是碰撞信息,該方法有多個(gè)重載方法,maxDistance是射線長(zhǎng)度,layerMask層號(hào),通過(guò)這個(gè)內(nèi)容,可以對(duì)控制射線只對(duì)某一層進(jìn)行碰撞檢測(cè)。5.物理類常用的代碼方法(3)RaycastAll,射線碰撞檢測(cè)語(yǔ)法結(jié)構(gòu):publicstaticRaycastHit[]RaycastAll(Rayray);所屬類:Physics;方法解析:射線全部碰撞檢測(cè)。該方法和RigidBody類下的SweepTestAll相似,返回一個(gè)碰撞信息數(shù)組,將所有碰到的物體的碰撞信息都放到這個(gè)數(shù)組中。ray是需要檢測(cè)的射線,maxDistance是射線長(zhǎng)度,layerMask需要進(jìn)行碰撞檢測(cè)的層號(hào)。除了射線檢測(cè),還有LineCast線段檢測(cè),和射線方法基本相同,BoxCast盒子射線檢測(cè),和射線方法類似,不過(guò)發(fā)射出去的是一個(gè)Box的圖形,而不是一條線,SphereCast球形射線檢測(cè),CapsuleCast膠囊射線檢測(cè)。5.物理類常用的代碼方法(4)CheckSphere:檢測(cè)虛擬Sphere在世界空間坐標(biāo)系中是否和碰撞器重疊。語(yǔ)法結(jié)構(gòu):publicstaticboolCheckSphere(Vector3position,float radius);所屬類:Physics;方法解析:在空間中一點(diǎn)設(shè)置一個(gè)虛擬的球形碰撞器,檢測(cè)是否有物體與該球體發(fā)生碰撞,如果有,則返回true,否則返回false,postion為坐標(biāo),radius為半徑,layerMask是要進(jìn)行檢測(cè)的層級(jí)。同類的方法還有CheckBox、CheckCapsule5.物理類常用的代碼方法(5)OverlapSphere:返回球內(nèi)或與之接觸的所有碰撞器。語(yǔ)法結(jié)構(gòu):publicstaticCollider[]OverlapSphere(Vector3position, floatradius);所屬類:Physics;方法解析:在空間中一點(diǎn)設(shè)置一個(gè)虛擬的球形碰撞器,檢測(cè)是否有物體與該球體發(fā)生碰撞,將所有與之發(fā)生的碰撞的碰撞體存到一個(gè)數(shù)組中通過(guò)方法返回,postion為坐標(biāo),radius為半徑,layerMask是要進(jìn)行檢測(cè)的層級(jí)。同類的方法還有OverlapBox、OverlapCapsule5.物理類常用的代碼方法物理材質(zhì)是模擬物體的表面物理效果的材質(zhì)。DynameicFriction:動(dòng)態(tài)摩擦力。當(dāng)物體移動(dòng)時(shí)的摩擦力。通常為0到1之間的值。值為0的效果像冰,而設(shè)為1時(shí),物體運(yùn)動(dòng)將很快停止,除非有很大的外力或重力來(lái)推動(dòng)它。物理材質(zhì)StaticFriction:靜態(tài)摩擦力。靜摩擦力。當(dāng)物體在表面靜止的摩擦力。通常為0到1之間的值。當(dāng)值為0時(shí),效果像冰,當(dāng)值為1時(shí),使物體移動(dòng)十分困難。Bouncyness:反彈力,0的時(shí)候沒(méi)有反彈力,1的時(shí)候不發(fā)生力的衰減。FrictionCombine:摩擦力組合方式:兩個(gè)碰撞物體的摩擦力如何相互作用。有四種子項(xiàng),四種計(jì)算方式Average(平均值)平均,Min(最小值)最小值,Max(最大值),Multiply(兩個(gè)值的乘積)。BounceCombine:反彈力組合方式:定義兩個(gè)碰撞物體的反彈力如何相互作用。物理材質(zhì)
角色控制器是Unity自帶的一個(gè)控制角色移動(dòng)旋轉(zhuǎn)的組件,角色控制器允許游戲開發(fā)者在受制于碰撞的情況下發(fā)生移動(dòng),而不用處理剛體。角色控制器不會(huì)受到力的影響,在游戲制作過(guò)程中,游戲開發(fā)者通常在任務(wù)模型上添加角色控制器組件進(jìn)行模型的模擬運(yùn)動(dòng)。角色控制器SlopeLimit坡度限制。StepOffset臺(tái)階高度。SlopeLimit坡度限制。StepOffset臺(tái)階高度。SkinWidth皮膚厚度。MinMoveDistance最小移動(dòng)距離。Center中心。Radius半徑。Height高度。角色控制器謝謝第五章虛擬現(xiàn)實(shí)開發(fā)工具5
UGUI系統(tǒng)是從Unity4.6版本以后提供的新的UI系統(tǒng),相較之前GUI系統(tǒng),使用起來(lái)方便快捷,可視化效果好。UGUI系統(tǒng)提供了很多常用的組件,可以使用戶在不使用任何代碼的前提下,就可以簡(jiǎn)單快速的建立其一套UI界面。5.4.4UGUI每一個(gè)ui控件都需要放到Canvas(畫布),當(dāng)創(chuàng)建或沒(méi)有Canvas(畫布)系統(tǒng)會(huì)默認(rèn)或自動(dòng)創(chuàng)建一個(gè)Canvas(畫布)。Canvas(畫布)下有3個(gè)組件分別是:Canvas、CanvasScaler、GraphicRaycaster。Canvas組件下的RenderMode(渲染模式)一共有三種模式。1.CanvasScaleWithScreenSize模式(1)ConstantPixelSize模式使UI元素保持相同的像素大小,無(wú)論屏幕大小如何。(2)ScaleWithScreenSize模式,可以根據(jù)屏幕的大小進(jìn)行縮放,在此模式下有三種不同的縮放方式。(3)ConstantPhysicalSize模式使UI元素保持相同的物理大小,而不考慮屏幕大小和分辨率。1.Canvas
RectTransform組件是可以看看成Transform的2D版,物體上的Transform組件是不可以刪除的,但是RectTransform組件是可以刪除的,刪除之前,需要將該物體上所有UGUI相關(guān)的組件都刪掉,之后就可以刪除RectTransform,刪掉之后,會(huì)發(fā)現(xiàn)RectTransform變成了Transform。從這里可以看出RectTransform只是Transform在2D情況的一個(gè)變種。2.RectTransformPos(X,Y,Z):相對(duì)于錨點(diǎn)點(diǎn)的位置。Width/Height:UI元素寬度和高度。Left,Top,Right,Bottom:Anchors:錨點(diǎn)矩形。Min:錨點(diǎn)矩形左下角位置,按屏幕的比例設(shè)置。Max:錨點(diǎn)矩形右上角位置,按屏幕的比例設(shè)置。Pivot:UI的中心點(diǎn)的位置,按自身UI的比例設(shè)置。Rotation:U旋轉(zhuǎn),單位是角度。Scale:縮放。2.RectTransform非交互式文本框,主要用來(lái)顯現(xiàn)文本內(nèi)容。Text:文本。Font:字體。FontStyle:文本樣式。FontSize:顯示文本的大小。LineSpacing:行距。AlignbyGeometry是否使用字形大小的方式對(duì)齊。BestFit是否根據(jù)文本框大小來(lái)自適應(yīng)文字Color文本的顏色。3.Text(文本控制)簡(jiǎn)介Image(圖像)非交互式圖像。主要用于制作圖標(biāo)、背景等。SourceImage顯示的圖像,必須是Sprite(精靈)Color修改圖像的顏色。Material渲染圖像的材料。RaycastTarget是否可以進(jìn)行射線檢測(cè);ImageType顯示圖像的類型,選項(xiàng)包括Simple(標(biāo)準(zhǔn)圖片)、Sliced(九宮格切片)、Tille(背景平鋪)和Filled(旋轉(zhuǎn))。SetNativeSize將圖像的尺寸設(shè)置為圖像本身的像素;4.Image(圖像)如何將圖片變成精靈由于Image所支持的圖像格式都是Sprite格式,所有要將普通圖片轉(zhuǎn)換成精靈,找到要轉(zhuǎn)換的圖片文件并鼠標(biāo)單擊,然后找Inspector(屬性面板)下的TextureType里的Sprite,最后鼠標(biāo)單擊Apple完成。4.Image(圖像)
原始圖像和圖像很像它們都是向用戶顯示非交互式圖像。您可以將其用于裝飾或圖標(biāo)等目的,還可以將圖像從類更改為反映其他控件中的更改??丶愃朴趫D像控件,但提供了更多的選項(xiàng)來(lái)動(dòng)畫圖像和精確填充控制矩形。然而,圖像控件要求其紋理為精靈,而原始圖像可以接受任何紋理。Texture顯示的圖像紋理。5.RawImage(原始圖像)
Button按鈕控件是在UGUI中最常用的一個(gè)組件之一,主要用來(lái)響應(yīng)用戶的鼠標(biāo)單擊,用于發(fā)起或確認(rèn)操作。Interactable(是否可用):勾選,按鈕可用,取消勾選,按鈕不可用,并進(jìn)入Disabled狀態(tài)。該屬性在所有可交互組件中都有,之后不再描述。6.Button(按鈕)
Transition(過(guò)渡方式):按鈕在狀態(tài)改變時(shí)自身的過(guò)渡方式:主要分為賽中狀態(tài)的變化,默認(rèn)狀態(tài),高亮狀態(tài)(鼠標(biāo)懸停在Button上的狀態(tài)),點(diǎn)擊狀體(鼠標(biāo)點(diǎn)擊或選中后的狀態(tài)),不可點(diǎn)擊狀態(tài)(當(dāng)按鈕不可點(diǎn)擊的時(shí)候的狀態(tài))。(1)ColorTint(顏色過(guò)度)(2)SpriteSwap(精靈過(guò)渡)(3)Animation(執(zhí)行動(dòng)畫)6.Button(按鈕)
Toggle大部分屬性等同于Button組件,同為按鈕,不同的只是他自帶了組合切換功能,當(dāng)然這些用Button也是可以實(shí)現(xiàn)的。IsOn(選中狀態(tài)):此Toggle的選中狀態(tài),設(shè)置或返回為一個(gè)bool。Group(所屬組合):這里指向一個(gè)帶有ToggleGroup組件的任意目標(biāo),將此Toggle加入該組合,之后此Toggle便會(huì)處于該組合的控制下,同一組合內(nèi)只能有一個(gè)Toggle可處于選中狀態(tài),即便是初始時(shí)將所有Toggle都開啟IsOn,之后的選擇也會(huì)自動(dòng)保持單一模式。OnValueChanged(狀態(tài)改變觸發(fā)消息):當(dāng)此Toggle選中狀態(tài)改變時(shí),觸發(fā)一次此消息。7.Toggle(單選)
帶有此組件的物體,可以同時(shí)管理多個(gè)Toggle,將需要被管理的Toggle的Group參數(shù)指向此ToggleGroup便可。AllowSwitchOff(是否允許關(guān)閉):ToggleGroup組默認(rèn)有且僅有一個(gè)Toggle可處于選中狀態(tài)(其管轄的所有Toggle中),如果勾選此屬性,則ToggleGroup組的所有Toggle都可同時(shí)處于未選中狀態(tài)。8.ToggleGroup(單選管理器)
Slider(滑動(dòng)條)是一個(gè)主要用于形象的拖動(dòng)以改變目標(biāo)值的控件,他的最恰當(dāng)應(yīng)用是用來(lái)改變一個(gè)數(shù)值,最大值和最小值自定義,拖動(dòng)滑塊可在此之間改變,例如改變聲音大小。Direction(方向):滑動(dòng)條的方向,從左至右,從上至下還是其他的。MinValue(最小值):滑動(dòng)條的可變化最小值。MaxValue(最大值):滑動(dòng)條的可變化最大值。WholeNumbers(變化值為整型):勾選此項(xiàng),拖動(dòng)滑動(dòng)條將按整型數(shù)(最小為1)進(jìn)行改變指定值。Value(值):當(dāng)前滑動(dòng)條對(duì)應(yīng)的值。OnValueChanged:值改變時(shí)觸發(fā)消息。9.Slider(滑動(dòng)條)
Scrollbar(滾動(dòng)條):是一個(gè)主要用于形象的拖動(dòng)以改變目標(biāo)比例的控件,他的最恰當(dāng)應(yīng)用是用來(lái)改變一個(gè)整體值變?yōu)樗闹付ò俜直壤畲笾?(100%),最小值0(0%),拖動(dòng)滑塊可在此之間改變,例如改變滾動(dòng)視野的顯示區(qū)域。Direction(方向):滾動(dòng)條的方向,從左至右,從上至下還是其他的。Value(值):當(dāng)前滾動(dòng)條對(duì)應(yīng)的值。Size(操作條矩形長(zhǎng)度):操作條矩形對(duì)應(yīng)的縮放長(zhǎng)度。NumbersOfSteps(指定可滾動(dòng)的位置數(shù)量):滾動(dòng)條可滾動(dòng)的位置數(shù)目,為0和1時(shí)不生效。OnValueChanged:值改變時(shí)觸發(fā)消息。10.Scrollbar(滾動(dòng)條)Dropdown(下拉菜單)可以讓用戶從選項(xiàng)列表中選擇一個(gè)選項(xiàng)。CaptionText:保存當(dāng)前選中選項(xiàng)的文本。(可選)CaptionImage:保存當(dāng)前選中選項(xiàng)的圖像。(可選)ItemText:下拉框選項(xiàng)里的文字。ItemImage:下拉框選項(xiàng)里的圖片。Value:當(dāng)前選中選項(xiàng)下標(biāo)。0代表第一個(gè)選項(xiàng),1表示第二個(gè),以此類推。Options:可選的選項(xiàng)的列表。每個(gè)選項(xiàng)可以指定text和imageOnValueChanged:當(dāng)用戶鼠標(biāo)選中的一個(gè)選項(xiàng)時(shí),一個(gè)事件會(huì)被調(diào)用。11.Dropdown(下拉菜單)Text(文本):文本初始內(nèi)容。CharacterLimit(字符數(shù)量限制):文本輸入字?jǐn)?shù)限制。Standard(標(biāo)準(zhǔn)類型):什么字符都能輸入,默認(rèn)設(shè)置。IntegerNumber(整數(shù)類型):只能輸入整數(shù)。 DecimalNumber(十進(jìn)制數(shù)):能輸入整數(shù)或小數(shù)。 Alphanumeric(文字和數(shù)字):能輸入數(shù)字和字母。 Name(姓名類型):能輸入英文及其他文字,(首字母大寫)。 Password(密碼類型):輸入的字符隱藏為星號(hào)。Placeholder(位置標(biāo)示):文字提示框,OnValueChanged:當(dāng)數(shù)值改變時(shí)調(diào)用方法。EndEdit:結(jié)束編輯時(shí)調(diào)用方法。12.InputField(輸入文本框)
當(dāng)需要在一個(gè)小區(qū)域中顯示占用大量的內(nèi)容時(shí),可以使用滾動(dòng)矩形。滾動(dòng)矩形提供了在此內(nèi)容上滾動(dòng)的功能。通常,滾動(dòng)矩形要和蒙版組件配合,為了創(chuàng)建滾動(dòng)視圖,其中只有滾動(dòng)矩形內(nèi)的可滾動(dòng)內(nèi)容是可見的。Horizontal:是否可以左右滾動(dòng)Vertical:是否可以上下滾動(dòng)MovementType:拖動(dòng)的約束。分別有無(wú)限制的,彈性的或限制的。Unrestricted:無(wú)限制的,可以任意滾動(dòng)。Elasticity:當(dāng)內(nèi)容到達(dá)滾動(dòng)矩形的邊緣時(shí),將對(duì)內(nèi)容進(jìn)行反彈Clamped:強(qiáng)制內(nèi)容保持在滾動(dòng)矩形的范圍內(nèi)。13.ScrollRect(滾動(dòng)界面)
Mask(遮罩)不是一個(gè)可見的UI控件,而是一種修改控件子元素外觀的方法。因此,如果子元素比父元素圖像大,那么只能看到子元素中適合父元素的部分。該組件,我們?cè)谥v解RawImage時(shí),曾經(jīng)用過(guò)。用于顯示圓形的畫面,這里的遮罩和我們?nèi)粘I钪姓趽跻馑颊孟喾?,這里的遮罩是遮住什么地方就顯示什么地方。ShowGraphicMask:是否顯示遮罩層的圖像。14.Mask(遮罩)
布局組件是UGUI的一個(gè)特色組件,用來(lái)調(diào)整UGUI在自動(dòng)布局時(shí)的UI的大小。IgnoreLayout當(dāng)啟用時(shí),忽略此布局。MinWidth應(yīng)有的最小寬度。MinHeight應(yīng)有的最小高度。PreferredWidth首選寬度。PreferredHeight首選高度。FlexibleWidth瓜分剩余橫向空間的比例。FlexibleHeight瓜分剩余縱向空間的比例。LayoutPriority布局優(yōu)先級(jí)。15.LayoutElement(布局)
ContentSizeFitter組件主要是用來(lái)設(shè)置自身UI的長(zhǎng)寬(這個(gè)自身時(shí)包含子UI的寬、高)。HorizontalFit:寬度的控制Unconstrained:不根布局組件調(diào)整,可手動(dòng)修改寬度值。 MinSize:按布局組件最小值來(lái)調(diào)整,不能手動(dòng)修改寬度值。PreferredSize:按布局組件首選值來(lái)調(diào)整,不能手動(dòng)修改寬度值。VerticalFit:高度的控制和寬度的類似,不再描述。這個(gè)組件的應(yīng)用一定要配合LayoutElement組件,否則無(wú)效。16.ContentSizeFitter根據(jù)比例自動(dòng)調(diào)整自身UI的大小;None:不使用適合的縱橫比。WidthControlsHeight:讓Height隨著Width自動(dòng)調(diào)節(jié)。HeightControlsWidth:讓W(xué)idth隨著Height自動(dòng)調(diào)節(jié)。FitInParent:寬度、高度、位置和錨點(diǎn)都會(huì)被自動(dòng)調(diào)整,以使得該矩形擬合父物體的矩形內(nèi),同時(shí)保持寬高比例。EnvelopeParent:寬度、高度、位置和錨點(diǎn)都會(huì)被自動(dòng)調(diào)整,以使得該矩形覆蓋父物體的整個(gè)區(qū)域,同時(shí)保持寬高比。17.AspectRatioFitter
水平布局組件通常和LayoutElement配合使用,將其子UI橫向并依次放在一起。子UI的大小根據(jù)自身的LayoutElement組件的值進(jìn)行設(shè)置。Padding:布局的邊界大小。Spacing:行距。ChildAlignment:對(duì)齊方式.ControlChildSize:是否控制其子布局元素的寬度和高度。ChildForceExpand:是否填充額外的可用空間。18.HorizontalLayoutGroup
垂直布局與水平布局除了方向都是一樣的。19.VerticalLayoutGroupGridLayoutGroup就是垂直布局和水平布局的綜合版。Padding:布局的邊界大小。CellSize:每個(gè)子UI的大小。Spacing:布局元素之間的行距。StartCorner:起始位置。StartAxis:橫向排列合適縱向排列ChildAlignment:對(duì)齊方式。Constraint:將網(wǎng)格約束為固定數(shù)量的行或列,以幫助自動(dòng)布局系統(tǒng)。Flexible:是默認(rèn)不約束。包含兩個(gè)子項(xiàng),F(xiàn)ixedColumnCount(一行幾個(gè))FixedRowCount:(一列幾個(gè))。20.GridLayoutGroup謝謝第五章虛擬現(xiàn)實(shí)開發(fā)工具6
NavigationMesh組件Unity提供的一個(gè)實(shí)現(xiàn)AI可以自動(dòng)移動(dòng),尋找最優(yōu)路徑,到達(dá)目的位置的組件。想要尋路需要以下幾步,把要尋路的物體添加上NavMeshAgent(自動(dòng)尋路組件)。然后選中作為尋路的物體,在物體上的GameObject里Static下的找到Navigationstatic勾選上。5.4.5NavigationMesh依次選擇菜單欄中的Windows->AI->Navigation打開。Navigation面板找到Bake,鼠標(biāo)單擊Bake,進(jìn)行場(chǎng)景烘培。烘焙后的場(chǎng)景會(huì)生成一個(gè)藍(lán)色網(wǎng)格面,這個(gè)面的范圍就是物體所能尋路的區(qū)域。
注意,尋路網(wǎng)格是一個(gè)單獨(dú)的個(gè)體,不隨著模型而移動(dòng),生成網(wǎng)格后,如果對(duì)場(chǎng)景進(jìn)行了修改或移動(dòng),則需要重新烘焙場(chǎng)景。5.4.5NavigationMeshAgentRadius物體空間半徑AgentHeight物體空間高度MaxSlope可行走的最大的坡度StepHeight可走上的最大臺(tái)階高Dropheight可跳下的高度JumpDistance可跳躍的距離5.4.5NavigationMeshCost:用來(lái)設(shè)置路徑價(jià)值,比如走樓梯,消耗體能20,而坐電梯,消耗體能5,自然會(huì)選擇后者方式。1.NavMeshArea
它是一個(gè)組件可以控制我們的npc繞過(guò)場(chǎng)景中的障礙物,避開其他npc擋路到達(dá)目標(biāo)點(diǎn)。之所以使用它就是因?yàn)樗梢员荛_其他npc,甚至繞過(guò)一些移動(dòng)的障礙物。2.NavMeshAgentAgentType:代理的類型。Baseoffset:偏移,修改代理的高低。Speed:尋路時(shí)移動(dòng)的最大速度。AgularSpeed:尋路時(shí)是旋轉(zhuǎn)的速度。Acceleration:旋轉(zhuǎn)加速度。AutoBraking:是否自動(dòng)停止。StoppingDistance:尋路時(shí),距離目標(biāo)多遠(yuǎn)停止。Radius:代理的半徑(指寬度)。Height:代理的高度。AutoRepath:自動(dòng)重新規(guī)劃路徑。AreaMask:選擇進(jìn)入什么區(qū)域。2.NavMeshAgent
我們游戲中通常在尋路時(shí)會(huì)遇見一些障礙物(動(dòng)態(tài),靜態(tài)障礙物),對(duì)于這些障礙物的控制我們使用NavMeshObstacle組件。Shape:障礙形狀(盒子形、膠囊形)Center:位置中心Size:縮放大小Carve:選中會(huì)自動(dòng)繞路。否則會(huì)碰到障礙物就會(huì)卡主,不會(huì)找新路線(如沒(méi)有打勾則沒(méi)有下幾列)3.NavMeshObstacle
用于手動(dòng)指定路線來(lái)生成分離的網(wǎng)格連接。例如,游戲中讓行進(jìn)對(duì)象上下爬梯子到達(dá)另一塊網(wǎng)格的情景就是利用生成分離的網(wǎng)格連接來(lái)實(shí)現(xiàn)。Start:開始端的物體;End:結(jié)束端物體;CostOverride:是否計(jì)算價(jià)值。Bi-Directional是否雙向移動(dòng)。Activated是否在尋路的時(shí)候使用該組件。AutoUpdatePositions如果打勾兩個(gè)端點(diǎn)如果移動(dòng)了會(huì)自動(dòng)調(diào)整導(dǎo)航位置;NavigationArea路徑區(qū)域4.OffMeshLink自動(dòng)尋路中除了下面要講到的方法,還有很多屬性變量,這些變量在上面提到的面板中都有講過(guò),可以通過(guò)調(diào)取實(shí)例屬性的方式調(diào)取,此處不再贅述。(1)NavMesh類以下的方法都所屬于NavMesh類①GetAreaCost:獲取在本導(dǎo)航網(wǎng)格的價(jià)值。語(yǔ)法結(jié)構(gòu):publicstaticfloatGetAreaCost(intareaIndex);方法解析:靜態(tài)方法,需要用類名.的形式調(diào)用該方法。實(shí)現(xiàn)是通過(guò)查詢導(dǎo)航網(wǎng)格索引參數(shù)是areaIndex,來(lái)查看本導(dǎo)航網(wǎng)格的成本。有返回值。返回類型為float類型。5.NavigationMesh常用代碼②SetAreaCost:設(shè)置相應(yīng)導(dǎo)航網(wǎng)格區(qū)域的成本。語(yǔ)法結(jié)構(gòu):publicstaticvoidSetAreaCost(intareaIndex,floatcost);方法解析:靜態(tài)方法,需要用類名.的形式調(diào)用該方法。實(shí)現(xiàn)是通過(guò)想修改成本的導(dǎo)航網(wǎng)格索引參數(shù)areaIndex,讓它的成本修改成cost參數(shù)。5.NavigationMesh常用代碼③GetAreaFromName:通過(guò)名字獲取區(qū)域索引語(yǔ)法結(jié)構(gòu):publicstaticintGetAreaFromName(stringareaName);方法解析:靜態(tài)方法,需要用類名.的形式調(diào)用該方法。實(shí)現(xiàn)是通過(guò)參數(shù)areaName名字來(lái)查詢是否有這個(gè)區(qū)域,如果有返回的值為正數(shù),則為索引;如果找不到區(qū)域,則為-1。5.NavigationMesh常用代碼④AllAreas:包括所有NavMesh區(qū)域的區(qū)域蒙版的常數(shù)。語(yǔ)法結(jié)構(gòu):publicconstintAllAreas=-1;Raycast;檢測(cè)區(qū)域語(yǔ)法結(jié)構(gòu):publicstaticboolRaycast(Vector3sourcePosition,Vector3targetPosition,outNavMeshHithit,intareaMask);方法解析:靜態(tài)方法,需要用類名.的形式調(diào)用該方法。該方法用來(lái)檢測(cè)以參數(shù)sourcePosition為起點(diǎn),到參數(shù)targetPosition終點(diǎn)。該方法有返回值,由生成點(diǎn)到目標(biāo)點(diǎn)方向生成一條射線,如果碰到區(qū)域(參數(shù)areaMask)邊緣則返回true,到達(dá)目標(biāo)點(diǎn)且沒(méi)有碰到區(qū)域則返回false該方法中有一個(gè)outNavMeshHithit參數(shù),hit是一個(gè)射線NavMeshHit類,用來(lái)保存射線碰撞物體所產(chǎn)生的信息,里面包含所碰到的物體的坐標(biāo)等。5.NavigationMesh常用代碼⑤CalculatePath:計(jì)算兩點(diǎn)間路徑并保存語(yǔ)法結(jié)構(gòu):publicstaticboolCalculatePath(Vector3sourcePosition,Vector3targetPosition,intareaMask,NavMeshPathpath);方法解析:靜態(tài)方法,需要用類名.的形式調(diào)用該方法。此功能可用于提前計(jì)劃路徑,以避免在需要該路徑時(shí)游戲延遲。另一個(gè)用途是在移動(dòng)代理程序之前檢查目標(biāo)位置是否可達(dá)。該方法有返回值,如果找到完整或部分路徑,則為true,否則為false。5.NavigationMesh常用代碼(2)NavMeshHit類①position:物體的位置語(yǔ)法結(jié)構(gòu):publicVector3position{get;set;}②normal:標(biāo)準(zhǔn)化語(yǔ)法結(jié)構(gòu):publicVector3normal{get;set;}③distance:到射線擊中點(diǎn)的距離。語(yǔ)法結(jié)構(gòu):publicfloatdistance{get;set;}④mask:設(shè)置或獲取NavMesh區(qū)域的值。語(yǔ)法結(jié)構(gòu):publicintmask{get;set;}⑤hit:射線是否命中語(yǔ)法結(jié)構(gòu):publicboolhit{get;set;}5.NavigationMesh常用代碼(3)NavMeshAgent類①destination:賦值讓尋路組件的物體去哪語(yǔ)法結(jié)構(gòu):publicVector3destination{get;set;}②SetDestination:傳參的形式讓尋路組件的物體去哪語(yǔ)法結(jié)構(gòu):publicboolSetDestination(Vector3target);方法解析:實(shí)例方法,需要實(shí)例.的形式調(diào)用該方法。此方法需要把要去的點(diǎn)以參數(shù)的形式傳入進(jìn)去即可尋路。5.NavigationMesh常用代碼③isOnNavMesh:該代理物體是否在導(dǎo)航網(wǎng)格上語(yǔ)法結(jié)構(gòu):publicboolisOnNavMesh{get;}④nextPosition:獲取或設(shè)置navmesh代理的模擬位置。語(yǔ)法結(jié)構(gòu):publicVector3nextPosition{get;set;}⑤path:獲取或設(shè)置當(dāng)前路徑的屬性。語(yǔ)法結(jié)構(gòu):publicNavMeshPathpath{get;set;}5.NavigationMesh常用代碼⑥SetPath:設(shè)置新路徑語(yǔ)法結(jié)構(gòu):publicboolSetPath(NavMeshPathpath);方法分析:實(shí)例方法,需要實(shí)例.的形式調(diào)用該方法。此方法為該代理分配新路徑參數(shù)為path。該方法有返回值,如果成功分配了路徑,代理將恢復(fù)向新目標(biāo)的移動(dòng)。則為true。如果無(wú)法分配路徑,則將清除該路徑返回false。5.NavigationMesh常用代碼⑦SamplePathPosition:向前查找指定的距離,和NavMesh里面的RayCast相似。語(yǔ)法結(jié)構(gòu):publicboolSamplePathPosition(intareaMask,floatmaxDistance,outNavMeshHithit);方法解析:實(shí)例方法,需要實(shí)例.的形式調(diào)用該方法。該方法是以實(shí)例的物體自身前方向開始到參數(shù)maxDistance的之間生成一條射線,該方法有返回值,如果碰到區(qū)域(參數(shù)areaMask)邊緣則返回true,到達(dá)目標(biāo)點(diǎn)且沒(méi)有碰到區(qū)域則返回false該方法中有一個(gè)outNavMeshHithit參數(shù),hit是一個(gè)射線NavMeshHit類,用來(lái)保存射線碰撞物體所產(chǎn)生的信息,里面包含所碰到的物體,碰撞點(diǎn)的坐標(biāo)等。5.NavigationMesh常用代碼⑧isOnOffMeshLink:當(dāng)前代理是否位于OffMeshLink上語(yǔ)法結(jié)構(gòu):publicboolisOnOffMeshLink{get;}⑨currentOffMeshLinkData:當(dāng)前的OffMeshLinkData。如果此代理不在OffMeshLink上,則將OffMeshLinkData標(biāo)記為無(wú)語(yǔ)法結(jié)構(gòu):publicOffMeshLinkDatacurrentOffMeshLinkData{get;}⑩nextOffMeshLinkData:當(dāng)前路徑上的下一個(gè)OffMeshLinkData。如果當(dāng)前路徑不包含OffMeshLink,則將OffMeshLinkData標(biāo)記為無(wú)效。語(yǔ)法結(jié)構(gòu):publicOffMeshLinkDatanextOffMeshLinkData{get;}?CompleteOffMeshLink:在當(dāng)前分離網(wǎng)格鏈接上完成運(yùn)動(dòng)。語(yǔ)法結(jié)構(gòu):publicvoidCompleteOffMeshLink();5.NavigationMesh常用代碼(4)OffMeshLink類①activated:分離網(wǎng)格鏈接激活語(yǔ)法結(jié)構(gòu):publicboolactivated{get;set;}②occupied:是否占用語(yǔ)法結(jié)構(gòu):publicbooloccupied{get;}③startTransform:開始端的物體語(yǔ)法結(jié)構(gòu):publicTransformstartTransform{get;set;}5.NavigationMesh常用代碼(4)OffMeshLink類④endTransform:結(jié)束端的物體語(yǔ)法結(jié)構(gòu):publicTransformendTransform{get;set;}⑤biDirectional:可以雙向遍歷鏈接。語(yǔ)法結(jié)構(gòu):publicboolbiDirectional{get;set;}⑥area:此OffMeshLink組件的NavMesh區(qū)域索引。語(yǔ)法結(jié)構(gòu):publicintarea{get;set;}5.NavigationMesh常用代碼(5)OffMeshLinkData類①valid:鏈接有是否效語(yǔ)法結(jié)構(gòu):publicboolvalid{get;}②activated:獲取鏈接是否處于激活狀態(tài)語(yǔ)法結(jié)構(gòu):publicboolactivated{get;}③startPos:獲取鏈接開始的位置語(yǔ)法結(jié)構(gòu):publicVector3startPos{get;}④endPos:獲取鏈接結(jié)束的位置語(yǔ)法結(jié)構(gòu):publicVector3endPos{get;}5.NavigationMesh常用代碼謝謝第五章虛擬現(xiàn)實(shí)開發(fā)工具7
Unity中的粒子系統(tǒng)可用于制作特效,例如爆炸,技能,碰撞等。通過(guò)該組件能做出很多漂亮的效果。通過(guò)菜單欄的GameObject->Effects->ParticleSystem即可在場(chǎng)景中添加一個(gè)名為ParticleSystem粒子系統(tǒng)物體。5.4.6Shuriken(粒子特效)是粒子系統(tǒng)的主面板。Duration:粒子發(fā)射周期;Looping:粒子按照周期循環(huán)發(fā)射。Prewarm:預(yù)熱系統(tǒng);StartDelay:粒子延時(shí)發(fā)射;StartLifeTime:生命起始時(shí)間;StartSpeed:粒子初始發(fā)生時(shí)候的速度。3DStartSize:粒子單個(gè)縮放;5.4.6.1ParticleSystemStartSize:整體縮放。粒子初始的大小。3DStartRotation:粒子單個(gè)旋轉(zhuǎn)。StartRotation:整體旋轉(zhuǎn)。粒子初始旋轉(zhuǎn)。FlipRotation:隨機(jī)旋轉(zhuǎn)粒子方向。StartColor:粒子初始顏色,GravityModifier:為粒子添加重力。SimulationSpace:空間位置。Local此時(shí)粒子會(huì)跟隨父級(jí)物體移動(dòng)。5.4.6.1ParticleSystemWorld此時(shí)粒子不會(huì)跟隨父級(jí)移動(dòng)。Custom粒子會(huì)跟著指定的物體移動(dòng)。SimulationSpeed:根據(jù)Update模擬的速度。MaxParticles:同時(shí)存在的最大粒子數(shù)量。AutoRandomSeed:隨機(jī)速度。StopAction:當(dāng)屬于系統(tǒng)的所有粒子都已完成時(shí),可以使系統(tǒng)執(zhí)行動(dòng)作。5.4.6.1ParticleSystem此模塊主要定義粒子發(fā)射器,以及開始粒子速度的方向。以下部分詳細(xì)介紹了每個(gè)Shape和Hemisphere的屬性。5.4.6.2shape形狀模塊(2)Cone(圓錐)以下部分詳細(xì)介紹了Co
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度個(gè)人健康保險(xiǎn)合同范本2篇
- 長(zhǎng)沙南方職業(yè)學(xué)院《俄語(yǔ)基礎(chǔ)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年度智能倉(cāng)儲(chǔ)物流設(shè)施建設(shè)合同范本3篇
- 2024物業(yè)權(quán)益讓與擔(dān)保合同 權(quán)益方與受讓方協(xié)議
- 思政教育團(tuán)隊(duì)建設(shè)與教師專業(yè)成長(zhǎng)
- 二零二五版集成墻板家裝裝修環(huán)保評(píng)估合同范本3篇
- 2025年校園歷史文化宣傳欄制作與教育推廣合同3篇
- 二零二五年度建筑設(shè)計(jì)創(chuàng)意大賽參賽合同2篇
- 2025年新型農(nóng)業(yè)技術(shù)培訓(xùn)合同范本3篇
- 2025年度定制化鋁材加工與銷售一體化合同4篇
- 獵聘-2024高校畢業(yè)生就業(yè)數(shù)據(jù)報(bào)告
- 2024虛擬現(xiàn)實(shí)產(chǎn)業(yè)布局白皮書
- 車站值班員(中級(jí))鐵路職業(yè)技能鑒定考試題及答案
- JTG∕T E61-2014 公路路面技術(shù)狀況自動(dòng)化檢測(cè)規(guī)程
- 高中英語(yǔ)短語(yǔ)大全(打印版)
- 軟件研發(fā)安全管理制度
- 三位數(shù)除以兩位數(shù)-豎式運(yùn)算300題
- 寺院消防安全培訓(xùn)課件
- 比摩阻-管徑-流量計(jì)算公式
- GB/T 42430-2023血液、尿液中乙醇、甲醇、正丙醇、丙酮、異丙醇和正丁醇檢驗(yàn)
- 五年級(jí)數(shù)學(xué)應(yīng)用題100道
評(píng)論
0/150
提交評(píng)論