Unity 3D 角色動畫 教學 (附加程式碼)

上一篇主題 下一篇主題 向下

Unity 3D 角色動畫 教學 (附加程式碼)

發表  aaa1218bbb 于 周五 11月 25, 2011 8:54 am


官方原文 : http://unity3d.com/support/documentation/Manual/Animation%20Scripting.html


翻譯中文教學 :

角色動畫

Unity手冊> 使用指南> 創建遊戲> 角色動畫

Unity的動畫系統允許你創建漂亮的動畫角色.動畫系統支持動畫合成,混合,添加動畫,步調週期時間同步,動畫層,控制所有方面的動畫回放(時間,速度,混合-偏重),網格面每個三角有1,2或4個骨骼,且完成基本的物理玩偶.
這裡有一些最好的方法創建一個裝配好的角色在Unity獲得最好的展示.推薦你閱讀下Modeling Optimized Characters頁面上的教程。
製作一個動畫角色需要2個東西;移動他在世界中和做相應的動作.
這個頁面致力於動畫.如果你想要學習更多關於移動角色的(為一個超級瑪麗風格遊戲或第一人稱射擊),查看Character Controller page.
如果你喜歡,直接跳到一個在這個頁面的標題:
輸入角色動畫
動畫片段
多個文件
反向運動
插入Unity場景
使角色做動作
動畫混合
動畫層
添加動畫
你能在here下載演示動畫角色設置的例子example demo。

輸入動畫

首先我們輸入動畫。 Unity支持輸入Maya (.mb or .ma)文件, Cinema 4D (.c4d)文件,和fbx文件,這些能輸出為很多動畫包.點擊這裡學習怎樣輸出模型/動畫包export from your modelling/animation package.

輸出動畫使用動畫片段
最方便的製作動畫的方法是使用單一的模型包含所有的動畫.當輸入動畫模型,你能定義每部分動畫的幀.Unity將自動把動畫片段分成單個動作部分,名為動畫片段Animation Clips.

例如:
走路動畫在幀1 -33
跑步動畫在幀41 – 57
踢的動畫在幀81 - 97

輸入動畫你可以直接放置他到工程裡的Assets文件夾.Unity將自動輸入他.突出顯示他在工程視圖和編輯輸入設置在檢視視圖.
一個模型的輸入設置對話框
在輸入設置, Split Animations表是告訴Unity你的資源文件的哪些幀是表示哪些動畫片段的.你指定在這裡的名字在你的遊戲使用觸發他們.

名字 定義Unity裡動畫片段的名字.
起始幀動畫的起始幀.幀數值和創建動畫的3D程序使用相同的幀.
終止幀 動畫的終止幀
循環幀如果激活,額外的循環幀插入到動畫的最後.這個幀匹配片段的起始幀.如果你想要製作一個循環動畫和起始&終止幀不是很準確的匹配時.
輸入動畫使用多個模型文件
另一個輸入動畫的方法是在動畫名後面加@.你創建單獨的模型文件和使用這種命名方法'模型名字'@'動畫名字'.fbx
有4個動畫文件的動畫角色例子
Unity自動輸入所有4個文件並收集所有動畫到沒有@標籤的文件.在上面的例子裡, goober.mb將自動建立空閒,跳躍,走路和翻牆的引用.
輸入反向運動
當輸入動畫角色使用Maya會創建使用IK,你可以檢查Bake IK & simulation盒在輸入設定.否則你的角色將不能正常運動.
放置角色到場景
當你輸入模型後,拖拽物體從工程視圖到場景視圖或層次視圖.
動畫角色通過拖拽添加到場景
上面角色的三個動作列表不是缺省動作.你能添加更多動畫到角色通過在工程視圖的角色中拖拽動畫片段(到層次或場景視圖).這也將設置缺省動畫.當你按下運行,缺省動畫將運行.
提示:你能使用這個快速測試,如果你的動畫重播正常.也可使用卷模式Wrap Mode觀察不同的動畫行為.特別是循環.

使角色動起來

真實的角色動畫使用Unity腳本接口執行.

動畫合成

