Unity3D – Custom Animate Physics Effect

簡介

當我們透過3D軟體製作出的模型與動畫匯入Unity3D時,所有你在3D軟體做的動畫影格設定與Avatar骨架的做動,正常無誤的話當然會正常展示。但是通常我們在製作模擬器場景時,一定要模擬現實世界的重力、碰撞、反作用力等等的物理效果,但是單純的把你的模型匯入是無法達成符合模擬器的物理設定的,必須掛載Unity3D一些相關元件,而這篇我們就要來介紹這些元件的細部介紹。

Collider

在先前很多同仁都介紹過Collider的種類,而這邊我要再介紹一種比較特別的Collider與一些小技巧用在從外部匯入的人物模型掛載Collider並跟隨動畫影格。

我們在製作情境模擬時,想必一定會有人物的元素,通常除了人物之外,都可以使用基本的Collider附加在物件上,例如Box , Mesh 等等的Collider。

而這邊我們來介紹Character Controller,這個元件是Unity專屬給人物模型的Collider + Rigidbody,附著上該元件後,就不需要在加上單獨的Rigidbody,雖然說可能有一些參數無法調整,但也許人物的模型動畫是不需要這些的參數調整。

由於我們沒有要透過使用者輸入指令來控制 ,這邊我們最需要調整的是Center , Radius , Height,讓Gizmo Fit整個人物,簡單設定這樣就可以了。

Script Simulate

而我們套用了該元件後就可以透過程式來控制腳色,這邊提到一個額外模擬物理重力的方法,如下方程式碼:

//這邊不透過Rigidbody可以透過程式來加入重力效果
if (Input.GetKeyUp(KeyCode.Z) && isGrounded)
{
   //計算環境重力
   velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
}

//而這邊是在展示人物的跳躍,放開案件後他會計算下降位置
velocity.y += gravity * Time.deltaTime;
controller.Move(velocity * Time.deltaTime);

PS. 上述的Character Controller雖然有了一些好處,但是在模擬器中,是撥放設定好的影格,所以必須要在你的人物掛載另一個Collider,這邊用意是要讓人物與世界有碰撞的效果。然而Collider掛載在不正確的地方,人物可能只會在第一個影格有碰撞效果,動畫展演時就不會跟著腳色移動了。

這邊我們在人物掛載Capsule Collider,通常我們會掛載在人物物件的最上層,可以看看示意影片,Collider卻無法跟上腳色動畫。

接著我們把Collider移到附著在人物骨架上,如此一來結合 Character Controller + Capsule Collider就可以擁有在模擬場景中有物理、碰撞效果並跟隨著物件影格作展演。

Animator Property

在本篇的第二部分要講到動畫相關與環境脣齒相依的元件Animator,如上圖,第一與第二項是大家眾所皆知的功能與應用,但後面三項打勾的是較容易忽略的,這是我應用在環境物理效果時才發掘的,我們先看看個別是在代表什麼。

Apply Root Motion : 這個選項很重要,在於你的角色動畫是否要與目前環境結合,沒打勾的話就會它展演他自己的,而且你設定再多Collider , Rigidbody都不會有效果,通常把物件移動在半空中效果更明顯,可以看一下示意影片。

Update Mode :

這個選項是在控制Animator的時間單位,設定你Animator要用怎樣的時間範圍來展示。

Normal:
Animator與Update同步,這邊的Update就是Unity生命週期的每個偵數都執行。假如你透過Animator修改了撥放速度,則其中的Animation皆會一起做動。

Animate Physics:
Animator與FixUpdate同步,FixUpdate是比Update執行偵數還要少,假如5秒內Update會執行的次數有300次、FixUpdate大概就是50次之類的。這邊有個重點,你的動畫物件想要跟環境做動的話,就要選擇該選項,且物件要掛載上Rigidbody。

Unscaled Time:
Animator會與Update調用同步更新,但是Animator的速度會忽略當前的時間範圍,並且會以100%的速度動畫 ,所以調整撥放速度在此模式是無效的。該模式比較常用再2D/GUI的動畫展演。

Culling Mode :

改選像是在於那些Animation需要遮蔽剔除的模式。假設你也寫類似的程式碼,才需要做此區的設定。

Always Animate:
預設為該模式,每個Animation都會正常運行,並不會被屏蔽。

Cull Update Transforms:
假如MeshRenderer無效時,就會將IK與物件位置重新定位且不能做動。

Cull Completely:
當你物件上的MeshRenderer不見時,該動畫就停止撥放。

小結

這篇比較像經驗紀錄,總結一下,假如你遇到妳自己做的模型與動畫影格要跟Unity環境融合並有物理效果:
●人物類Collider+Rigidbody:
你必須在你的人物角色骨架上放上Collider,讓你的角色在撥放動畫時隨時擁有可以計算物理效果的觸發器,並且在物件最上層可以掛載Character Controller,假如要做更細部設定就掛載Rigidbody。
● 物體類 Collider+Rigidbody: :
你可以在創建一個空物件放置Collider,有時候附著在最上層可能會無法作動。
● 兩者的Animator:
請把Apply Root Motion打勾、Update Mode請選擇Animate Physics、Culling Mode就選擇預設的Always Animate。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *