U3D角色動畫

Sam-Cen發表於2017-10-05

1.角色

匯入角色控制器資源,有第一人稱和第三人稱prefab及移動元件。
1)基本的CharacterController
3D角色的旋轉跟著滑鼠軸旋轉。
CharacterController move移動,tr.Rotate旋轉和OnControllerColliderHit 碰撞處理。
Input.GetAxis("Mouse X") 螢幕上從左往右是正值,從右往左是負值。
Input.GetAxis("Mouse Y") 從下往上是正值(希望向天空,所以繞x取負),從上往下是負值(希望向地下,所以繞x去正)
if (axes == RotationAxes.MouseXAndY)
{
float rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX;
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
}
var directionVector = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
motor.inputMoveDirection = transform.rotation * directionVector;
motor.inputJump = Input.GetButton("Jump");
controller = GetComponent (CharacterController);
controller.Move(moveDistance);
tr.Rotate(0, yRotation, 0);
function OnControllerColliderHit (hit : ControllerColliderHit) {
}
var slopeSpeedMultiplier : AnimationCurve = AnimationCurve(Keyframe(-90, 1), Keyframe(0, 1), Keyframe(90, 0));
var movementSlopeAngle = Mathf.Asin(movement.velocity.normalized.y) * Mathf.Rad2Deg;
var maxSpeed *= movement.slopeSpeedMultiplier.Evaluate(movementSlopeAngle);

A CharacterController allows you to easily do movement constrained by collisions without having to deal with a rigidbody.
A CharacterController is not affected by forces and will only move when you call theMove funtion. It will then carry out the movement but be constrained by collisions.
角色往下掉,新增collider底,在CharacterController中調整y值和height值,可以保證不會往下掉。

2.mecanim動畫(avatar對映拖動,IK子到父/Apply root motion, 混合樹引數)

人形角色的簡易的工作流程和動畫創作能力,avatar的建立和肌肉的定義和調整。
支援動畫重定向將一個動畫從一個角色模型應用到另一個角色模型上。
animation clip動畫和過渡的預覽能力, animator複雜動畫互動的視覺化的編輯工具。
通過不同邏輯控制身體不同部位運動的能力。

主要是匯入設定,狀態機,混合樹的編輯,程式碼的控制。
網格模型(法線和紋理),關節層級和關節動畫資訊,網格模型和關節層級關聯起來稱為蒙皮。
匯入時候:分為已分解的動畫,未分解的動畫(需要按+指定start end幀數)。點選模型檔案或點選動畫檔案可以進行編輯。或將動畫片段拖入到animate controller中進行編輯。
avatar:
建立動畫的基本步驟就是將使用者匯入的模型的骨架結構和mecanim預定義的簡單人形骨架結構的對映,該對映稱為avatar, 因為是編輯動畫基於骨骼繫結識別,識別了以後才能進行動畫的編輯。
設定Rig為humanoid,匹配關鍵骨骼匹配成功後有configure打勾顯示,點選可以進行配置。需要調節非關鍵骨骼mapping和肌肉資訊需要手動調整,configure沒有匹配成功也要手動調整avatar,scene檢視中將顯示模型骨骼,肌肉和動畫資訊。
avatar mapping設定:骨骼實心是必選的骨骼,虛心是非必選骨骼。骨骼命名要一致,方便識別。
用左下角的Mapping和Pose命令:
得到模型原始姿勢Pose->Sample Bind Pose。
基於原始姿勢建立一個骨骼對映Mapping->Automap。
強制模型接近T-Pose姿勢Mapping->Enforce T Pose。
如果還是不行,可以自己拖動場景中的hierarchy下模型節點,如LeftLeg到avatar中預定義的骨骼位置
左下的Mapping,有save和load選單,可以對 avatar mapping匹配檔案儲存為.ht檔案,可以載入進來,避免重新拖拽對映(例如對於某個動畫師用他習慣的命名方式製作的動畫)。
Muscles選項卡,U3D通過肌肉來限定不同骨骼的運動範圍,其實調整的是骨骼的運動範圍,可以直接使用reset也可以單獨調整每根骨骼的運動範圍。

