資源簡介
Unity3d中的碰撞檢測教程.最新最詳細!!!!
其中綠色的中方體是 ,藍色的是 ,黃灰色的是 至此,我們最初的測試場 景就搭建好了,下面,我們來編寫腳本來驗證我們的推斷了。首先,我們驗證一下碰撞檢測。 代碼如下: 將要碰撞到的 碰撞到的物體的名字是: 將 從 面板上拖拽到腳本中的選項中。 這段代碼并不難理解,就是 一直向右移動時與 發生碰撞產生碰撞信息,打印碰 撞到的物體的名字 可現實總是那么的殘酷,這個碰撞信息就一直沒打印出來。哎,到底問題出在哪呢?這時 我們就需要完善的了解一下有關碰揎器方面的知識啊。我把我們還得了解的概念列舉如下: 靜態碰撞器 指的是沒有附加剛體而附加了碰撞器的游戲對象。這類對象會保持靜止或很輕微的移動。這對 于環境模型十分好用,比如剛體和墻面碰撞時而不會移動 剛體碰撞器 指的是附加了剛體和碰撞器的游戲對象 運動學剛體碰撞器 在第點得基礎上勾選了剛體組件中的 屬性,如果要移動這類對象,就只能修改 它的 而不是用力。這類游戲對象還有許多其他的獨特的使用情景。 這三種碰撞器如果勾選了 復選框,就變成了相應的觸發器了。 這是我在文檔上截下來的一個圖,如果讀者覺得英文看起來吃力的話,就可以到圣典上 去看翻譯的文檔。 Collision detection occurs and messages are sent upon collision Istatic Collide Rigidbody Colli derkinematic Static Rigidbody Rigidbody ColliderTrigger CollideTrigger Collide Static Collider Rigidbody Collider Kinematic Rigidbody Collider Y static T rigger collider Rigidbody Trigger Collider Kinematic Rigidbody Trigger Collider Trigger messages are sent upon collision Static ColliderRigidbody Colliderkinematic Static Rigidbod Rigidbody CollidefTrigger ColliderTrigger ColliderTri static Collider Rigidbody Collider Kinematic Rigidbody Collider Static Trigger collider Rigidbody Trigger Collider YYYYYY Kinematic Rigidbody Trigger Collide Y Y Y 這個表里面包含了檢測到碰撞信息所必要的碰撞組合:從表中可以看出,兩個碰撞器要想檢測 到碰撞信息,至少有一個是 。這個就是我們剛才失敗的關鍵。我們回到 編輯器中,驗證一下我們的猜想。我們先給 添加剛體組件。沒想到控制臺打印了 如下語句: 目 Console Clear Collapse Clear on play Error pause Open Editor Lo g 碰撞到的物體的名字是:Pane Unity Engine, Debug: Log(object) ①到的物體的名宰是Cu曰 Ity Engi ogO 不過,這也是必須的,那么,我們將剛體組件附加在 而不是 上呢?我們發現, 控制臺上沒有打印任何語句,此時,我們可以得出如卜結論:兩個物體發生碰撞,如果要檢測 到碰撞信息,那么其中必有一個物體既帶有碰撞器,又帶有剛體,且檢測碰撞信息的腳本必須 附著在帶有剛體的碰撞器上。 到此我們就可以結束碰撞信息的檢測了,剩下的個函數就由讀者自行驗證一下。下面我們來 驗證觸發信息檢測。我們新建一個腳本,代碼如下 碰撞到的物體的名字是 我們設置為剛體碰撞器注意,此時得將剛體組件中的 復選框的勾選去掉 然后勾選碰撞器組件中的 復選框。然后我們將此胭本拖拽到 上:面,然后將 從 面板上拖拽到腳本中的選項中。運行…下,果然有成功了: 目 Console Clear Collapse Clear on play Error pause 碰撞到的物體的名字是:cube2 Unity Engine Debug: Log(object) 此時,我們將腳木拖給 而不拖給 時,我們的結果和上次一樣,沒有檢測到觸發 信息。因此,我們可以得出這樣一個結論:兩個 發生碰撞,要想檢測到觸發信息 最少要有一個剛體碰撞器并且勾選了 復選框,另一個最少要有一個碰撞器組件,此 時檢測碰撞的腳本必須附加在那個帶有剛體的觸發器上。 至此,觸發信息的檢測我們也實現了。剩下的兩個函數留給讀者自行驗證。但是,由于兩組函 數中的參數的類型不同,我們可以通過這些參數得到一些信息。比如 里面的 參數類型是: 根據這個參數,我們可以求得一些東西,比如接觸點,具體可以看 文檔關于 這一章,里面有一個變量 又比如 這個函數,參數類型為 我們可以取得這個對象的 這 個屬性,也就是物理材質。 現在我們可以打開剛才那個官方的場景,可以在那些個剛體上綁定一個碰撞檢測的腳本, 然后就可以用鼠標讓它與其他物體進行碰撞,可以從控制臺上打印碰撞到的物體的名字。好了 點了,困了,下一篇,我會介紹 方面的碰撞,這里面包含攝像頭的碰撞檢測, 并且會以這個官方的工程作為試驗平臺,敬請期待。 上一篇我們了解了 里面的碰撞檢測的兩種方式,都能夠很好的解決特定情形下的相關問 題。這一話我緊接著介紹 (層蒙版)的應用,主要用在鏡頭穿墻上面。但是前提是 讀者對里面的射線的應用有一個清楚的認識。 !射線,這并不是里面獨有的工具,其應用非常之廣,而且此工具及其易用。 利用它,你能極其快速的解決·些棘手的問題,比方說:鼠標點擊屏幕,主角朝向鼠標點擊的 世界方向運動。此時,如果不利用射線的話,實現方式不會簡單,特別是主角的運動方向的確 定。好了,不費話了,看: 我來用我自己理解的方式翻譯一下 個射線是無限長的。它靠個原點 類型和個方向 類型 決定。這是當然的,只需這兩點,就能在一個三維空間確定一條射線。我們來看一下它的構造 方法 Ray. Ray static function Ray (origin: Vector, direction: Vector): Ray 官方給出的實例化一條射線的代碼 using Unityengine: using System. Collections public class example i Mono Behaviour i public Ray ray new Ray(transform position transform forw ard) 看了這個之后,我們實例化一條射線就沒問題了吧,注意:上面代碼中的: 指的是該腳木綁定的 自身坐標系下的軸在世界坐標系下的單位方向向量。 我們來看一下它的兩個變量 Variables orIgIn The origin point of the ray direction The direction of the ray 這兩個東西我們從名字上面就能看出是什么,單詞不認識的可以開有道。但是作為一個文化人 這種基本的單詞應該記下來,我說的對吧! 好了,該看看函數了 RaySetPoint function Getpoint (distance float); vector Description Returns a point at distance units along the ray 這個函數的功能是取得該射線從原點到距離為 的個點的坐標。 Ray ToString function To string (: String function To string (format String): string Description Returns a nicely formatted string for this ray Ray Tostring function To String (: String fuNction ToString (format String]: string Description Returns a nicely formatted string for this ray 這個函數用的不多,功能比較簡單:打印一條射線的基本信息,讀者可以試著打印一下,就像 里面直接用 打印一個對象得出一個哈希碼一樣。 接下來我們該看看一個非常重要的類了 ,這個類里面的方法很多說實話,我只用過 個,求們重點看下面一個 Physics. Raycast 由于這個函數有好幾個重載方法,我們今天僅介紹下面這個重載方法: static function Raycast (origin: Vector3, direction: Vector3, out hitlnfo RaycastHit, distance: float= Mathf Infinity, la Parameters ongin The starting point of the ray in world coordinates direction The direction of the ray. distance The length of the ray fitinto If true is returned hitinfo will contain more information about whe laver Mask A Layer mask that is used to selectively ignore colliders when ci 我們可以清楚地看出 這個方法里面的前兩個和里的構造函數一模一樣,這兩者之間好像有著某種聯系。這是必 然的,因為還有下面這個重載函數 static function Raycast (ray: Ray, distance: float= Mathf nfinity, layerMask: int=kDefaultRaycastLayers): boolean 看到沒,很坑吧。不過,這也是的一個亮點,多樣化。兩個方法的底層實現是一樣的 下面我來著重介紹這幾個參數的意義 就不用介紹了吧,一個是原點,一個是方向。第三個從字面上理解是距離, 第四個是射線的碰撞信息類,里面包含很多我們可以得到的信息,第五個就是我們今天必須理 解的一個很實用的工具 層蒙版 這個函數的功能按我的理解是這樣的:以點為原點, 為方向,在世界空間中發 射射線,如果在 距離內與其他在 層級之中的 發 生碰撞,那么此函數就返回,并且記錄碰撞信息。 那么什么是 呢?我們打開 隨便找一個 ,哪怕是空的 ,你都會發現這樣一個顯示圖標: B Inspecto CameraTarget static w Tag Untagged Layer Default 看到沒?有個 我們試著單擊一下這個下拉框: Transform y rivet TtwhiparwhL Igor+ Eaea Estreat 414 不好意思,我截圖的技術真的很爛,但是我們還是可以隱隱約約看到有好幾個選項可供選擇 如: 尊,那么這到底有什么用呢 原來, 再設計 時,對 的做了一種分層的處理。舉個例子吧: 我們選中任意一個攝像機:可以在 面板中找到這樣一項: Background Culling mask verything Projection Perspective ,又出現了一個,這和 又有什么聯系呢?算了,我直接說吧:默 認情況下攝像機可以渲染任何層級中的 ,但當我們在 中有層沒選 那么攝像機在渲染時,就不會渲染這一層的物休, 視圖也就不會出現處在這一層的
代碼片段和文件信息
- 上一篇:實分析(Royden)習題全解
- 下一篇:Landsat5TM輻射定標和大氣校正
評論
共有 條評論