1. 程式人生 > >用更通俗的方式來教你理解剛體和碰撞體

用更通俗的方式來教你理解剛體和碰撞體

對於剛接觸Unity3D的新手,部分人會在3D的物理元件的理解中弄混剛體(rigidbody)和碰撞體(collider)這兩者。網路上很多相關文章,個人認為邏輯條理清晰,但推薦給別人後仍然會有人說沒有很大幫助。究其原因,應該是大部分文章是以unity中元件的特性和用法為基礎去解釋兩者,對讀者的unity基礎有一定要求。最近向別人解釋時突然想出一個以人對現實世界的理解為基礎的解釋方法,在此記錄分享給大家。

首先,為了更好地解釋這兩個元件對物體的模擬,我們從一些更容易理解的元件來看看一個物體的構成:

Transform:
在Unity3D中,一個空的GameObject是隻有Transform資訊的,記錄該物體的 位置資訊


Renderer:
當一個GameObject擁有了Renderer(以及它所依賴的MeshFilter和Material等),它就會顯示在我們的場景當中,表現的就是該物體有 視覺資訊

這時想象你站在該物體的附近,如果你面向該物體的位置(Transform),你就可以看到該物體在你眼前(Renderer)。但如果這時你情不自禁想伸手去摸,你是不會打到前排觀眾的頭造成糾紛的。

Collider:
我們給當前的GameObject再加上一個Collider元件(或者新建一個Cube,該GameObject會包含Transform、MeshFilter、Collider、MeshRenderer這四個元件),這時該物體就有了 空間佔位資訊

這時你再伸手去摸,你會發現你可以觸碰到該物體了。但是在現實中,一個物體是會受到重力影響向下落的,或者這是一張放在桌上的鈔票,你會發現你無法將它拿起並放入口袋。

Rigidbody
我們再給該物體加上Rigidbody元件,這時該物體就有了質量、速度、移動方向等 質能資訊,並可以響應外界的物理影響。

這時的鈔票,你就可以看到它、碰到它、撿起它了。

綜上,在“Collider”和“Rigidbody”的區分中引入第三者“Renderer”,它們就構成了模擬一個物體所需要三個基礎特性:看不看得見-Renderer,摸不摸得著-Collider,挪不挪得動-Rigidbody

當然,這三者均不是必要的,下面我們來探討一下不同東西的不同構成:

  1. “我上面有人”——該說法理解起來不難,你“上面”有人(別汙)?我既看不見又摸不著,還不能把它從你上面踢下來。那麼這就是一個看不見(沒有Renderer)、摸不著(沒有Collider)、挪不動(沒有Rigidbody)的物體
  2. “我左眼看到鬼”——這個就簡單了,你看到了鬼,但是你摸不著它也挪不動它,鬼又是可以飄的,所以它是一個有Renderer、沒有Collider、沒有Rigidbody的物體
  3. “釘子戶”——這個是送分題,你看得見,摸的著,但是你只能靠拆遷(Transform.position)才能挪動,所以它是一個有Renderer,有Collider,沒有Rigidbody的物體
  4. 本來想找個有Renderer,有Rigidbody,沒有Collider的現例項子,但是好像不可能??

  5. “你瞅啥”,“瞅你咋地”,“你給我起開”,“呵就你個小身板還撞我”——這就有點難了,很明顯,兩個人互相“瞅”不順眼,所以有Renderer,“你給我起開”說明是被擋了道,所以有Collider,但是其中一個“挪不動”另一個,那是不是就代表它沒有Rigidbody呢?其實不然,在Rigidbody裡會有個IsKinematic(運動學物體),怎麼理解呢,就是你可以用程式碼給它施力(Rigidbody.AddForce),但是它是不會響應別的物理碰撞的-“呵就你個小身板還撞我”。所以,這是兩個有Renderer,有Collider,有Rigidbody的東西,只是其中一個勾選了IsKinematic而已

以上就是從現實世界理解的Renderer、Collider和Rigidbody,日後有時間會補充OnCollider和OnTrigger這兩個MonoBehaviour的Message和這兩個元件的關係。