Animation選項卡中可以增加Clips調整幀數位置(拖拽綠色則是迴圈前後姿勢旋轉位置匹配),在Mask中humanoid中點選某個模組那麼該動畫clip會遮蔽掉,方便角色持有道具的動畫需求(紅色則是被遮蔽的部分)。可以儲存.mask公用。也可以開啟和關閉IK功能(IK是反向動力學是從子物體驅動父物體的變換,確保所有父物體節點在正確的位置,unity pro版本設定了人形avatar才支援
http://blog.csdn.net/yupu56/article/details/53382046例如握住物體,角色跟隨物體運動。

匯入的角色模型有:模型和avatar, animator, animation clips, charactor controller等。
角色重定向,在都是人形模型動畫前提下,在一個模型中引用另外一個模型的controller資源。

普通生物動畫型別,可以指定root,root用來建立多個animation clip之間的關係和混合,還可以用來區分骨骼動畫和根節點運動具有重要意義(用OnAnimationMove進行控制)。

Scene中:
Animator元件引用動畫控制器/avatar/root motion,包含狀態機,混合樹和指令碼用的Events。
(1) 如果【Apply Root Motion】選中:則角色在原地跑步,且Transform中的值沒有任何變化
( 2) 如果【Apply Root Motion】選中:則角色在場景中跑步,且Transform中的值跟隨變化 
cull mode用base on rendereds是在角色看不見時候,只有根節點運動,其它節點不運動,有利於提高效能。
Animator視窗中:
Animator controller引數,動畫狀態包括速度和animation clip引用(可以通過匯入的模型檔案下animation頁籤進行處理),IK設定。過渡條件如果是時間那麼0.9是前面動畫播放到90%時候進行切換,如果是其它過渡條件在程式碼中設定即可進行切換。拖動兩個動畫之間的重疊區域來調節兩個動畫的過渡情況
animator中的引數,除了可以用來做動畫的過渡條件引數,也可以用來做其它的用途(如速度,方向等)。

混合樹,一個動畫狀態,可以混合多個animation clip作為一個動畫狀態,例如混合傾倒和跑步得到角色繞圈跑步的動畫效果。雙擊混合樹狀態進入編輯,可以指定blend type(1D是一個引數,2D是兩個引數一般指運動方向), 控制引數,增加需要混合的多個animation clip引用,拖動紅線控制混合比例引數,點選下方的播放預覽效果,得到自己需要的控制引數後儲存或在程式碼中呼叫改變即可。

實踐:模型的動畫匯入需要在資源檢視中選中模型進行編輯;animation controller是要手動在project資源檢視中建立的; 混合樹的threshold中的值可以通過去選automate threshold進行編輯。
animator.SetBool("Jump", false);
animator.SetBool("Hi", !animator.GetBool("Hi"));
animator.SetFloat("Speed", h*h+v*v);
animator.SetFloat("Direction", h, DirectionDampTime, Time.deltaTime);
animator.SetTrigger("xxx", true);

或:
privateint jump = Animator.StringToHash("Jump");
privateint runState = Animator.StringToHash("Base Layer.Run");
_animator.SetTrigger(jump); // 通過id而不是字串可以提高效能
在Unity5.0中,我們可以給Animator Controller中的每個State新增指令碼了,類似於專門用於GameObject的MonoBehavior,State可以新增State Machine Behavior,也可以在動畫層上新增
publicclass StateScript : StateMachineBehaviour
{
}
unity5中還可以設定動畫的過渡是否可以中斷,是否可以直接跳轉到下一個狀態還是要等待播放完畢。
層級控制是為了使用avatar mask的,層級weight是類似混合的動畫的效果。
AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);
if (stateInfo.IsName("Base Layer.Run"))
{
預設的Base Layer必須為1。如果設定為0則當前層的動畫不會播放,1則會播放,0-1之間會採用類似融合的情況來播放動畫,比如之前的招手的例子,如果設定為0.5則招手動畫播放時手部只會抬到脖子附近。
動畫混合方式:
  • Override:覆蓋,表示當前層的動畫會覆蓋掉其它層的動畫,比如招手播放時右手就不能播放其它的動畫了;
  • Additive:新增,表示當前層的動畫的量新增到其它層的動畫,比如招手播放時,手部奔跑或站立的甩動也會保留;
Sync是同步複製其它層的效果。
使用動畫片斷混合和動畫層混合結合avatar mask可以做出複雜的動畫效果

動畫重定向效果,拖入一個新的模型,然後選中匯入為humanoid型別,建立編輯其avatar。將之前編輯好的controller拖入角色的animator controller元件中,就可以進行動畫檔案的複用

avatar是模型骨骼和引擎預定義骨骼之間的對映指定。IK是動畫clip由子到父的順序進行插值運算。混合樹是多個動畫clip之間進行混合(組合)為一個動畫。動畫層次是為了在不同avatar mask下的動畫或在不同的層之間進行動畫的混合(組合)。動畫重定向是動畫控制器的重用,前提是avatar骨骼繫結類似所以一定是人形動畫,主要是動畫狀態過渡條件,混合樹,動畫層次的複用,不同人形模型可以有自己的avatar,動畫層級的avatar mask應該是公用的。

相關文章