現在的遊戲,動畫合成是一個必不可少的特徵為確保角色有平滑的動畫.動畫師創建單個動畫,如走路循環,跑步循環,空閒動畫或射擊動畫.有些時候你的遊戲需要能轉換空閒動畫到走路循環或反之.當然你不想要在運動中有突然的跳躍,你想要動畫平滑轉換.

這就是動畫合成到來的原因.在Unity你能在同一個角色身上有任意多個動畫播放.所有的動畫合成或添加到一起產生最終動畫.

我們的第一步是使角色平穩合成空閒和走路動畫.為了做這個我們使用簡單的腳本,我們首先設置卷模式Wrap Mode的動畫循環Loop.接著我們關閉自動播放使我們的腳本只有一個正在演奏的動畫.

我們的第一個角色動畫腳本十分簡單;我們值需要一些方法知道我們的動畫運行的速度,再減退走路和空閒動畫.為了這個簡單的測試我們使用pre-setup輸入軸.
function Update ()
{
if (Input.GetAxis("Vertical") > 0.2)
animation.CrossFade ("walk");
else
animation.CrossFade ("idle");
}
To get this script running:
使這個腳本運行:
創建javascript使用Assets->Create Other->Javascript.
複製粘貼代碼進入
拖拽腳本到角色(需要有一個同樣動畫的GameObject)
當你按下運行按鈕,且按下向上鍵角色將開始走路,釋放他又回到空閒狀態.

動畫層

層是一個非常有用的概念,它允許你分組動畫和區分權重.在Unity動畫系統,你能混合你想要的任意多的動畫片段.你能手動地指定混合權重或簡單的使用animation.CrossFade( ),這是動畫的自動權重.
Blend weights are always normalized before being applied
正常情況下混合權重總是在被應用之前使用
我們假定你有一個走路循環和一個跑步循環,每個都有權重為1(100%).當Unity產生最終動畫他將恢復正常權重,意思是走路貢獻為50%動畫,跑步也貢獻50%.
這很好,但是有時你想要區分2個同時播放的動畫哪一個有更多的權重.當然你要確保權重之和為100%,但是他使用層次可以很容易的達到這個目的.

層次例子
一個例子,你可能有一個射擊動畫,一個空閒和走路循環.你將想要基於玩家的速度逐漸褪去走路和空閒的動畫.但是當玩家開火你想要值展示開火動畫.因此開火動畫本質上有更高的權力.

簡單的方法是在開火時保持走路和空閒動畫.這樣我們需要使開火的動畫層次高於空閒和走路.意思是射擊動畫將有最高權重.走路和空閒動畫只有在射擊動畫不使用100%混合權重使才能接收權重.所以當射擊動畫在CrossFading裡,權重將從0開始一會到達100%.開始時走路和空閒層次將仍然接收混合權重,直到射擊動畫完成逐漸增強,他們將不接收權重.我們需要嚴格執行!
function Start ()
{
// Set all animations to loop設置所有動畫為循環狀態
animation.wrapMode = WrapMode.Loop;
// except shooting除了射擊
animation["shoot"].wrapMode = WrapMode.Once;
// Put idle and walk into lower layers (The default layer is always 0)放置空閒和走路到底層次(缺省為0)
// This will do two things這裡做2件事
// Since shoot and idle/walk are in different layers they will not affect射擊和空閒/走路在不同層次沒影響
// each other's playback when calling CrossFade.當呼叫CrossFade重放每個
// Since shoot is in a higher layer, the animation will replace idle/walk射擊在高層次,他取代空閒和走路
// animations when faded in.動畫將逐漸增強
animation["shoot"].layer = 1;
// Stop animations that are already playing停止動畫確實在演奏時
//(In case user forgot to disable play automatically)別忘了關閉自動播放
animation.Stop();
}
function Update () {
// Based on the key that is pressed,基於按下鍵
// play the walk animation or the idle animation演奏走路或空閒動畫
if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1)
animation.CrossFade("walk");
else
animation.CrossFade("idle");
// Shoot射擊
if (Input.GetButtonDown ("Fire1"))
animation.CrossFade("shoot");
}
缺省的animation.Play()和animation.CrossFade() 將停止或減弱動畫在相同的層次.你想要避免這是嚴格的.在我們的射擊,空閒,跑步例子,演奏空閒和跑步將不影響射擊動畫反之也可以(你可以改變行為通過設置一個參數給animation.CrossFade如果你想).

添加動畫和動畫混合

添加動畫和動畫混合允許你減少你創建的遊戲的動畫數量,且很重要的創建面部動畫.
我們假設你想要創建一個角色傾向一邊當跑步和轉彎時.
你已經有了走路和跑步循環,現在你要製作單獨的左傾向走,右傾向走,左傾向跑,右傾向跑動畫.
但是這樣意味著你有翻倍數量的動畫工作!創建一個龐大的動畫數量不是可取的.添加動畫和混合能解決!

添加動畫例子
添加動畫允許你覆蓋動畫效果到另一個之上播放.當使用添加動畫,Unity將計算動畫片段的第一幀和現在幀的不同.接著他將應用這種不同到所有其他動畫上.
現在你值有偏左和偏右動畫.Unity將放置這個動畫層次高於走路,空閒或跑步循環.
這是製造這些的代碼:
private var leanLeft : AnimationState;
private var leanRight : AnimationState;
function Start ()
{
leanLeft = animation["leanLeft"];
leanRight = animation["leanRight"];
// Put the leaning animation in a seperate layer設置偏向動畫在指定層
// So that other calls to CrossFade won't affect it.所有呼叫CrossFade不會影響他
leanLeft.layer = 10;
leanRight.layer = 10;
// Set the lean animation to be additive設置偏向動畫為添加物
leanLeft.blendMode = AnimationBlendMode.Additive;
leanRight.blendMode = AnimationBlendMode.Additive;
// Set the lean animation ClampForever設置偏向動畫ClampForever
// With ClampForever animation's will not automatically設置ClampForever動畫不自動播放
// stop when reaching the end of the clip停止當到片段最後
leanLeft.wrapMode = WrapMode.ClampForever;
leanRight.wrapMode = WrapMode.ClampForever;
// Enable the animation and fade it in completely激活動畫和逐漸增強到完全
// We don't use animation.Play here because we manually adjust the time我們不使用animation.Play因為要手動調整時間
// in the Update function.在Update函數里
// Instead we just enable the animation and set it to full weight替代我們激活的動畫和設置他為完全權重
leanRight.enabled = true;
leanLeft.enabled = true;
leanRight.weight = 1.0;
leanLeft.weight = 1.0;
// For testing just play run animation and loop it嘗試運行動畫和循環他
animation["walk"].wrapMode = WrapMode.Loop;
animation.Play("walk");
}
// Every frame just set the normalized time每幀設置為正常時間
// based on how much lean we want to apply基於我們要應用的偏向有多少
function Update ()
{
var lean = Input.GetAxis("Horizo​​ntal");
// normalizedTime is 0 at the first frame and 1 at the last frame in the clip 。 normalizedTime在片段的第一幀為0和在最後幀為1
leanLeft.normalizedTime = -lean;
leanRight.normalizedTime = lean;
}

建議:當使用添加動畫,關鍵是你既要使用沒有添加動畫在每個改變,又要使用添加動畫,不同的是動畫將在最後幀的結果上.這必然不是你想要的.

程序控制動畫角色

有時你想要拉動你的角色骨骼通過程序.例如你可能想要你的角色的頭看向3D空間的某點.這用腳本很好解決.幸好,Unity做這個很簡單.在Unity所有的骨骼是改變驅使表皮網格.因此你能腳本骨骼角色,像其他遊戲物體一樣.

要知道的一個很重要的事情是動畫系統是在Update()函數之後更新改變,和在LateUpdate()函數之前被呼叫.因此如果你想要使用LookAt()函數,你要讓他在LateUpdate()裡面,以確保你的動畫確實高於一切.
玩偶被創建有相同的方式.你直接附上剛體,角色聯合和碰撞倉給不同的骨骼.這將為身體動畫你的表皮角色.

最後
你已經學習怎樣創建一個基本的角色動畫,請看projects裡的深入角色動畫例子和animation script interface.

_________________
歡迎大家多多交流~

avatar
aaa1218bbb
社員
社員

文章數 : 65
積分 : 2355
注冊日期 : 2011-11-22

檢視會員個人資料 http://design.gugebb.com

回頂端 向下

上一篇主題 下一篇主題 回頂端


 
這個論壇的權限:
無法 在這個版面回復文章