日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity流水账4:动画

發布時間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity流水账4:动画 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、Animation
??Unity的動畫特性包括可重定向動畫,在運行時控制動畫權重,動畫播放時的事件調用,復雜的狀態機Hierarchies和動畫間的過渡、面部動畫的blendshape等等。

1.動畫系統概述
??Unity有一個復雜而豐富的動畫系統(有時被稱為Mecanim).它提供了:

·簡單的工作流以及Unity所有元素的動畫設置,包括對象,角色和屬性。 ·支持在unity中導入Animation clips以及創建Animation ·Humanoid animation retargeting--將動畫從一個角色模型應用到另一個角色模型的能力 ·簡單的工作流用于調整Animation clips ·可以方便的預覽Animation clips,以及動畫間的過渡和交互。這允許動畫師更加獨立于程序員工作,可以在游戲運行代碼前,預覽和創建動畫原型。 ·使用可視化編程工具管理動畫之間復雜的交互 ·用不同的邏輯驅動不同的動畫 ·Layers以及masking特性

(1).動畫工作流程
??Unity的動畫系統是基于Animation Clips的概念,它包含某些對象如何隨著時間改變位置、旋轉或其他屬性的信息。每一個clip可以被認為是單個線性記錄。來自外部源的Animation Clips是由藝術家或動畫師使用第三方工具,如Autodesk 3dsMax,Autodesk Maya,或者來自動作捕捉工作室以及其他來源。
??然后將Animator Clips組織成一個類似結構的流程圖系統,稱為Animator Controller。Animator Controller充當“狀態機”,用于跟蹤當前正在播放的剪輯,以及動畫何時應該更改或混合在一起。
??一個非常簡單的Animator Controller可能只包含一個或兩個Animator clips,例如控制一個向上旋轉和跳躍,或者在正確的時間激活一個打開和關閉門的動畫。一個更高級的動畫可能包含幾十個Humanoid動畫,用于所有主要角色的動作,并且可以同時在多個clips之間進行混合,以提供流暢的動作,當玩家在場景中移動時。
??Unity的動畫系統還具有許多用于處理Humanoid動畫的特殊功能,讓你能夠從任何來源(例如:動畫捕捉,Asset Store或者其他一些第三方動畫庫)將Humanoid動畫重新定位到你自己的角色模型,以及調整肌肉定義。這些特殊的特性是由Unity的Avatar系統所支持的,它將Humanoid角色映射到一個通用的內部格式。
??每一個Animation Clips,Animator Controller以及Avatar都通過Animator組件放在一個游戲對象上。該組件引用了Animator Controller,并且(如果需要的話)可以引用這個模型的Avatar。反過來,Animator Controller包含了對它所使用的Animation Clips的引用。

上面的圖顯示了以下內容:

1.Animation clips是從外部源導入或在Unity中創建。在這個例子中,他們是導入動作捕捉的Humanoid動畫。 2.Animation clips被放置并安排在一個Animation Controller中.這顯示在Animator窗口的Animator Controller視圖中。狀態(可以表示動畫或嵌套的子狀態機)顯示為由線連接的節點。Animator Controller作為項目窗口中的一種asset存在。 3.被裝配的角色模型(在本例中,宇航員"Astrella")具有特定的骨骼結構,這些骨骼被映射到Unity的通用Avatar格式。該映射作為導入的角色模型的一部分存儲為Avatar asset,并顯示在項目窗口中。 4.如果角色模型有動畫,它會有一個Animator組件。在上面顯示的Inspector視圖中,你可以看到Animator組件既有Animator Controller也有指定的Avatar.animator。動畫師一起使用它們來為模型制作動畫。Avatar只在humanoid角色動畫中是必要的,對于其他類型的動畫,只需要animator controller.

(2).傳統動畫系統
??雖然建議大多數情況下使用Mecanim,但unity保留了其在Unity4之前存在的傳統動畫。使用Unity4之前創建的舊內容時可能需要使用。

2.Animation Clips
??Animation是Unity動畫系統的核心元素之一。Unity支持從外部源導入動畫,并提供使用Animation窗口在編輯器中從頭開始創建Animation clips的功能。
(1).外部來源的動畫
??從外部來源導入的Animation clips可以包括:

·在一個動畫捕捉工作室拍攝的Humanoid動畫 ·藝術家在外部3D應用程序(例如Autodesk 3dsMax、Autodesk Maya)中從頭開始創建動畫。 ·來自3rd-party庫的動畫集(例如:來自Unity的asset store) ·從單個導入的timeline上剪切和切片多個剪輯

(2).在unity中創建和編輯動畫
??Unity的動畫窗口還允許你創建和編輯Animation clips.這些clips可以編輯:

·GameObject的position,rotation以及scale ·組件的屬性,例如:材質的顏色,光的強度,以及聲音的音量 ·你自己腳本中的屬性,包括float,int,enum,vector以及bool變量 ·在你自己的腳本中調用函數的時間

3.外部來源的動畫
??來自外部源的動畫以與常規3D文件相同的方式導入到unity中。這些文件,無論是通用的FBX文件,還是來自3D軟件的原生格式,如 Autodesk Maya,Cinema 4D,Autodesk 3ds Max,都可以包含動畫數據,以線性記錄對象移動的形式。
??在某些情況下,有動畫的對象(例如,角色)和與之相關的動畫可以出現在同一文件中。在其他情況下,動畫可以存在于一個單獨的文件夾中,不與相關聯的模型放在一起。
??動畫有可能特定于特定模型,并且不能在其他模型上重復使用。例如,游戲中的巨型章魚末端boss可能具有獨特的肢體和骨骼排列,以及它自己的一組動畫。
??在其他情況下,你可能擁有一個動畫庫,可用于場景中的各種不同模型。例如,許多不同的humanoid角色可能都使用相同的走路和跑步動畫。在這些情況下,為了預覽它們,在動畫文件中使用簡單的占位符模型是很常見的。或者,即使它們根本沒有幾何體,也可以使用動畫文件,只有動畫數據。
??導入多個動畫時,動畫可以作為項目文件夾中的單獨文件存在,或者你可以從單個FBX文件中提取多個動畫片段(如果從Motion構建器導出,或者使用Autodesk Maya插件/腳本、Autodesk 3dsMax或其他3D軟件包).如果你的文件包含多個排列在一個時間軸上的單獨動畫時,你可能需要這樣做。例如,一個長時間的動作捕捉的timeline可能包含一些不同的跳躍動作的動畫,你可能希望將其中的某些部分剪切掉以用作單個clips并丟棄其余部分。Unity提供了動畫剪輯工具,當在一個時間軸中導入所有動畫時,通過允許你為每個剪輯選擇幀范圍實現此目的。
(1)導入動畫文件
??在Unity中使用任何動畫之前,必須先將其導入項目中。Unity可以導入原生Autodesk Maya(.mb或.ma),Autodesk 3dsMax(.max)和Cinema 4D(.c4d)文件,以及可從大多數動畫包導出的通用FBX文件。
(2)從導入的動畫文件中查看和復制數據
??你可以在Animation窗口中查看導入的animation clips的關鍵幀和曲線。有時候,如果這些導入的剪輯有很多帶有大量關鍵幀的骨骼,那么信息量可能看起來就會非常復雜。為了簡化視圖,選擇你要檢查的特定骨骼。然后Animation窗口只顯示這些骨骼的關鍵幀和曲線。

??在查看導入的動畫關鍵幀時,動畫窗口提供動畫數據的只讀視圖。要編輯此數據,請在Unity中創建一個新的空Animation Clip,然后從導入的Animation Clip中選擇,復制和粘貼Animation data到新的可寫Animation Clip中。

4.Humanoid Avatars
??Unity的角色動畫系統有專門的功能來處理humanoid角色。因為humanoid角色在游戲中是非常常見的,所以Unity提供了一個專門的工作流,以及一個用于humanoid animations的擴展工具集。
??Avatar系統是Unity用于識別特定動畫模型在布局中是humanoid,模型的哪些部分對應于腿,手臂,頭部和身體。
??由于不同的humanoid角色之間的骨骼結構相似,可以將動畫從一個humanoid角色映射到另一個humanoid角色,從而允許重定向和反向運動學(IK).

5.Animation窗口指導
??Unity中的Animation窗口允許你直接在unity中創建和修改Animation Clips。它旨在作為外部3D動畫程序的強大而直接的替代品。除了移動動畫之外,編輯器還允許你為材質和組件的變量設置動畫,并使用Animation Event(沿時間軸在指定點調用的函數)擴充animation clips。

(1).Animation窗口和Timeline窗口的區別
??TimeLine窗口
????TimeLine窗口允許你創建電影內容,游戲播放序列,音頻序列和復雜的粒子效果。你可以在同一序列中為許多不同的游戲對象制作動畫,例如剪切場景或角色與場景交互的腳本序列。在Timeline窗口中,你可以有多重類型的軌道,每個軌道可以包含多個可以移動,修剪和混合的剪輯。它對于創建需要許多不同的游戲對象一起編排的復雜動畫序列非常有用。
????TimeLine窗口比Animation窗口更新。它被添加到2017.1版本的Unity中,并取代了Animation窗口的一些功能。

??Animation窗口
????Animation窗口允許你創建單獨的animation clips,以及查看導入的animation clips。animation clips存儲單個GameObject或單個 hierarchy GameObjects的動畫。Animation窗口對于在你的游戲中制作離散的物品是很有用的,比如一個擺動的鐘擺,一個滑動門,或者一個旋轉的硬幣。動畫窗口一次只能顯示一個動畫剪輯。
????在4.0版本中,Animation窗口被添加到Unity中。Animation窗口是一個比Timeline窗口更古老的特性。它提供了一種創建Animation clips和為各個GameObject設置動畫的簡單方法,你在Animation窗口中創建的clips,可以使用Animator Controller進行組合和混合。但是,涉及許多不同游戲對象的更復雜的序列,你應該使用Timeline窗口。
????Animation窗口有一個“timeline”作為它的用戶界面的一部分(水平欄上標有時間描繪),但是這與Timeline窗口是分開的。

6.使用Animation視圖
??Animation視圖用于預覽和編輯Unity中的GameObject的Animation clips.通過
Window -> Animation可以打開Animation視圖。

(1).查看GameObject上的動畫
??Animation窗口與Hierarchy窗口,Project窗口,Scene視圖和Inspector窗口銜接。像Inspector一樣,Animation窗口顯示當前選擇的GameObject或Animation Clip Asset的動畫的時間軸和關鍵幀。你可以使用Hierarchy窗口或者Scene視圖選擇GameObject,也可以通過Project窗口選擇Animation Clip Asset.
??注意:Animation視圖是獨立的,但看起來跟Timeline窗口很相似。

(2).動畫屬性列表
??在下圖中,Animation視圖(左邊)顯示了當前選中的GameObject以及它的子GameObject所使用的動畫,如果它們被該動畫控制的話。Scene視圖和Hierarchy視圖在右側,演示了Animation視圖怎么顯示當前選中的GameObject上的附加動畫。

??在動畫視圖的左側是一個動畫屬性列表,在一個尚未錄制動畫的新創建的clip中,這個列表是空的。

??當你開始為clips中的各種屬性做動畫時,動畫屬性將出現在這里。如果動畫控制了多個子對象,那么該列表還將包含每個子對象的動畫屬性的分層子列表。在上面的例子中,機器人手臂的GameObject Hierarchy的各個部分都在同一個Animation clip中做動畫。當像這樣在單個clips中為一個GameObject的Hierarchy做動畫時,請確保在Hierarchy的根GameObject上創建動畫。
??可以折疊和展開每個屬性,以顯示在每個關鍵幀記錄的確切值。如果回放頭(白線)位于關鍵幀之間,則值字段顯示插值值。你可以直接編輯這些字段。如果當回放頭位于關鍵幀之上時進行了更改,則修改關鍵幀的值。如果當回放頭在關鍵幀之間(因此顯示的值是插值值)時發生改變,那么在那個點將使用輸入的新值創建一個關鍵幀。

(3).動畫時間軸
??在動畫視圖的右側是當前clip的timeline。這個timeline展示了每個動畫屬性的關鍵幀。timeline視圖有兩種模式,Dopesheet和curve。要在這些模式切換,單擊動態屬性列表區域底部的Dopesheet或Curve。

??它們提供了動畫時間軸和關鍵幀數據的兩個備用視圖。
??Dopesheet時間軸模式
????Dopesheet模式提供了一個更緊湊的視圖,允許你在單個水平軌道中查看每個屬性的關鍵幀序列。這允許你查看多個屬性或GameObjects的關鍵幀時序的簡單概述。

??Curves時間軸模式
????Curves模式顯示一個可調整大小的圖形,其中包含了每個動畫屬性的值隨時間變化的視圖。所有選中的屬性都顯示在同一個圖形視圖中。通過此模式,你可以很好地控制查看和編輯值,以及如何在兩者之間進行插值。

??讓你的選擇適合窗口
????當使用曲線模式來查看動畫時,重要的是要明白有時候每個屬性的不同范圍會有很大的差異。例如:考慮一個用于旋轉彈跳立方體的簡單Animation clip。彈跳Y位置值可以在0到2的范圍內變化(意味著在動畫期間立方體彈跳2個單位高);但是旋轉值從0到360(表示旋轉度)。當同時查看這兩條曲線時,位置值的動畫曲線將會非常難以辨認,因為視圖將會縮小到適合窗口內0-360范圍的旋轉值。

????按鍵盤上的F可將視圖縮放到當前選定的關鍵幀。這對于在動畫時間軸的一部分上聚焦和重新縮放窗口以便于編輯非常有用

????單擊列表中的各個屬性,然后按鍵盤上的F以自動重新縮放視圖以適合該值的范圍,以自動重新縮放視圖以適應該屬性值的范圍。你還可以使用視圖滾動條滑塊每端的拖動手柄調整Curves窗口的縮放。在下圖中,動畫窗口被放大以查看彈跳Y位置動畫。黃色旋轉曲線的起點仍然可見,但現在已經遠遠超出了視圖的頂部。

????按下鍵盤上的A鍵來適應和重新縮放窗口以顯示clip中的所有關鍵幀,無論選擇哪個。如果要在保留當前選擇的同時查看整個時間軸,這非常有用

??回放和幀導航控件
????要控制Animation Clip的回放,請使用Animation視圖左上角的回放控件。

????從左到右,這些控件是:

·預覽模式(打開/關閉) ·記錄模式(切換打開/關閉),注意:如果記錄模式打開,預覽模式總是打開的 ·移動播放頭到clip的開始 ·移動播放頭到前一個關鍵幀 ·播放動畫 ·移動播放頭到下一個關鍵幀 ·移動播放頭到clip的末尾

????你還可以使用鍵盤快捷鍵控制播放頭

·按逗號 (,) 進入前一幀 ·按句號 (.) 轉到下一幀 ·按住Alt鍵并按下逗號 (,) 進入前一個關鍵幀 ·按住Alt鍵并按下句號 (.) 進入下一個關鍵幀

??鎖定窗口
????你可以鎖定Animation編輯器窗口,這樣它就不會自動切換以反映在Hierarchy或Scene中當前選中的GameObject.如果你想專注于某個特定GameObject的動畫,并且仍然能夠選擇和操作場景中的其他游戲對象,鎖定窗口是很有用的。

7.創建一個新的動畫clip
????要在Unity中為GameObject設置動畫,需要在GameObjects上附加Animator組件。此Animator組件必須引用Animator Controller,而Animator Controller又包含對一個或多個Animation Clips的引用。
??使用Animation視圖開始在Unity中設置GameObject動畫時,將自動為你創建,附加和設置所有這些項目。
??為選定的GameObject創建新的Animation clip,并確保Animation窗口可見。
??如果GameObject尚未分配任何動畫clip,你將會在Animation窗口時間軸的中心看到“Create”按鈕。點擊Create按鈕。然后系統會提示你將新的空動畫clip保存到Assets文件夾中。

??一旦你保存了這個空的Animation clips,很多事情會自動發生:

·將創建一個新的Animation Controller asset ·正在創建的新clip將作為默認狀態添加到Animator Controller中 ·Animator組件將被添加到正在做動畫的GameObject中 ·為Animator組件分配新的Animator Controller

??這個自動序列的結果是為你設置了動畫系統的所有必須元素,現在你可以為對象設置動畫了。

??(1).添加另一個Animation Clip
????如果GameObject已經分配了一個或多個Animation Clips,"Create"按鈕將不可見。相反,其中一個clip將在Animation窗口可見。你可以通過使用Animation窗口左上方的菜單,在播放控件下切換窗口中可見的Animation clip.
????如果你想在一個已經有動畫的對象上創建一個新的Animation Clip,你可以從這個菜單中選擇“Create New Clip”。同樣,你將被提示保存新的Animation clip,然后才能使用它。

??(2).Animation clip的組合
????雖然以上步驟會自動設置相關的組件和引用,但是了解哪些部分必須連接在一起是很有用的。

·GameObject必須具有Animator組件 ·Animator組件必須分配Animator Controller asset ·Animator Controller asset必須分配一個或多個Animation clip

????下面的圖表顯示了如何分配這些片段,從Animation窗口創建新的Animation clip開始:

????在下圖中,你可以看到被選擇的GameObject(“Cube”)尚未有動畫。我們只有一個沒有Animator組件的簡單的立方體。Animation窗口,Hierarchy窗口,Project窗口以及Inspector窗口并排排列,以保持清晰。

????在Animation視圖中按下Create按鈕,就會創建一個新的Animation clip。Unity會要求選擇名稱和位置來保存這個新的Animation clip.Unity還創建了一個與所選GameObject同名的Animator Controller asset,向GameObject添加了Animator組件,并適當的將asset連接起來。

????在上面的新視圖中,你可以看到

·動畫窗口(左上角)現在顯示了一個帶有白色播放頭線的時間線,可以記錄新的關鍵幀。clip的名稱在clip菜單中可見,就在回放控件的下面。 ·Inspector(中心)顯示了Cube GameObject現在添加了Animator組件,組件的Controller字段顯示分配了名字為Cube的Animator Controller asset ·Project窗口(右下)顯示已經創建了兩個新資產-一個名為"Cube"的Animator Controller asset和一個名為"Cube Animation Cilp"的Animation Clip資產。 ·Animator窗口(左下)顯示了Animator Controller控制器的內容-可以看到"Cube Animation Clip"已經添加到控制器中,它是橙色表示的默認狀態。添加到Controller的后續clip將使用灰色,標明它們不是默認狀態。

8.設置GameObject動畫
??一旦你保存了新的Animation clip Asset,你就可以開始向clip添加關鍵幀了。
??在動畫窗口中有兩種不同的方法可以用來為GameObject做動畫:記錄模式和預覽模式。
??記錄模式(也稱為自動按鍵模式):

????在錄制模式下,當你移動,旋轉或修改動畫游戲對象上的任何可動畫屬性時,Unity會在回放頭自動創建關鍵幀。按下帶有紅色圓圈的按鈕,即可進入錄制模式。在記錄模式下,動畫窗口的時間線是紅色的。
??預覽模式:
????在預覽模式下,修改需要動畫的GameObject不會自動創建關鍵幀。每次將GameObject修改為所需的新狀態(例如,移動或旋轉它)時,必須手動創建關鍵幀(如下所示)。按下預覽按鈕以啟用預覽模式。在預覽模式下,動畫窗口的時間線是藍色的。
????注意:在錄制模式下,預覽按鈕也是活動的,因為你正在預覽現有的動畫并同時記錄新的關鍵幀。

(1).記錄關鍵幀
??要開始記錄所選GameObject的關鍵幀,單擊Animation Record按鈕。這將進入Animation Record Mode,對GameObject的更改將被記錄到Animation Clip中。

??一旦進入錄制模式,你可以通過將白色回放頭設置為動畫time line中所需的時間來創建關鍵幀,然后將GameObject修改為你希望它處于的狀態。
??你對GameObject所做的更改將被記錄為Animation窗口中的白線(回放頭)顯示的當前時刻的關鍵幀。
??對可動畫屬性的任何修改(如其位置或旋轉)將導致該屬性的關鍵幀出現在動畫窗口中。
??單擊或拖動時間線條可移動回放頭,并顯示回放頭當前時間的動畫狀態。
??在下面的截圖中,你可以看到動畫窗口在錄制模式。時間線條被著色為紅色,表示記錄模式,動畫屬性在Inspector中顯示為紅色背景。

??你可以通過再次單擊Record按鈕隨時停止記錄模式。當你停止記錄模式,動畫窗口切換到預覽模式,這樣你仍然可以根據動畫time line看到游戲對象的當前位置。
??你可以在動畫記錄模式下通過操作GameObject的任何屬性來為它設置動畫。移動,旋轉或縮放游戲對象在Animation clip中為這些屬性添加相應的關鍵幀。在記錄模式下,在GameObject的Inspector中直接調整值也會添加關鍵幀。這適用于inspector中的任何可動畫屬性,包括數值,復選框,顏色和大多數其他值。
??當前動畫的GameObject屬性將顯示在Animation窗口的左側。沒有動畫效果的屬性不會顯示在這個窗口中。你動畫的任何新屬性,包括子對象上的屬性,一旦開始動畫它們,就會添加到屬性列表區域。
Transform屬性的特殊之處在于x,y和z屬性時鏈接在一起的,因此同時添加這三個屬性的曲線。

??你還可以通過單擊add Property按鈕向當前GameObject(游戲物體)(及其子對象)添加可動畫屬性。單擊此按鈕將顯示GameObject可動畫屬性的彈出列表。這些屬性和inpector中列出的屬性相對應。

??在預覽模式或錄制模式下,白色垂直線顯示當前預覽Animation Clip的哪個幀.Inspector和Scene視圖在Animation clip的那一幀顯示GameObject.該幀的動畫屬性值也顯示在屬性名稱右側的列中。
??在動畫模式下,白色垂直線顯示當前預覽的幀。

(2).時間軸
??你可以單擊Animation窗口time line上的任意位置,將回放頭移動到該幀,并在動畫剪輯中預覽或修改該幀。時間軸中的數字顯示為秒和幀,所以1:30表示1秒和30幀。
??注意,Animation窗口中的time line bar共享相同的名稱,但在Timeline窗口中是分開的。

??注意:在預覽模式下time line顯示為藍色,在記錄模式下顯為紅色。

(3).在預覽模式下創建關鍵幀
??除了使用記錄模式在修改GameObject時自動創建關鍵幀外,你還可以在Preview模式通過修改GameObject上的屬性,然后手動地選擇為該屬性創建關鍵幀。
??在預覽模式下,有動畫的屬性在Inspector窗口中顯示為藍色。當你看到這個藍色色調時,這意味著這些值是由animation clip的關鍵幀驅動的,當前animation clip正在動畫窗口中預覽。

??如果你在預覽時修改了這些藍色屬性中的任何一個(比如旋轉一個帶有旋轉屬性動畫的GameObject,如上圖所示),GameObject現在就會處于修改后的動畫狀態。這inspector字段的顏色更改為粉紅色來表示。因為你沒有處于記錄模式,所以你的修改還沒有保存為關鍵幀。
??例如,在下面的截圖中,旋轉屬性被修改為Y值為-90。此修改尚未保存為animation clip中的關鍵幀。

??在此修改狀態下,必須手動創建關鍵幀以“保存”此修改。如果你移動回放頭,或者從動畫游戲對象中切換你的選擇,你將失去修改。
(4).手動創建關鍵幀
??當你在預覽模式下修改了GameObject時,有三種方法可以手動創建關鍵幀。
??你可以通過右鍵單擊你修改過的屬性的屬性標簽來添加關鍵幀,這樣你就可以為這個屬性添加關鍵幀,或者為所有的動畫屬性添加關鍵幀。

??添加關鍵幀后,新的關鍵幀將在animator窗口可見作為一個菱形符號(在下面的截圖中用紅色表示),屬性字段重新變回藍色,表明你的修改被保存為一個關鍵幀,并且你現在正在預覽一個由動畫關鍵幀驅動的值。

??你也可以通過點擊動畫窗口中的add keyframe按鈕來添加關鍵幀。

??或者你可以使用熱鍵K或Shift-K來添加一個關鍵幀(或多個關鍵幀),如下所述:
????熱鍵

·K-所有動畫的關鍵幀。在animation窗口中回放頭當前位置為所有動畫屬性添加一個關鍵幀。 ·Shift-K-所有修改的關鍵幀。僅為那些在animation窗口中回放頭的當前位置修改過的動畫屬性添加關鍵幀。

10.使用動畫曲線
(1).屬性列表
??在Animation Clip中,任何可動畫屬性都可以有動畫曲線,這意味著Animation Clip可以控制該屬性隨時間變化。在Animation視圖(左邊)的屬性列表區域中,列出了所有當前的動畫屬性。在Dopesheet模式下的動畫視圖中,每個屬性的動畫值只顯示為線性軌跡,但是在Curves模式下,你可以看到屬性的變化值顯示為圖形上的線。無論你使用哪種模式來查看,曲線都是存在的。只有當關鍵幀出現時,Dopesheet模式才會提供數據的簡化視圖。
??在Curves模式中,動畫曲線有彩色的曲線指示器,每種顏色代表屬性列表中當前選中屬性的值。

(2).理解Curves,Keys,Keyframes
??Animation Curve有多個keys,這些keys是曲線經過的控制點。這些在曲線編輯器中可視化為曲線上的小菱形。一個幀中若有一條或多條曲線有一個key,則這一幀被稱為keyframe.
??如果屬性在當前預覽幀中有一個key,則曲線指示器將具有菱形形狀,屬性列表也將在值旁邊具有菱形形狀。

??Curve編輯器將只顯示所選屬性的曲線。如果在屬性列表中選擇了多個屬性,則曲線將顯示在一起。

(3).添加和移動關鍵幀

??可以通過單擊keyframe按鈕在當前預覽幀中添加關鍵幀。這將為所有當前選中的曲線添加一個關鍵幀。或者你可以通過雙擊新keyframe所在的曲線,將關鍵幀添加到任意給定幀的單個曲線中。還可以通過右鍵單擊關鍵幀所在曲線,并從上下文菜單中選擇Add Keyframe來添加關鍵幀。一旦放置,關鍵幀可以用鼠標拖動。也可以同時選擇多個關鍵幀來拖動。關鍵幀可以通過選擇他們并按下Delete來刪除,或者右鍵單擊它們并從上下文菜單中選擇Delete keyframe.
(4).支持動畫的屬性
??Animation視圖不僅可用于為GameObject的position,rotation和scale設置動畫。任何Component和Material的屬性都可以被設置動畫–甚至是自己的腳本組件的公共變量。制作具有復雜視覺效果和行為的動畫,只需為相關屬性添加動畫曲線即可。
??動畫系統支持一下類型的屬性:

·Float ·Color ·Vector2 ·Vector3 ·Vector4 ·Quaternion ·Boolean

??不支持Arrays,除了上面列出的structs或objects,其他的的struct或對象也不受支持。
??對于布爾屬性,0的值為False,而其他值為True.
??下面是一些Animation View可以用來做的事情的例子:

·為光線的顏色(Color)和強度(Intensity)做動畫效果 ·為循環Audio Source的Pitch和Volume設置動畫,模擬生活中吹的風,引擎發動,或流動的水的效果,同時保持sound assets的規模最小。 ·為Material的Texture Offset設置動畫,以模擬移動的帶子或軌道,流動的水,或特殊效果。 ·為多個Ellipsoid Particle Emitters的Emit state和Velocities做動畫效果,以創造壯觀的煙花或噴泉顯示 ·為自己的組件腳本的變量設置動畫,以使不同時間有不同行為。

??當使用Animation Curves開控制游戲邏輯時,請注意動畫在Unity中的回放和采樣方式。
(5).旋轉插值類型
??在Unity內部旋轉表示為四元數。四元數由x,y,z,w組成,這些值一般不需要手動修改,除非你知道他們的確切含義。一般旋轉通常使用歐拉角來操作,歐拉角用x,y,z來表示圍繞著三個軸的旋轉。
??在兩個旋轉之間進行插值時,可以對四元數或歐拉角進行插值。Animation視圖允許你選擇在動畫轉換旋轉時使用哪種插值形式。然而無論采用哪種插值形式,旋轉總是以歐拉角值的形式出現。

(6).四元數插值
??四元數插值總是在兩個旋轉之間的最短路徑上產生平滑的旋轉變化。這避免了萬向節鎖等問題。然而四元數插值不能表示大于180度的旋轉,因為它總是尋求最短路徑。(你可以通過在球面上選取兩點來描繪這一點–它們之間的最短直線永遠不會超過球面的一半)。
??如果你使用四元數插值,將數值旋轉的值間隔超過180度,那么在動畫窗口中繪制的曲線看起來仍然會覆蓋超過180度的范圍,但是物體的實際旋轉會旋轉最短路徑。

??當使用四元數插值進行旋轉時,改變x,y或者z曲線的鍵或切線也可能改變其他兩天曲線的值,因為這三條曲線都是從內部四元數表示中創建的。當使用四元數插值時,key總是連接在一起的,因此在特定時間為三條曲線中的一條(x,y或z)創建一個key,同時也為其他兩天曲線創建一個key.
(7).歐拉角插值
??歐拉角插值是大多數人都熟悉的。歐拉角可以表示任意大的旋轉,而x,y,z曲線時相互獨立的。歐拉角插值在同時圍繞多個軸旋轉時,可能受到萬向鎖等人為因素的影響,但對于一次圍繞一個軸的簡單旋轉來說,這種方法是直觀的。當使用歐拉角插值時,Unity內部將曲線烘焙成內部使用的四元數表示形式。這與從外部程序將動畫導入Unity時會發生的情況類似。注意,這種曲線烘焙可能會在這個過程中添加額外的鍵,并且在子幀級別上與常切類型的切線可能不是完全精確的。
11.編輯曲線
??Unity Editor中有幾個不同的功能和窗口,它們使用Curves來顯示和編輯數據。盡管有一些例外情況,但你可以用來查看和操縱曲線的方法在所有這些方面基本相同。

·Animation窗口使用曲線在Animation Clip中隨時間顯示和編輯動畫屬性的值。

·Script組件可以具有Animation Curve類型的成員變量可用于各種事物。單擊Inspector將打開曲線編輯器。

·Audio Source組件使用曲線來控制roll-off和其他屬性,最為到Audio Source的距離的函數。

·Particle System 使用曲線隨時間改變離子屬性


??雖然這些控件有細微的差別,但曲線可以在所有控件中以完全相同的方式進行編輯。
(1).在曲線上添加和移動keys
??通過雙擊應放置key的曲線上的點,可以將key添加到曲線上。還可以通過右鍵單擊曲線并從上下文菜單中選擇add key來添加鍵。
??一旦放置,key可以用鼠標拖動:

·單擊一個key來選中它,然后用鼠標拖動選中的key ·要想在拖動網格的同時對齊key,請拖動時,Mac平臺按住Command鍵,Windows平臺按住Control鍵。

??也可以同時選擇多個key:

·單擊key時按住Shift鍵可以同時選擇多個鍵。 ·若要取消選定的key,可以再按住Shift鍵的同時再次單擊它 ·若要選擇矩形區域內的所有key,單擊空點并拖動以形成矩形選擇。 ·矩形選擇還可以通過按住Shift鍵添加到現有的選中的key中。

??key可以通過選擇它們并按下Delete來刪除,或者右鍵單擊它們并從上下文菜單中選擇Delete鍵。
(2).編輯Keys
??直接在曲線編輯器中編輯key是Unity5.1中的一個新特性。使用Enter/Return或者上下文菜單開始編輯選中的key,Tab可以在字段之間切換,Enter/Return用于提交,Escape取消編輯。
(3).曲線導航視圖
??使用Animation視圖時,你可以輕松的放大你想要使用的曲線的細節,或者縮小以獲得完整的圖片。
??你可以按F鍵來顯示選中frame或者選中key的曲線。
(4).縮放
??你可以使用鼠標的滾動輪,使用觸控板的縮放功能,或者用鼠標右鍵拖動按住Alt鍵來縮放視圖。
??你只能放大水平軸或垂直軸:

·在Mac按住Command或者Windows按住Control鍵來進行水平縮放。 ·縮放的同時按住Shift鍵垂直縮放。

??此外,你還可以拖動滾動條的端點,以收縮或擴展曲線視圖中的顯示的區域。
(5).平移
??你可以用鼠標中鍵或者用鼠標左鍵拖動的同時按住Alt鍵來平移曲線視圖。
(6).編輯切線
??一個key有兩個切線-一個在左邊用于表示進來的斜率,一個在右邊用于表示出去的斜率。切線控制key之間的曲線的形狀。你可以從許多不同的切線類型中進行選擇,以控制曲線如何離開一個key并到達下一個key。右鍵單擊一個鍵以選擇該鍵的切線類型。

??要使有動畫的值在傳遞key時平滑地改變,左切線和右切線必須是共線的。以下切線類型可確保平滑度:

·Clamped Auto:這是默認的切線模式。切線自動設置為使曲線平滑的經過key.當編輯key的位置或時間時,切線會調整以防止曲線"超過"目標值。如果在Clamped Anto模式,你手動的調整key的切線,它會切換到Free Smooth模式。在下面的例子中,當key被移動時,切線會自動進入一個斜率并水平移動

·Auto:這是一個遺留的切線模式,并且仍然是一個向后兼容舊項目的選項。除非你有特定的理由使用此模式,否則請使用默認的Clamp Auto模式。當將key設置為該模式時,會自動設置切線,使曲線平滑的經過key.但是與Clamped Auto模式有兩個區別: 1.當key的位置或時間被編輯時,切線不會自動調整,它們只在最初將key設置為此模式時,進行調整 2.當unity計算切線時,它沒有考慮到避免"超過"目標值的key.

·Free Smooth:拖動切線手柄可自由設置切線。它們被鎖定為共線以確保平滑。

·Flat:切線設置為水平方向(這是Free Smooth的特殊情況)


??有時你可能不希望曲線在通過一個key時是平滑的。要在曲線上產生明顯的變化,請選擇Broken tangent模式

??當使用broken tangents時,可以分別設置左切線和右切線。每個左右切線都可以設置為以下類型之一:

·Broken-Free:拖動切線手柄可自由設置切線。

·Broken-Linear:相切點指向相鄰的key.要做一條直線線段,把兩端的切線都設為直線。在下面的示例中,所有的key都被設置為斷線,以實現從key到key的直線。

·Broken-Constant:曲線在兩個key之間保持恒定值。左鍵的值決定了曲線段的值。

12.在Dopesheet模式下的key操作
??Box Selection用于在Dopesheet模式下查看Animation窗口時選擇多個鍵。這允許你一次選擇和操作幾個鍵。
??以下操作允許你選擇多個鍵:

·按住Shift+click可將某個key添加到你的選擇中 ·用鼠標拖動一個矩形來選擇一組key ·按住Shift并拖動一個矩形來添加或刪除當前選擇的一組鍵


??當向選擇添加key時,框選擇句柄會出現在所選鍵的任意一側。如果向選擇添加或刪除更多key,句柄將自動調整其位置和大小,以包含所有當前選中的key.

??使用框選擇句柄來移動,縮放和編輯所選的key(參見下面的Ripple編輯)
(1).移動選擇的key
??單擊框選擇句柄內的任意位置,拖動選中的鍵并移動它們。你不需要直接點擊一個key來做這個,你可以通過單擊框選擇句柄內的空白空間來拖動。
??當你拖動時,第一個和最后一個key的時間會顯示在時間軸欄下,以幫助你把key放在你想要的位置。當將選擇的key拖動到左邊時,任何以負時間結束的key(即時間軸上0標記的左邊)都會在釋放鼠標按鈕時被刪除。

(2).縮放選擇key
??當你選擇了多個key,你可以縮放所選擇的key,或者把它們分開很長一段時間(使所選擇的動畫變慢),或者把他們靠得更近以占用更短的時間(使所選擇的動畫變快)。要縮放選中的key,單擊并按住選中鍵左右兩側的藍色框選擇手柄,水平拖動。
當你縮放時,第一個和最后一個key的時間將顯示在時間軸欄下,以幫助你縮放鍵到所需的位置。當將選擇的key縮減到更短的時間時,有些key可能會以相同的幀結束。如果發生這種情況,當你釋放鼠標按鈕時,占用相同frame的額外key將被丟棄,并且只保留最后一個key.


(3).Ripple 編輯
??Ripple編輯是一種移動和縮放選定key的方法。此方法還會影響與你正在操作的key在同一時間軸上的非選中key.該名稱是指讓其他內容自動沿time line移動,以適應你添加、擴展或縮小的內容。編輯的效果會在整個時間軸上產生“ripple效應”
??按住R鍵同時拖動選擇框內來執行一個Ripple Move。這樣做的效果是“推”任何未選中的key,加上你選擇的key和那些key之間的原始空間,當你沿著時間軸拖動所選key時,就會在選擇key的左邊或右邊。
??按住R鍵同時拖動方框選擇手柄來執行Ripple Scale.對時間軸中其他未選中的key的影響與Ripple Move完全相同–當你縮放到框選擇的左邊或右邊時,他們被推倒左邊或右邊。

13.在Curves模式下的key操作
??方框選擇用于在曲線模式下查看Animation窗口時選擇多個key.這允許你一次選擇和操作幾個key.
??以下操作允許你選擇多個key:

·按住Shift + 單擊可將單個鍵添加到你的選擇中 ·用鼠標拖動一個矩形來選擇一組key ·按住Shift并拖動一個矩形來添加或刪除當前選擇的一組key


??當你向選擇添加key時,框選擇句柄會出現在所選key的任意一側,以及頂部和底部。如果向選擇添加或刪除更多鍵,句柄將自動調整其位置和大小,以包含所有當前選中的key.

(1).移動選擇的key
??單擊框選擇句柄內的任意位置,拖動選中的key并移動它們。你不需要直接點擊一個key來做這個,你可以通過單擊框選擇句柄內的空白空間來拖動。
??當你拖拽時,第一個和最后一個key的時間會顯示在時間軸欄下,以幫助你把鍵放在你想要的位置。當選擇的key拖動到左邊時,任何以負時間結束的key(即時間軸上0標記的左邊)都會在釋放鼠標按鈕時被刪除。

(2).縮放選中的key
??當你選擇了多個鍵時,你可以縮放選中的key.在曲線模式下,你可以水平縮放以更改key的時間位置,或垂直縮放以更改key的位置。
(3).水平縮放選中的key
??在選中key的左邊和右邊使用框選擇句柄水平縮放選擇。這改變了key的時間位置,而不修改他們的值。將手柄分開可以延長key經過時間(使選定的動畫變慢),或者將key靠得更近,縮短key的經過時間(使選定的動畫變快)。
??當水平縮放選擇時,在視圖頂部會顯示key的最小和最大時間,以幫助你將你選擇的key設置為所需的時間。

(3).垂直縮放選中的key
??使用框懸著手柄到所選key的頂部和底部以垂直縮放選擇。這將更改key的值,而不修改他們的時間位置。
??當你垂直縮放選擇時,key的最小和最大時間顯示在視圖的左側,以幫助你將選擇設置為所需的值。

(4).操縱灰色條
??除了出現在所選key周圍的框選擇句柄外,在curve窗口的頂部和左側還有灰色操作條,他們提供了操作當前選擇的其他方法。

??頂部的操作欄允許你修改所選key的時間位置,同時保留它們的值。旁邊的欄允許你修改key的值,同時保留它們的時間位置。當你選擇多個key時,頂部和右側的條在兩端都顯示一個正方形。拖動工具條的中心以移動選中的key(水平或者垂直),或者拖動每個工具條末端的方塊以縮放選中的key.
??和框選擇句柄一樣,當使用灰色條移動或縮放選中key時,會顯示最小值和最大值或關鍵幀時間。對于時間操作欄(在窗口的頂部),顯示第一個和最后一個關鍵幀的時間。對于值操作欄(窗口左側),將顯示key的最低值和最高值。
??注意:只有當你選擇了多個key時,在欄的末端的縮放框才可見,并且視圖被縮放到足夠長,以顯示在每一欄的縮放框。
(5).Ripple 編輯
??同上面的Ripple 編輯

14.具有多個運動部件的對象
??可能你想要為對象的多個移動部分設置動畫,如帶有移動鏡筒的炮塔或具有許多身體部位的角色。所有部件都可以通過父級上的單個動畫組件進行處理,但在某些情況下,在子級上添加其他動畫組件很有用
(1).GameObject的子節點動畫
??GameObject的Hierarchy顯示在Animation View左側的面板中。
??你可以通過使用GameObject名稱旁邊的折疊式三角形來訪問游戲對象的子對象。子對象的屬性可以像父對象一樣設置動畫。

??或者,在動畫錄制模式下,你可以只選擇想要從Hierarchy面板或者Scene視圖中動畫化的子游戲對象,并在Inspector中對該對象進行建模或更改其屬性。

二、Animation Event
??你可以通過使用Animation Events來增加Animation Clips的實用性,Animation Events允許你在time line中指定的點調用對象腳本中的函數。
??Animation Event調用的函數還可以選擇接受一個參數。參數可以是float、string、int或object引用,也可以是Animation Event對象。AnimationEvent對象具有成員變量,允許將float、string、integer和object引用一次性傳遞給函數,以及有關觸發函數調用的Event和其他信息。
??要將Animation Event添加到當前播放頭位置的clip,可單擊“Event”按鈕。將Animation Event添加到Animation中的任何點。雙擊要在其中觸發事件的位置的事件行。添加后,你可以拖動鼠標重新定位事件。要刪除事件,請選擇它并按Delete鍵,或右鍵單擊它并選擇"Delete Event"

??Animation Event允許將數據添加到導入的剪輯中,該剪輯決定了某些動作合適與動畫同步發生。例如,對于一個動畫角色,你可能想要添加一些事件來說明應該在什么時候播放腳本聲。
??添加事件時,Inspector窗口會顯示幾個字段。這些字段允許你指定要調用的函數的名稱,以及要傳遞給它的參數的值。

??添加到clips中的事件顯示為事件行中的標記。把鼠標放在標記上,以顯示帶有函數名和參數值的工具提示。

??你可以在時間軸中選擇和操作多個事件。
??要在時間軸中選擇多個事件,按住Shift鍵并逐個選擇事件標記,將它們添加到你的選擇中。你還可以在它們之間拖動選擇框,單擊并拖動事件標記區域,如下所示:

例子:
??這個例子演示了如何向一個簡單的GameObject添加動畫事件。在執行所有步驟時,Cube在Play模式中沿x軸向前和向后移動,事件消息在0.8秒后每間隔1秒在控制臺顯示一次(包括0.8秒)。
??這個示例需要一個帶有PrintEvent()函數的小腳本。此函數打印一個調試消息,其中包含一個字符串(“called at:”) and the time:

using UnityEngine; public class ExampleClass : MonoBehaviour {public void PrintEvent(string s){Debug.Log("PrintEvent: " + s + " called at: " + Time.time);} }

??用示例代碼創建一個腳本文件,并將其放在你的項目文件夾中(右鍵單擊Unity中的Project窗口并選擇Create->C# Script,然后將上面的代碼示例復制粘貼到文件中保存)。
??在Unity中創建一個Cube GameObject(菜單:GameObject->3D Object->Cube).要向它添加你的新腳本,可以將腳本從Project窗口拖放到Inspector窗口中。
??選擇Cube然后打開Animation窗口(菜單:Window->Animation)。設置x坐標的位置曲線。

??接下來,將x坐標的動畫設置為大約0.4,然后在一秒內回到0,然后大約在0.8秒內創建一個動畫事件。按下Play以運行動畫。

代碼示例:

using UnityEngine; public class AnimationEventTest:MonoBehaviour {public void PrintFloat(float theValue){Debug.Log("PrintFloat is called with a value of " + theValue + ":" + Time.time);} }

動態添加動畫事件:

using UnityEngine; public class AnimationEventTest:MonoBehaviour {private Animator mAnimator;private RuntimeAnimatorController mRuntimeAnimatorController;private AnimationClip[] clipArray;void Start(){mAnimator = GetComponent<Animator>();mRuntimeAnimatorController = mAnimator.runtimeAnimatorController;clipArray = mRuntimeAnimatorController.animationClips;int clipCount = clipArray.Length;for(int i = 0; i < clipCount; ++i){for(clipArray[i].name = "test"){AnimationEvent animationEvent = new AnimationEvent();animationEvent.functionName = "PrintFloat";//動畫末尾animationEvent.time = clipArray[i].length;clipArray[i].AddEvent(animationEvent);}}}public void PrintFloat(float theValue){Debug.Log("PrintFloat is called with a value of " + theValue + ":" + Time.time);} }

三、Animator
1.Animator Controllers
??Animator Controllers允許你為角色或其他動畫游戲對象安排和維護一組動畫
??controller引用animation clip組件,并使用狀態機來管理各種動畫狀態和它們之間的過渡,可以看做是一種流程圖,或者用Unity中的可視化編程語言編寫的簡單程序。

2.The Animator Controller Asset
??當準備使用animation clips時,你需要使用animator controller將它們組合到一起。可以在Unity中創建一個Animator Controller asset,來為一個角色或對象維護一組動畫。

??Animator Controller asset可以從Assets菜單創建,或者是從Project窗口中的Create菜單創建。
??在大多數情況下,擁有多個動畫并在某些游戲條件發生時在它們之間切換是正常的。例如,只要按下空格鍵,你就可以從步行動畫切換到跳躍動畫。即使你只有一個animation clip,也需要把它放到animator controller中,并附加在GameObject上
??controller使用狀態機來管理各種動畫狀態和它們之間的裝換,可以被看做是一種流程圖,或者用Unity中的可視化編程語言編寫的一個簡單程序。可以在Animator窗口中創建、查看和修改Animator Controller。

??通過附加Animator組件將Animator Controller應用于對象。

3.Animator窗口
??Animator窗口允許你創建、查看和修改Animator Controller asserts.

??Animator窗口有兩個主要部分:主網格布局區和左側圖層以及參數面板。

??帶有深灰色網格的主要部分是布局區域。你可以使用這個區域來創建、排列和連接Animator Controller中的狀態。
??你可以右鍵單擊網格來創建一個新的狀態節點。使用鼠標中鍵或Alt/Option拖動移動視圖。單擊以選擇要編輯的狀態節點,單擊或者拖動狀態節點以重新安排狀態機的布局。

??左邊的窗格可以在Parameters視圖和Layers視圖之間切換。Parameters視圖允許你創建,查看和編輯Animator Controller參數。你定義的這些參數將狀態機輸入的變量。若要添加參數,單擊加號圖標并從彈出菜單中選擇參數類型。要刪除參數,可以在列表中選擇參數并按下delete鍵(在macOS上使用fn-Delete刪除選中的參數)。

??當左側窗格切換到Layers視圖時,你可以在Animator Controller中創建、查看和編輯Layers。這允許在單個Animator Controller中有多個動畫層同時工作,每個動畫層由獨立的狀態機控制。這種情況的一個常見用途是在基礎層上創建一個單獨的層來播放上身動畫,該基礎層控制角色的一般移動動畫
??要添加一個圖層,可單擊加號圖標。要刪除一個層,選擇該層并按下delete鍵。

??打開或關閉"eye"圖標將顯示或隱藏Parameters和Layers側窗格,從而允許你有更多的空間查看和編輯你的狀態機。

??上圖是當前狀態機內的“breadcrumb”分層位置。狀態機可以包含sub-states和trees,且這些結構可以重復嵌套。當深入到子狀態時,這里列出了父狀態機和正在查看當前狀態機。單擊父狀態機允許你跳轉回父狀態機,或直接返回到狀態機的base layer。

??啟用鎖圖標將使Animator窗口鎖定在當前狀態機上。當鎖定圖標關閉時,單擊新animator asset或具有animator組件的GameObject,將切換animator窗口,以展示當前選中對象的狀態機。而鎖定窗口允許你保持動畫窗口顯示之前選中狀態機,不管是否選擇了其他assets或GameObject。

4.動畫狀態機
??角色或其他動畫對象通常有幾個不同動畫,對應于它在游戲中執行的不同動作。例如,一個角色在空閑時可能會呼吸或輕微搖擺,當被命令行走時,他會驚慌地舉起手臂從平臺上摔下來。一扇門可能會有開啟、關閉、卡住和被打破的動畫。Mecanim使用類似于流程圖的視覺布局系統來表示狀態機,以使你能夠控制和排序你想要在角色或對象上使用的Animator clips.

5.狀態機基礎
??基本的思想是一個角色在任何時候都在從事某種特定的行為。可使用的動作將取決于游戲玩法的類型,但典型的動作包括諸如空轉、步行、跑步、跳躍等。這些動作被稱為狀態,在某種意義上,角色處于一個“狀態”,在這個狀態中它在行走、閑蕩或其他什么。一般來說,角色會對它可以進入的下一個狀態有限制,而不是能夠立即從任何狀態切換到任何其他狀態。例如,只有當角色已經在跑步時才能執行跑步跳,而不是它處于停頓狀態時執行,因此它不應該直接從空閑狀態切換到跑步跳狀態。角色可以從當前狀態進入到下一個狀態的選項稱為狀態轉換。總的來說,狀態集、轉換集合用來記住當前狀態的變量構成了狀態機。
??狀態機的狀態和轉換可以使用圖表表示,其中節點表示狀態,而弧(節點之間的箭頭)表示轉換。你可以將當前狀態看做是放置在其中一個節點上的標記或突出顯示,然后只能沿著其中一個箭頭跳到另一個節點。

??狀態機對于動畫的重要性在于,它們可以很容易地設計和更新,而編碼相對較少。每個狀態都有一個與之關聯的運動,只要機器處于該狀態就會播放。這使動畫師或設計人員能夠定義角色動作和動畫的可能序列,而不必關心代碼如何工作。

(1).狀態機
??Unity的動畫狀態機提供了一種方法來概述所有與特定角色相關的動畫剪輯,并允許游戲中的各種事件(例如用戶輸入)觸發不同的動畫。
??可以從Animator Controller窗口設置動畫狀態機,他們看起來是這樣的:

??狀態機由States、Transitions和Event組成,較小的子狀態機可以用做較大狀態機中的組件。
6.動畫參數
??動畫參數是在Animator Controller中定義的變量,可以從腳本中訪問和賦值。這就是腳本控制和影響狀態機流的方式。例如,參數的值可以通過動畫曲線來更新,然后從腳本中訪問,這樣,聲音效果的音高可以像動畫一樣變化。同樣,腳本可以設置Mecanim要使用的參數值。例如,腳本可以設置參數來控制Blend Tree.
??可以使用Animator窗口的Parameters部分設置默認參數值,可在Animator窗口的右上角選擇。它們可以是四種基本類型:

·Int-整數 ·Float-帶有小數部分的數 ·Bool-布爾值(用復選框表示) ·Trigger-布爾值,在轉換(由圓形按鈕表示)時由控制器重置。

??參數可以使用Animator類中的函數從腳本賦值:SetFloat,SetInt,SetBool,SetTrigger和ResetTrigger.
??下面是一個基于用戶輸入和沖突檢測修改參數的腳本示例

using UnityEngine; public class AnimationEventTest:MonoBehaviour {Animator animator;void Start(){animator = GetComponent<Animator>();}void Update(){float h = Input.GetAxis("Horizontal");float v = Input.GetAxis("Vertical");bool fire = Input.GetButtonDown("Firel");animator.SetFloat("Forward",v);animator.SetFloat("Strafe",h);animator.SetBool("Fire",fire);}void OnCollisionEnter(Collision col){if(col.gameObject.CompareTag("Enemy")){animator.SetTrigger("Die");}} }

7.狀態機裝換
??State Machine Transitions的存在是為了幫助你簡化大型或復雜的狀態機。他們允許你對狀態機邏輯有更高級別的抽象。animator窗口中的每個視圖都有一個入口和出口節點。這是在State Machine Transitions期間使用的。入口節點是進入狀態機后的第一個狀態節點。然后將計算入口節點,并根據設置的條件進入目標狀態。通過這種方式,入口節點可以通過評估狀態機開始時的參數狀態來控制狀態機開始時的狀態。
??因為狀態機總是有一個默認狀態,所以總是會有一個從入口節點到默認狀態的默認裝換分支。

??然后,你可以添加從入口節點到其他狀態的額外裝換,以控制狀態機是否應該以不同的狀態開始。

??Exit節點用于指示狀態機應該退出。
??狀態機中的每個子狀態都被視為一個單獨且完整的狀態機,因此通過使用這些進入和退出節點,可以更加優雅的控制從父狀態機到其子狀態機的流
??可以將狀態機轉換與常規狀態轉換混合,因此可以從狀態轉換到狀態,從狀態轉換到狀態機,從一個狀態機直接裝換到另一個狀態機。

8.State Machine Behaviours
??State Machine Behaviour是一類特殊的腳本。以類似的方式將規則的Unity腳本(MonoBehaviours)附加到單獨的游戲對象,你可以將StateMachineBehaviour腳本附加到狀態機中的單個狀態。這允許你編寫在狀態機進入、退出或保持在特定狀態時執行的代碼。這意味著你不必編寫自己的邏輯代碼來測試和檢測狀態變化。
??使用此功能的幾個例子可能是:

·當狀態進入或退出時播放聲音。 ·只有在適當的狀態下才能執行某些測試(如地面探測) ·激活和控制與特定狀態相關的特殊效果。

??狀態機行為可以以一種非常相似的方式創建并添加到狀態,就像你創建并添加腳本到GameObject一樣。在狀態機中選擇一個狀態,然后在Inspector中使用“Add Behaviour”按鈕選擇一個現有的StateMachineBehaviour或創建一個新的腳本。

??State Machine Behaviour腳本可以訪問Animator enters,updates以及exits等不同狀態(或子狀態機)時調用的許多事件。以及允許你處理Root motion和IK調用事件。
??代碼示例:

using UnityEngine; public class StateMachineBehaviourTest:StateMachineBehaviour {override public void OnStateEnter(Animator animator,AnimatorStateInfo stateInfo,int layerIndex){Debug.Log("this is OnStateEnter>>>>>>>>>>> " + animator.name + ":" + stateInfo.ToString() + ":" + layerIndex);}override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex){Debug.Log("this is OnStateExit>>>>>>>>>>> " + animator.name + ":" + stateInfo.ToString() + ":" + layerIndex);}override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex){Debug.Log("this is OnStateExit>>>>>>>>>>> " + animator.name + ":" + stateInfo.ToString() + ":" + layerIndex);}override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex){Debug.Log("this is OnStateMove>>>>>>>>>>> " + animator.name + ":" + stateInfo.ToString() + ":" + layerIndex);}override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex){Debug.Log("this is OnStateIK>>>>>>>>>>> " + animator.name + ":" + stateInfo.ToString() + ":" + layerIndex);} }

9.子狀態機
??角色的復雜性動作通常由多個階段組成。與其使用單個狀態來處理整個操作,不如標識單獨的階段并為每個階段使用單獨的狀態。例如,一個角色可能有一個叫做"Trickshot"的動作,它蹲下來瞄準,射擊,然后再站起來。

??盡管這對于控制目的很有用,但缺點是隨著添加更多這些復雜操作,狀態機將變得龐大而笨拙。你可以通過在編輯器中使用空白空間可視化地分隔狀態組來簡化一些事情。但Mecanim更近一步,允許你將一組狀態折疊到狀態機圖中的一個命名項中。這些折疊的狀態組稱為子狀態機。
??你可以通過右鍵單擊Animator Controller窗口內的空白空間并從上下文菜單中選擇create substate machine來創建子狀態機。在編輯器中,子狀態機用一個細長的六邊形表示,以區別正常狀態。

??當雙擊六邊形時,當前編輯器將被清除,以允許你編輯子狀態機,就好像它本身是一個完全獨立的狀態機一樣。窗口頂部的工具條顯示了一個“breakcrumb trail”,以顯示當前正在編輯哪個子狀態機(注意:你可以在其他子狀態機中創建子狀態機,等等).

(1).外部條件
??如上所述,子狀態機只是在編輯器中可視化地折疊一組狀態的一種方式,因此當你裝換到子狀態機時,你必須選擇要連接的狀態之一。

??你將注意到子狀態機中的一個額外狀態,其名稱以up開頭。

??Up狀態表示“outside world”(雙擊回到父狀態機),在視圖中包含子狀態機的狀態機。如果添加從子狀態機的狀態到Up狀態的轉換,將提示你選擇要連接的上層狀態機的狀態之一。

10.Animation Layers
??Unity使用Animation Layers來管理不同身體部位的復雜狀態機。舉個例子,如果你有一個下半身的layer用來行走跳躍,還有一個上半身的layer用來投擲物體/射擊。
??你可以從Animator控制器左上角的layers小部件管理Animation Layers.

??在每個layer上,你可以指定Mask(動畫模型中應用動畫的部分)和Blending類型。Override意味著來自其他層的信息將被忽略,而additive意味著動畫將被添加到前一層之上。
??你可以通過在小部件上方按下+添加一個新Layer。
??Mask屬性用于指定此層上使用的掩碼。例如,如果你想運行一個模型上半身的扔的動畫,并且你的角色在同一時間,還能走路,跑步或者站立,你可以使用一個遮罩在模型上半身投擲動畫的Layer中,定義如下:

??Layer側欄中可以看到一個“M”符號,表示該層應用了遮罩。
(1).Animation Layer syncing
??有時,能夠在不同的層重用相同的狀態機是很有用的。例如,如果你想要模擬“受傷”的行為,并且用“受傷”的動畫代替“健康”的動畫來進行步行/奔跑/跳躍。你可以單擊其中一個層上的Sync復選框,然后選擇要同步的層。狀態機結構將是相同的,但是狀態所使用的實際Animation clip將是不同的。
??這意味著同步層根本沒有自己的狀態機定義–相反,它是同步層源的一個實例。在同步層視圖中,對狀態機的布局或結構所做的任何更改(例如,添加/刪除狀態或裝換)都是對同步層的源進行的。對同步層唯一的更改是在每個狀態中使用的選定的動畫。
??Timing復選框允許動畫師根據權重調整同步圖層中每個動畫的時長。如果沒有選擇Timing,那么同步層上的動畫將被調整,此時同步層的動畫將拉伸到原始圖層的動畫長度。如果選擇了這個選項,動畫的長度將根據權重取兩個動畫的平衡值。在這兩種情況下(選擇和不選擇),動畫師都會調整動畫的長度。如果沒有被選中,那么原始圖層就是唯一的主圖層,如果被選中,那么就會折中處理。

??一個’S’符號在層的側欄中可見,表示該層是一個同步層。
11.Sole和Mute功能
??在復雜狀態機中,對狀態機的部分部件進行操作預覽是很有用的。為此,你可以使用Mute/Sole功能。Muting意味著裝換將被禁用。Soloed轉換是啟用的,相對于來自其他同一狀態的其他裝換。你可以從Transition Inspector或者State Inspector(推薦)中設置Mute和Sole狀態,在那里你將對該狀態的所有轉換有一個概述。

??Soloed裝換將顯示為綠色,而Muted裝換將顯示為紅色,如下圖:

??在上面的例子中,如果你處于狀態0,那么只有裝換到狀態A和狀態B是可用的

·基本的經驗法則是,如果一個Sole被勾選,從那個狀態的其他過渡將被減弱 ·如果同時選中了Sole和Mute,那么Mute優先。

??已知問題

·controller圖目前并不總是反應引擎內部的mute狀態。

12.Target Matching
??在游戲中,經常會出現這樣一種情況:角色必須以這樣一種方式移動,即一只手或一只腳在某一特定時間落在某一地點。例如角色可能需要跳過墊腳石或跳起來捉住頭頂的橫梁。
??你可以使用Animator.MatchTarget函數來處理這種情況。想象一下,例如,你想要安排一個場景,角色跳到一個平臺上,你已經有了一個Animation clip,叫做Jump up.首先,你需要在Animation clip中找到角色開始起飛的位置,注意,在這種情況下,在規范化時間內,動畫剪輯中的位置是14.1%或0.141.

??你還需要在Animation clips中找到角色即將落地的位置,在本例中是78%或0.78

??有了這些信息,你就可以創建一個腳本來調用MatchTarget,你可以將它附加到模型中:

using UnityEngine; using System; [RequireComponent(typeof(Animator))] public class TargetCtrl:MonoBehaviour {protected Animator animator;public Transform jumpTarget = null;void Start(){animator = GetComponent<Animator>();}void Update(){if(animator){if(Input.GetButton("Firel")){animator.MatchTarget(jumpTarget.position,jumTarget.rotation,AvatarTarget.LeftFoot,new MatchTargetWeightMask(Vector3.one,1f),0.141f,0.78f);}}} }

??腳本將移動角色,使其跳出當前位置,左腳著地。請記住,使用MatchTarget的結果通常只有在游戲玩法中的正確點調用才有意義。
13.Inverse Kinematics(IK)
??大多數動畫是通過旋轉骨骼中的關節角度產生的。子關節的位置隨其父關節的旋轉而變化,因此,一個關節鏈的終點可以從它所包含的各個關節的角度和相對位置來確定。這種擺骨骼姿勢的方法被稱為 forward kinematics(正運動學).
??然而,從相反的角度來看待擺放關節的目的是很有用的–給定一個在空間中選定的位置,向后移動,找到一個有效的方法來定位關節,使終點落在那個位置。當你想讓一個角色在用戶選擇的點觸碰一個物體,或者讓它的腳在凹凸不平的表面上站穩時,這是非常有用的。這種方法被稱為Inverse Kinematics(逆運動學:IK),在Mecanim中支持具有正確配置的humanoid角色。

??為了設置一個角色的IK,你通常在場景周圍有一個角色與之交互的對象,然后通過腳本設置IK,特別是動畫功能,比如:SetIKPositionWeight,SetIKRotationWeight,SetIKPosition,SetIKRotation,SetLookAtPosition,bodyPosition,bodyRotation.
??在上面的插圖中,我們展示了一個角色抓取一個圓柱形物體。我們如何讓這一切發生?
??我們從一個具有有效Avatar的角色開始。
??接下來創建一個Animator Controller,其中至少包含一個角色的動畫。然后在Animator窗口的Layers面板中,點擊層的鋸齒狀設置圖標,選中彈出菜單中的IK Pass復選框。

??確保Animator Controller被分配給角色的Animator組件。

??接下來,將一個腳本附加到它上,它實際負責處理IK,我們將其稱為IKControl.這個腳本設置了角色右手的IK目標,以及它的外觀位置,使它看起來像它所持有的對象。

using UnityEngine; using System; using System.Collections; [RequireComponent(typeof(Animator))] public class IKControl:MonoBehaviour {protected Animator animator;public bool ikActive = false;public Transform rightHandObj = null;public Transform lookObj = null;void Start(){animator = GetComponent<Animator>();}void OnAnimatorIK(){if(animator){if(ikActive){if(lookObj != null){animator.SetLookAtWeight(1);animator.SetLookAtPosition(lookObj.position);}if(rightHandObj != null){animator.SetIKPositionWeight(AvatarIKGoal.RightHand,1);animator.SetIKRotationWeight(AvatarIKGoal.RightHand,1);animator.SetIKPositon(AvatarIKGoal.RightHand,rightHandObj.position);animator.SetIKRotation(AvatarIKGoal.RightHand,rightHandObj.rotation);}}else{animator.SetIKPositionWeight(AvatarIKGoal.RightHand,0);animator.SetIKRotationWeight(AvatarIKGoal.RightHand,0);animator.SetLookAtWeight(0);}}} }

??由于我們不打算讓角色的手觸及物體的中心(圓柱體的樞軸點),所以我們將一個空對象(在本例中稱為“Cylinder Grab Handle”)放置在物體應該放在圓柱體上的位置,并相應的旋轉它。然后手瞄準這個子對象。

??這個“grab handle”游戲對象應該被指定為IKControl腳本的“Right Hand Obj”屬性。
??在本例中,我們將look目標設置為圓柱體本身,因此該角色直接朝對象的中心,盡管句柄接近底部。

??進入游戲模式,你會看到IK變成了現實。在單擊IKActive復選框時觀察角色抓取和松開對象,并嘗試在playmode中移動圓柱體以看到手臂和手跟隨對象。
14.Root Motion-它是如何工作的
(1).Body Transform
??Body Transform是角色的重心。在Mecanim的重定位引擎中使用,提供了最穩定的位移模型。Body Orientation是相對于Avatar T-Pose姿勢的上下身體方向的平均值。
??Body Transform和Orientation存儲在Animation Clip中(使用Avatar中建立的肌肉定義)。它們是Animator Clip中唯一保存的世界空間曲線。其他的一切:肌肉曲線和IK目標(手和腳)是相對于body transform存儲的。
(2).Root Transform
??Root Transform是Body Transform在Y平面上的投影,在運行時計算。在每一幀,計算Root Transform的變化。然后將轉換中的更改應用到游戲對象,使其移動。

(3).Animation Clip Inspector
??Animation Clip Editor settings-Root Transform Rotation,Root Transform Position(Y)以及Root Transform Position(XZ)-讓你控制Root Transform投影從Body Transform.根據這些設置Body Transform轉換的某些部分可能被轉移到Root Transform.例如,你可以決定是否將運動Y位置作為Root Motion(軌跡)的一部分,還是作為體位(body transform)的一部分,這就是所謂的Baked into Pose.

??以下如果太繞可查看參考資料【Root Motion深度解析】
(4).Root Transform Rotation

Bake into Pose:方向將停留在body transform(或者pose)上。Root Qrientation是常數,以及方向是恒等的。這意味著游戲對象不會被Animation Clip旋轉。只有類似啟動和停止Root Qrientation才應該使用這個選項。在UI中會有一個綠燈告訴你Animation clip是一個很好的候選。一個合適勾選這個選項的情景是,步行或者跑步動畫。 Based Upon:這允許你設置Clip的方向。使用Body Orientation,clip將定向跟隨身體的向前矢量。這種默認設置對于大多數運動捕捉(Mocap)數據(比如行走,跑步和跳躍)都很有效,但是如果運動垂著與身體的向前向量,就會像掃射一樣失敗。在這些情況下,你可以使用偏移設置手動調整方向。最后在導入clip,你將發現原始的自動添加了編輯的偏移。它通常和keyframed數據一起使用,以尊重美術設定的方向。 Offset:用于在選擇了BaseUpon后輸入偏移量。

(5).Root Transform Position (Y)

這使用了跟Root Transform Rotation相同的概念 Bake Into Pose:運動的Y分量將停留在Body Transform(姿勢上)。Root Transform變換的Y分量是常數,Delta Root PositionY是0.這意味著clip不會改變游戲對象的高度。同樣的,UI上會有一個綠燈告訴你,一個clip是一個很好的候選將Y軸的運動烘焙到pose中。大多數AnimationClips將啟用這個設置。只有會改變游戲對象高度的clip應該關閉這個功能,比如跳上或調下。 注意:Animator.gravityWeight是由Bake Into Pose position Y驅動的。啟用時,gravityWeight = 1,禁用時,gravityWeight=0,在狀態之間切換時,clip中的gravityWeight會混合。 Based Upon:跟Root Transform類似,你可以從Original或者Mass Center(Body)中選擇。還有一個Feet的選項,這對于AnimationClips是非常方便的,它可以改變高度(禁用Bake Into Pose時)。當使用Feet,Root Transform Position Y將匹配所有幀中最低的腳的Y值。因此,混合點始終保持在腳的周圍,以防止當混合或過渡時的浮動問題 Offset:與Root Transform Rotation類似,你可以使用Offset設置手動調整AnimationClip高度

(6).Root Transform Position(XZ)

同樣,這使用了Root Transform Rotation和Root Motion Position(Y)中描述的相同概念。 Bake Into Pose:通常用于"Idles“,當你想強力使Position(XZ)的delta為0時。在多次評價后,可以防止delta的累積漂移。它也可以用于一個keyframe clip在Base Upon Original時,強力編輯位置為美術的設置。

(7).Loop Pose
??Loop Pose(就像在Blend Trees中的Pose Blending或者Transitions)發生在Root Transform的引用中。一旦計算出Root Transform,Pose將會與它相對應。計算了開始幀和結束幀之間的相對Pose插值,分布在從0到100%的clip范圍內。
(8).Generic Root Motion 以及 Loop Pose
??它的工作原理和Humanoid Root Motion基本相同,但是它沒有使用Body Transform來計算Root Transform,而是使用Root Node.Pose(所有在Root Motion骨骼下變形的骨骼)都是相對于Root Transform變化形成的

15.教程:為"in-place"humanoid動畫編寫Root Motion腳本
??有時候你的動畫是"in-place(原地)“的,這意味著如果你把它放在一個場景中,它不會移動到它所在的角色。換句話說,動畫不包含"root motion”.為此,我們可以從腳本修改root motion.按照下面的步驟將所有東西組合在一起(注意,實現相同的結果有很多不同的方法,這只是一個方法).

·打開包含"in-place"動畫的FBX文件的Inspector,并轉到animation選項卡 ·確保Muscle Definition設置為你想要控制的角色(假設這個角色被稱為Dude,并且它已經被添加到Hierarchy視圖中) ·從可用的clip中選擇Animaion clip ·確保Loop Pose正確對齊(旁邊的燈是綠色的),并單擊Loop Pose復選框

·在animation視圖中預覽動畫,以確保動畫的開始和結束平滑對齊,并確保角色正在“原地”移動 ·在動畫剪輯上創建一條曲線來控制角色的速度(你可以從Animation Import inspector Curves->+中添加一條曲線) ·給這條曲線取個有意義的名字,比如"Runspeed"

·創建一個新的Animator Controller(我們稱之為RootMotionController) ·將所需的動畫剪輯放入其中,這將創建一個具有動畫名稱的狀態(比如Run) ·向與曲線同名的Controller添加一個參數(在本例中為"Runspeed")

·選擇Hierarchy中的角色Dude,其Inspector應該具有Animator組件 ·將RootMotionController拖放到動畫器的控制器屬性上。 ·如果你現在按下play,你會看到"Dude"在原地跑著。

??最后,為了控制運動,我們需要創建一個腳本來實現OnAnimatorMove回調。

using UnityEngine; [RequireComponent(typeof(Animator))] public class RootMotionScript:MonoBehaviour {private void OnAnimatorMove(){Animator animator = GetComponent<Animator>();if(animator){Vector3 newPosition = transform.position;newPosition.z = animator.GetFloat("Runspeed") * Time.deltaTime;transform.position = newPosition;}} }

??你應該附加RootMotionScript.cs指向"Dude“對象。這樣做時,Animator組件將檢測到腳本具有OnAnimatorMove函數,并顯示由script處理的Apply Root Motion屬性。

16.Blend Trees
??在游戲動畫中一個常見的任務是混合兩個或多個相似的動作。也許最著名的例子是根據角色的速度混合了行走和奔跑的動畫。另一個例子是一個角色在奔跑時向左或向右傾斜。
??區分Transitions和Blend Trees是很重要的。雖然兩者都是用來創建平滑的動畫,他們是用于不同的情況。

·Transitions(轉換)用于在給定的時間內平穩地從一個動畫狀態過渡到另一個動畫狀態.Transitions被指定為動畫狀態機的一部分。從一個motion過渡到一個完全不同的motion通常是好的,如果轉換是快速的。 ·Blend Trees用于允許多個動畫平滑的混合,通過不同程度地合并它們的部分。每個動作對最終效果的貢獻大小由混合參數控制,它只是與Animator Controller相關的數字動畫參數之一。為了使混合motion有意義,混合的motion必須具有相似的性質和時間。Blend Trees是Animation State Machine中一種特殊的狀態類型。

??類似動作的例子可以是各種各樣的行走和奔跑動畫。為了使混合效果更好,clip中的動作必須在相同的時間點進行。例如。可以將步行和跑步動畫對齊,使腳與地面接觸的時刻在相同的時間點發生(例如,左腳在0.0處,右腳在0.5處),由于使用的是normalized時間,因此clip的長度是否不同并不重要。

(1).使用Blend Trees

要開始使用新的Blend Tree,你需要: 1.右鍵單擊Animator Controller窗口上的空白區域 2.從出現的上下文菜單中選擇Create State->From New Blend Tree 3.雙擊Blend Tree以進入Blend Tree Graph

??Animator窗口現在顯示了整個Blend Tree,而Inspector顯示當前選中的節點以及其直接子節點。

??要將Animation Clips添加到Blend Tree中,你可以選擇Blend Tree,然后在Inspector中的motion字段中單擊加號圖標。

??或者,你可以通過右鍵單擊Blend Tree,并從上下文菜單中選擇添加animation clips或者子混合節點。

??當用Animation clips和輸入參數設置Blend Tree時,Inspector窗口將顯示當數值發生變化時動畫是如何組合的(當拖動滑塊時,樹根節點上的箭頭將改變其陰影以顯示主導Animation Clip)

??你可以選擇Blend Tree中的任何節點,以便在Inspect中檢查它。如果選擇的節點是Animation Clip,則會顯示該Animation Clip的Inspector.如果從模型導入動畫,設置將是只讀的。如果該節點是一個Blend Node,將顯示Blend Nodes的Inspector.
??你可以從Blend Type菜單中選擇1D或2D混合。
(2).Blend Trees以及Root Motion
??動畫之間的混合使用線性插值處理(例如,每個動畫的數量是由混合參數加權的獨立動畫的平均值)。你應該注意到Root Motion不是以相同的方式插值的。

17.1D Blending
??Blend Node在Inspector中的第一個選項時Blend類型。這個下拉菜單用于選擇可以根據一個或兩個參數進行混合的不同混合類型之一。1D Blending根據單個參數混合子motions.
??在設置混合類型之后,首先需要選擇控制這個Blend Tree的動畫參數。在本例中,參數為方向,在-1.0(左)和+1.0(右)之間變化,0.0表示不傾斜的直線運行。
??然后,你可以通過單擊“+”按鈕并從彈出菜單中選擇add Motion Field添加單個動畫。當你完成時,它應該看起來像這樣:

??Inspector頂部的圖標顯示了當參數在其最小值和最大值之間變化時,每個子motion的影響。每個motion顯示為一個小的藍色金字塔(第一個和最后一個只顯示了一半),如果你點擊并按住其中一個鼠標左鍵,響應的motion在下面的motion列表中高亮顯示。每個金字塔的峰值定義了motion有充分影響的參數值,即其動畫權重為1,其他動畫權重為0.這也被稱為motion的閾值(threshold)

??紅色的豎線表示參數的值。如果你在Inspector底部的預覽中按下Play,并在圖表中左右拖動紅色條,你可以看到參數的值如何控制不同motion的混合。
(1).Parameter Range
??混合樹所使用的參數范圍如下圖所示,為左邊和右邊兩個數字。它們中的任何一個都可以通過點擊數字和用鼠標左右拖動來改變。注意,這些值對應于motion列表中第一個和最后一個motion的閾值。
(2).Thresholds
??你可以通過單擊圖表中相應的藍色金字塔并將其向左或向右拖動來更改motion閾值。如果“Automate Thresholds”切換不啟用,你還可以通過在閾值列中的number字段中鍵入數字來編輯motion列表中的motion的閾值。
??motion列表下面是復選框自動閾值。啟用它將在參數范圍內均勻分布motion閾值。例如,如果有5個剪輯,并且參數范圍在-90到+90之間,那么依次將閾值設置為-90、-45、0、+45和+90.
??Compute Thresholds下拉列表將從Animation Clips中的root motions獲得的數據設置閾值。可供選擇的數據是速度,速度x,速度y,或速度z,以及角度或弧度的角速度。如果參數對應于這些屬性中的一個,則可以使用compute threshold下拉列表來計算閾值。

PropertyFunction
Speed根據速度(速度大小)設置每個motion的閾值
Velocity X根據velocity.x設置每個motion的閾值
Velocity Y根據velocity.y設置每個motion的閾值
Velocity Z根據velocity.z這只每個motion的閾值
Angular Speed(Rad)根據每個motion的角速度(以弧度/秒為單位)設置閾值
Angular Speed(Deg)根據每秒鐘角度的角速度設置每個motion的閾值

??例如:你有一個walk動畫每秒1.5個單位,慢跑速度為每秒2.3個單位,跑步速度為每秒4個單位,從下拉菜單中選擇Speed選項將根據這些值設置三個動畫的參數范圍和閾值。
18.2D Blending
??Blend Node節點檢查器中的第一個選項時Blend Type.這個下拉菜單的選擇可以根據一個或兩個參數進行混合的不同混合類型之一。2D混合類型根據兩個參數對子motion進行混合。
??不同的2D混合類型有不同的用途。它們在計算每個motion的影響方面有所不同。

2D Simple Directional:當你的動作代表不同的方向時最好用,比如“向前走”、“向后走”、“向左走”、“向右走”,或者“向上瞄準”,“向下瞄準”,“向左瞄準”,“向右瞄準”。可選的,在位置(0,0)的單個動作可以包括在內,例如"idle"或者“ain straight”。在Simple Directional類型中,同一個方向不應該有多個動作,比如“向前走”和“向前跑” 2D Freeform Directional:當你的動作代表不同的方向時,也可以使用這種混合類型,但是你可以在同一個方向有多個動作,例如“向前走”和“向前跑”。在Freeform Directional類型中,motions集合始終包含位置(0,0)上的單個motion,例如"idle". 2D Freeform Cartesian:當你的動作不代表不同的方向時最好使用。使用Freeform Cartesian,你的X參數和Y參數可以代表不同的概念,比如角速度和線速度。例如“向前走沒有轉彎”,“向前跑沒有轉彎”,“向前走右轉”,“向前跑右轉”等等。 Direct:這種混合樹可以讓用戶直接控制每個節點的權重。用于面部形狀或隨機idle的混合。

??在設置完Blend Type之后,你需要做的第一件事是選擇兩個控制Blend Tree的Animation Parameters.在這個例子中,參數是velocityX(strafing)和velocityZ(forward speed)
??然后,你可以通過單擊±>add Motion Field向BlendTree添加一個Animation Clip來添加單個動畫。當你完成的時候,它看起來像這樣:

??2D混合中的position類似于1D混合中的thresholds,只是有兩個值而不是一個,對應于兩個參數中的每一個。它們沿水平x軸的位置對應于第一個參數,沿垂直Y軸的位置對應于第二個參數。一個向前行走的動畫可能有0的velocityX和1.5的velocityZ,所以這些值應該輸入到PosX和PosY數字字段中。
(1).The 2D Blending Diagram
??Inspector頂部的圖表顯示了2D混合空間中子motions的位置。motion用藍點顯示。沒有指定Animation Clip或者Blend Tree的motion對混合沒有影響,顯示為灰色點。你可以通過單擊圖表中的點來選擇motion。一旦選定,該motion對混合空間中的每個點的影響將被視為藍色場。motion位置下的場最強,motion影響最大,即動畫權值為1,其他動畫權值為0.再遠一點,隨著其他motion的影響逐漸減弱。

??紅點表示兩個參數的值。如果你在Inspector底部的預覽中按下Play并拖動圖表中的紅點,你可以看到參數的值如何控制不同motion的混合。在這個圖中,你也可以看到每個motion的影響被表示為每個motion的圓周。你會發現,如果你把代表motion的藍點上的紅點移動,這個motion的圓就會得到它的最大半徑,而其他motion的圓就會縮小到零。在處于幾個motion之間的位置,附近的多個motion將會混合產生影響。如果你選擇一個motion來觀察這個motion的藍色影響場,你可以看到當你移動紅點的時候,這個motion的圓的大小和不同位置的影響場的強度是一致的。
??當沒有選擇motion時,這個圖顯示了所有的影響場的混合,在單一motion占主導的情況下是更藍的,而在許多motion導致混合的情況下相對不那么藍。
(2).Positions
??你可以通過單擊圖中對應的藍點并拖動它來更改motion的位置。你還可以通過在PosX和PosY列中的number字段中鍵入數字來編輯motion在motion列表中的位置坐標。
??Compute Positions下拉菜單將根據Animation clip中的root motions獲得的數據設置位置。可供選擇的數據是速度,速度x,速度y,或速度z,以及角度或弧度的角速度。如果你的一個或兩個參數對應于這些屬性中的一個,你可以使用Compute Positions下拉菜單計算Pos X和PosY.

PropertyFunction
Velocity XZ根據每個motion的velocity.x設置每個motion的PosX,根據每個motion的velocity.z設置PosY
Speed And Angular Speed根據角速度(以弧度/秒為單位)設置每個motion的PosX,根據速度設置每個motion的PosY

??此外,你可以通過選擇Compute Position->X Position From和/或Compute Position->Y Position From來混合和匹配,每次只計算其中一個位置,而不改變另一個位置。

PropertyFunction
Speed根據每個motion的速度(速度的大小)設置每個motion的PosX或PosY
Velocity X根據velocity.x設置每個motion的PosX或PosY
Velocity Y根據velocity.y設置每個motion的PosX或PosY
Velocity Z根據velocity.z這只每個motion的PosX或PosY
Angular Speed(Rad)根據每個motion的角速度(以弧度/秒為單位)設置每個motion的PosX或PosY
Angular Speed(Deg)根據每個motion的角速度(以角度/秒為單位)設置每個motion的PosX或PosY

??例如,你的參數對應于橫向速度和向前速度,你有一個平均速度(0,0,0)的空閑動畫,一個帶有(0,0,1.5)的步行動畫,以及兩個速度分別為(-1.5,0,0,0)和(1.5,0,0)的strafe動畫。從下拉菜單中選擇速度XZ選項,將根據速度的X和Z坐標設置motion的位置。
19.Direct Blending
??使用Direct Blend Tree允許你將animator參數直接映射到Blend Tree子對象的權重。如果你想精確地控制正在混合的各種動畫,而不是使用一個或兩個參數間接地混合他們(在1D和2DBlend Tree的情況下),這可能是有用的。

??當設置一個Direct Blend Tree時,Inspector允許你向motion列表添加motion.然后應該為每個motion分配相應的參數,以直接控制它在樹中的混合權重。
??實際上,這種Direct模式簡單地繞過了交叉衰減,或者各種2D混合算法(Freeform Directional,Freeform Cartesian等),并允許你實現任何你想要控制混合動畫混合的代碼。
??這對于混合面部表情的混合變形動畫或混合添加的動畫特別有用。

20.其他Blend Tree選項
??下面的選項對于1D和2D混合都是通用的。
(1).Time Scale
??你可以使用animation speed數字字段(頂部帶有時鐘圖標的列)來修改animation clip的“自然”速度,因此你可以使用2.0的值使行走速度增加一倍。Adjust Time Scale > Homogeneous Speed按鈕重新調整clips的速度,使其與所選的參數的最小值和最大值相對應,但保持最初的相對速度不變。
??注意:只有當所有的motion都是animation clip時,才可以使用“Adjust Time Scale”,而子節點不能是Blend Tree。
(2).Mirroring
??你可以在motion列表中鏡像任何humanoid Animation Clip,方法是讓鏡像在最右邊切換。這個特性使你可以在原始格式和鏡像版本中使用相同的動畫,而不需要兩倍的內存和空間。

21.Animation Blend Shapes
(1).美術準備
??一旦你在Maya設置了BlendShapes

·將你的選擇導出到fbx,確保選中動畫框,并且需要blend Shape的模型選中blend Shape ·將fbx文件導入unity(assets->import new assets->[name of file].fbx) ·把asset拖放到hierarchy窗口中。如果在hierarchy中選擇對象并在inspector中查看,你將看到Blend Shapes在SkinnedMeshRenderer組件下列出。在這里,你可以將blend shape的影響調整為默認形狀,0表示benld shape沒有影響,100表示blend shape完全影響。

(2).在Unity創建動畫
??也可以在Unity中使用Animation窗口來創建blend animation,步驟如下:

·在Window->Animation->Animation下打開Animation窗口 ·在窗口的左邊點擊"Add Curve",添加一個blend shape,它將在skinned mesh renderer下。

??從這里你可以操作keyframes和blend weights來創建所需的動畫。
??一旦你完成了你的Animation編輯,你可以在編輯器窗口點擊Play或在Animation窗口預覽你的動畫。
(3).腳本訪問
??還可以使用GetBlendShapeWeight和SetBlendShapeWeight等函數通過代碼設置混合權重。
??通過訪問blendShapeCount變量以及其他有用的函數,還可以檢查Mesh上有多少blend shapes.
??下面是一個代碼示例:當附加到一個包含3個或3個以上blend shape的gameobject時,它將一個默認shape混合成另外兩個blend shape.

using UnityEngine; using System.Collections; public class BlendShapeExample:MonoBehaviour {int blendShapeCount;SkinnedMeshRenderer skinnedMeshRenderer;Mesh skinnedMesh;float blendOne = 0f;float blendTwo = 0f;float blendSpeed = 1f;bool blendOneFinished = false;void Awake(){skinnedMeshRenderer = GetComponent<SkinnedMeshRenderer>();skinnedMesh = GetComponent<SkinnedMeshRenderer>().sharedMesh;}void Start(){blendShapeCount = skinnedMesh.blendShapeCount;}void Update(){if(blendShapeCount > 2){if(blendOne < 100f){skinnedMeshRenderer.SetBlendShapeWeight(0,blendOne);blend0ne += blendSpeed;} else{blendOneFinished = true;}if(blendOneFinished == true && blendTwo < 100f){skinnedMeshRenderer.SetBlendShapeWeight(1,blendTwo);blendTwo += blendSpeed;}}} }

22.Animator Override Controllers
??Animator Overrider Controller是一種asset類型,允許你擴展現有的Animator Controller,替換特定的動畫,但保留原始結構、參數和邏輯。
??這允許你創建相同基本狀態機的多個變體,但每個變體使用不同的動畫集。例如,你的游戲可能有各種各樣的NPC類型生活在世界上,但每種類型(小妖精、食人魔、精靈等)都有自己獨特的動作,可用于行走、空轉、坐姿等。
??通過創建一個包含所有NPC類型邏輯的"base" Animator Controller,你可以為每種類型創建一個覆蓋此"base"的狀態機并放入各自的動畫文件。
??下面是一個典型的Animator Controller asset

??下圖代表一個Animator Controller,它包含一個簡單的狀態機,其中混合樹控制四個方向的動畫,加上一個空閑動畫

??為了擴展這個通用的NPC狀態機以使它適用于例如:食人魔角色的獨特動畫,你可以創建一個Animator Override Controller并用食人魔的animation clips替換原始animation clips。食人魔可能有不同的怠速和移動方式,可能是較慢,較沉重或者更肌肉的運動。使用Animator Override Controller,可以在具有不同動畫集的不同角色之間共享如何在不同運動狀態之間進行轉換和混合的基本邏輯,從而減少構建和修改狀態機本身所需的工作
??要創建新的Animator Overrider Controller。使用Assets->Create菜單或Project視圖中的Create按鈕,然后選擇Animator Overrider Controller
??Animator Override Controller具有與Animator Controller非常相似的圖標,只是它在圖標的一角有一個“加號”符號而不是“播放”符號

??在Inspector中選擇新的Animator Override Controller時,它最初沒有分配Animator Controller.如下所示:

??如果使用Override Controller,你需要在Inspector面板將原始controller asset分配給新的Override Controller。完成此操作后,原始控制器中使用的所有動畫將顯示在Override Controller的Inspector面板上。

??可以指定新的Animation Clips覆蓋原始Animation Clips。在此示例中,所有clips都被“Ogre”版本覆蓋。

??這個Override Controller可以在Ogre角色的GameObject的animator組件中使用,就像他是一個Animator Controller一樣。它將與原始的Animator Controller具有相同的邏輯,但播放的是新分配的動畫而不是原始動畫。

23.Retargeting of Humanoid animations
??Mecanim最強大的功能之一是retargeting of humanoid animations。這意味著你可以相對輕松的將同一組動畫應用于各種角色模型。retargeting只適用于配置了Avatar的humanoid模型,因為這樣可以讓我們在模型的骨骼結構之間建立對應關系。
(1). 推薦的Hierarchy結構
??使用Mecanim動畫時,你可以包含以下元素

·導入具有Avatar的角色模型 ·引用Animator Controller asset的Animator組件 ·被Animator Controller引用的Animation Clips ·角色的相關腳本 ·與橘色相關的組件,例如Character Controller

??你的項目還應包含另一個具有有效Avatar的角色模型
??推薦的設置是:

·在Hierachy中創建具有角色相關組件的GameObject

·將模型作為GameObject的子節點與Animator組件一起使用

·確保引用Animator的腳本正在尋找子節點中的Animator而不是根節點的Animator.使用GetComponentInChildren<Animator>()來代替GetComponent<Animator>()。


??為了在另一個模型上重用相同的動畫,你需要

·禁用原始模型 ·將所需模型作為GameObject的另一個子節點放入

·確保新模型的Animator Controller屬性引用相同的controller asset

·調整根節點GameObject上的character controller,transform,以及其他屬性,以確保動畫與新模型平穩運行。


24.性能和優化
(1).Character設置
??骨骼數量
????在某些情況下,你可能需要創建具有大量骨骼的character:例如,當你需要大量可自定義的附件時。這些額外的骨骼增加了構建的大小,并且每個額外的骨骼可能具有相對的處理成本。例如:在通用模式下,已經擁有30個骨骼rig上的15個額外骨骼需要花費50%的時間解決。注意:你可以為Generic和Humanoid類型添加其他骨骼。如果你沒有是引用其他骨骼播放動畫,則處理成本應該可以忽略不計。如果附件不存在或隱藏,則此成甚至更低。
??多個Skinned Meshes
????盡可能合并skinned meshes.將角色拆分為兩個Skinned Mesh Renderers會降低性能。如果你的角色只有一種材質,是比較好的情況,但在某些情況下,你可能需要不止一種材質
(2).Animation系統
??Controllers
????當Controller未設置時,Animator不會花時間處理
??簡單的animation
????使用Animator播放沒有混合的單個Animation Clip比傳統動畫系統更慢。舊的動畫系統對曲線進行采樣并直接寫入變換。Unity的當前動畫系統Animator具有用于混合的臨時緩沖區,并且還可以對采樣曲線和其他數據進行額外復制。當前系統布局已針對動畫混合和更復雜的設置進行了優化。
??Scale Curves
????為Scale設置動畫曲線比動畫的平移和旋轉曲線更耗費性能。為了提高性能,請避免使用縮放動畫。
????注意:這不適用于常量曲線(Animation Clip中值不變的曲線)。常量曲線經過優化,比普通曲線更省性能。與默認場景值具有相同值的常量曲線不會每幀寫入場景。
??Layers
????大多數情況下,Unity都在估算動畫,并將動畫層和動畫狀態機的開銷降至最低。向animator添加另一個Layer(無論是否同步)的成本取決于Layer播放的動畫和blend trees.當Layer的權重為0時,Unity會跳過Layer update。
??Humanoid與Generic動畫類型

·導入Humanoid動畫時,如果不需要IK Goal或者finger動畫,可使用Avatar遮罩(class-AvatarMask)將它們移除。 ·使用Generic時,使用rootmotion比不使用它還耗性能。如果你的動畫不使用root motion,請確保未指定root bone

??場景級優化

·使用hashes而不是字符串來查詢Animator ·實現一個小的AI Layer來控制Animator.你可以使它為OnStateChange,OnTransitionBegin和其他事件提供簡單的回調。 ·使用State Tags可以輕松地將AI狀態機與Unity狀態機匹配 ·使用其他曲線來模擬事件 ·使用其他曲線標記動畫:例如與MatchTarget一起使用

??運行時優化
??(1).Visibility以及Updates
????始終通過將animator的Culling Mode設置為Base on Renderers來優化動畫,并禁用skinned mesh renderer的Update When OffScreen屬性。這樣可以避免Unity在角色不可見時更新動畫。

25.Animator組件
??Animator組件用于將動畫分配給場景中的GameObject。Animator組件需要引用Animator Controller,它定義了要使用的Animation Clip,并控制何時以及如何在它們之間進行混合和轉換。
??如果GameObject是具有Avatar定義的Humanoid角色,則還應在此組件中指定Avatar.如下所示:

??下圖顯示了各種assets(Animation Clips,Animator Controller以及Avatar)如何通過GameObject的Animator組件組合在一起

(1).Properties

Property:Function:
Controller附加到此角色的animator controller
Avatar這個角色的Avatar(如果Animator用于hunmanoidjuese)
Apply Root Motion我們應該從動畫本身還是從腳本控制角色的位置和旋轉
Update Mode這允許你選擇Animator何時更新,以及它應使用的timescale。Normal:Animator和Update調用同步更新,Animator的速度與當前timescale匹配。如果timescale變慢,Animations將減慢以匹配。Animate Physics:Animator與FixedUpdate調用同步更新(即與物理系統鎖定步驟)。如果你的動畫涉及到物理交互,例如:可以推動rigidbody對象的角色,則應使用此模式。Unscaled Time:Animator與Update調用同步更新,單Animator的速度忽略當前timescale,并且無論如何都以100%的速度運行動畫。這對于以正常速度制作GUI系統,同時為了特殊效果修改timescale或暫停游戲是非常有用的
Culling Mode你可以選擇動畫的剔除模式Always Animate:總是運行動畫,即使在屏幕外也不要剔除。Cull Update Transforms:當renderers不可見時,將禁用Retarget,IK,和寫入Transform。Cull Completely:當renderers不可見時,動畫將完全禁用。

(2).Animation curve信息
??Animator組件底部的信息框為你提供Animator Controller使用的所有clips的數據明細
??Animation clip包含“Curves”形式的數據,表示值隨時間的變化情況。這些curves可以描述對象的位置或旋轉,humanoid animation系統中的肌肉的彎曲,或者clip內的其他動畫值,諸如改變的material顏色
??下圖表示每個數據項代表的內容

LabelDescription
Clip Count分配給此Animator Controller的animation clips總數
Curves(Pos,Rot&Scale)用于表示對象的位置、旋轉或縮放的動畫曲線總數。這些是用于不屬于標準humanoid rig的動畫對象。在為humanoid avatar設置動畫時,這些曲線會顯示額外非肌肉骨骼的計數,例如尾巴、飄逸的布料或懸掛的吊墜。如果你有humanoid動畫并且你注意到意外的非肌肉animation curves,則你的動畫文件中有不必要的動畫曲線。
Muscles此Animator用于humanoid animation的肌肉動畫曲線的數量。這些是用于為標準humanoid avatar肌肉制作動畫的曲線。除了Unity標準avatar的標準肌肉運動外,還包括兩條"muscle curve",用于存儲root motion位置和旋轉動畫。
Genericanimator用于為其他屬性(例如material color)設置動畫的數字(float)曲線的數量
PPtrsprite動畫曲線的總數(由Unity的2d系統使用)
Curves Count動畫曲線的總合計數
Constant優化為常量(不變)值的動畫曲線數。如果動畫文件包含具有不變值的曲線,Unity會自動選擇此選項
Dense使用"dense"存儲數據的方法優化的動畫曲線的數量(線性插值的離散值).與"stream"方法相比,此方法使用的內存少得多
Stream使用存儲數據的"stream"方法的動畫曲線的數量(具有時間的值和用于曲線插值的切線數據)。該數據比"dense"方法占用更多的內存

??如果導入Animation clips時Animation import reference中的"Anim Compression"設置為"Optimal",Unity將使用啟發式算法來確定使用dense還是stream存儲每條曲線的數據。

26.Animator Controller
??Animator Controller允許你為角色或者對象排列和維護一組Animation Clips以及關聯的Animation Transitions。在大多數情況下,擁有多個動畫并在某些游戲條件發生時在它們之間切換是正常的。例如,只要按下空格鍵,你就可以從步行Animation Clip切換到跳躍Animation Clip。即使你只有一個Animation Clip,仍需要將其放入Animator Controller中以在GameObject上使用它。
??Animator Controller引用了Animation Clips,并使用狀態機管理各種動畫片段和它們之間的過渡,可以將其視為Animation Clip的流程圖或者用Unity的可視化編程語言編寫的簡單程序用于控制動畫間的過渡。

??當你使用Animation窗口開始設置GameObject動畫時,或者將Animation Clip附加到GameObject時,Unity會自動創建Animator Controller。
??要手動創建Animator Controller,請右鍵單擊Project窗口,然后單擊Create->Animator Controller。

(1).Navigation(導航)
??使用鼠標上的滾輪或等效項放大和縮小Animator Controller窗口。
??要關注Animator Controller的某個地方時,可以選擇一個或多個狀態(單擊或拖動要選擇的狀態周圍的選擇框),然后按F鍵放大選擇。

??按A鍵使所有Animation states適合Animator Controller視圖
??Unity會保留你之前的選擇。按A鍵和F鍵可在所選動畫狀態和整個Animator Controller之間切換。

??在Play Mode期間,Animator會平移視圖,以便始終可以看到正在播放的當前狀態。Animator Controller尊重基本層和子狀態機的獨立縮放因子,窗口自動平移以確保活動狀態的可見性。
??要做Play Mode下修改縮放大小,可以用以下步驟

·在Animator Controller窗口中啟用Auto Live Link ·點擊Play按鈕進入Play Mode ·點擊Pause ·在Animator Controller中,選擇要放大的states ·按F鍵放大你選擇的states ·再次單擊Play按鈕可恢復PlayMode

27.創建Animator Controller
(1).Animator Controller
??你可以從Animator Controller視圖(菜單:Window->Animation->Animator)查看和設置角色行為。
??可以創建Animator Controller的各種方法

·從Project視圖選擇Create->Animator Controller ·右鍵單擊Project View 并選擇Create->Animator Controller ·從Assets菜單中選擇Assets->Create->Animator Controller

??他在磁盤上創建了一個.controller asset.在Project窗口中,圖標如下所示:

(2).Animation窗口
??完成狀態機設置后,你可以將控制器拖放到Hierarchy視圖中具有Avatar的任何橘色的Animator組件上。
??Animator Controller窗口包含:

·Animation Layer Widget(左上角) ·Event Parameters Widget(左上角) ·狀態機本身的可視化視圖


??Animator Controller窗口將始終顯示最近選擇的.controller asset的狀態機,無論當前加載的是什么場景

28.Animation States
??Animation States是Animation State Machine的基本構建塊。每個狀態都包含一個單獨的動畫序列(或者blend tree),當角色處于該狀態時,它將播放。當游戲中的事件觸發狀態轉換時,角色將處于新狀態,并使用新狀態的動畫序列。
??在Animator Controller中選擇狀態時,你將在Inspector中看到該狀態的屬性。

PropertyFunction
Speed動畫的默認速度
Motion分配給此狀態的Animation Clip
Foot IK是否需要Foot IK的狀態,適用于Humanoid animations
Write DefaultsAnimatorStates是否回寫未通過其Motion動畫的屬性的默認值(退出當前狀態時,恢復之前的值)
Mirror動畫是否需要鏡像。這僅適用于Humanoid animations
Transitions源自此transitions的轉換列表

??以棕色顯示的默認狀態是狀態機首次激活時的狀態。如果有必要,可以通過右鍵單擊其他狀態,并從右鍵菜單中選擇"Set As Default"來更改默認值。sole和mute復選框用于控制動畫預覽的行為。
??通過右鍵單擊Animator Controller窗口中的空白區域并從上下文菜單中選擇Create State->Empty,可以添加新狀態。或者你可以將動畫拖動到Animator控制器窗口中以創建包含該動畫的狀態。(注意,你只能將Mecanim動畫拖動到Controller中-非Mecanim動畫將被拒絕。)
(1).Any State
??Any State是一個永遠存在的特殊狀態。它適用于你想要進入特定狀態的情況,無論你當前處于哪個狀態。這是向狀態機中的所有狀態添加相同向外轉換的簡便方法。注意,Any State的特殊含義意味著它不能成為轉換的終點(即跳轉到"any state"不能用作選擇隨機狀態進入下一個的方式)

29.Animation transitions
??Animation transitions允許狀態機從一種動畫狀態切換或混合到另一種動畫狀態。Transitions不僅定義了狀態之間的混合應該持續多長時間,而且還定義他們應該在什么條件下激活。你可以設置僅在特定條件為真時才發生轉換。要設置這些條件,可以在Animator Controller中指定參數值。
??例如,你的角色可能具有“巡邏”狀態和“休眠”狀態。你可以將巡邏和休眠之間的轉換設置為僅在“alertness”參數值低于某個級別時才會發生。

??要為transitions命名,可在字段中鍵入名稱,如下所示

??狀態的Inspector窗口顯示狀態使用的transitions,如下所示:

??在任何給定時間只能有一個transition活動。但是,如果設置為允許中斷,那么當前活動的transition可能會被另一個transition中斷。

(1).Transition properties
??要查看transition屬性,可單擊Animator窗口中連接兩個狀態的過渡線。屬性將顯示在Inspector窗口

??使用以下屬性調整transition以及它在當前狀態和下一狀態之間的混合方式

PropertyFunction
Has Exit TimeExit Time是一種不依賴于參數的特殊轉換。它依賴于狀態的normalized時間。在Exit Time指定的特定時間進行轉換檢查
Settings折疊菜單包含詳細的transition設置,如下所示
Exit Time如果勾選了Has Exit Time,則此值表示transition生效的確切時間.這用normalized時間表示(例如,exit time為0.75表示在第一幀上播放75%的動畫時,Exit Time時間條件為真).在下一幀,條件為假。對于循環動畫,每個循環都會評估退出時間小于1的transition,因此你可以使用此過程在每個循環的動畫中以適當的時間進行transition.如果exit time大于1,則transition僅會評估一次,因此它們可用于在固定數量的循環后的特定時間退出。例如,在3.5個循環之后,評估exit time為3.5的transition
Fixed Duration如果選中Fixed Duration框,則以秒為單位解釋transition time.如果未選中Fixed Duration,則transition time將被解釋為原狀態的normalized時間的一部分
Transition Durationtransition的持續時間,使用normalized時間還是秒取決于fixed duration的模式,相對于當前狀態的持續時間。這在transition圖中可視化為兩個藍色標記之間的部分
Transition Offset在轉換到的目標狀態中開始播放的時間偏移量。例如,值0.5表示目標狀態在自己的時間軸的50%處開始播放
Interruption Source使用它來控制可能中斷此轉換的環境
Ordered Interruption確定當前轉換是否可以被其他轉換中斷,而與其順序無關
conditionstransition可以具有單個條件,多個條件或根本沒有條件。如果你的轉換沒有條件,Unity Editor只會考慮Exit time,并且在達到Exit time時會發生轉換。如果你對transition具有一個或多個條件,則必須滿足條件才能觸發轉換。條件包括-事件參數(條件中考慮的值)。-條件謂詞(如果需要,例如'less than(小于)'或'greater than(大于)'浮點數)。-參數值如果這個轉換既勾選了Exit Time并且具有一個或多個條件,需要注意,Unity Editor會在達到Exit time后才考慮條件是否為真,這可以確保你在動畫的某個期間發生轉換。

(2).Transition interruption
??使用 Interruption Source和Ordered Interruption可以控制轉換的中斷條件。
??從概念上講,中斷順序的工作方式就好像transitions已排隊,然后解析為從插入的第一個transiton到最后一個transition的有效轉換。
(3).Interruption Source property(可查看【Animator- Interruption Source用法】)
??Any State的transitions始終首先添加到隊列中,然后根據Interruption Source的值,其他transition排隊。

ValueFunction
None不要在添加任何transitions
Current State將transitions從當前狀態排隊
Next State將transitons從下個狀態排隊
Current State then Next State將轉換從當前狀態排隊,然后將其從下一個狀態排隊
Next State then Current State將轉換從下一個狀態排隊,然后從當前狀態排隊

??注意,將Interruption Source設置為None,意味著只能通過Any State的transition之一中斷轉換
(4).Ordered Interruption Property
??Ordered Interruption屬性會更改隊列的解析方式
??根據其值,解析隊列將在下面列出的不同時刻結束

ValueEnds when
Checked已找到有效轉換或當前轉換
Unchecked已找到有效轉換

??只有AnyState轉換可以自行中斷
(5).Transition graph
??要手動調整上面列出的設置,你可以直接在字段中輸入數字或使用transition圖。transition在操作可視元素時修改上述值。

??使用以下方式更改圖表視圖中的transition屬性

·拖動Duration "out"標記以更改Transition Duration ·拖動Duration "in"標記以更改Transition Duration和Exit Time ·拖動Target State以調整Transition Offset ·拖動Preview playback current time以在Inspector底部的預覽窗口中擦除動畫混合。

(6).Blend Tree狀態之間的轉換
??如果屬于此轉換的當前狀態或下一狀態是Blend Tree狀態,則Blend Tree參數將顯示在Inspector中。調整這些值以預覽將Blend Tree設置為不同配置時transition的外觀。如果你的Blend Tree包含不同長度的剪輯,你應該測試在顯示斷剪輯和長剪輯時的過渡效果。調整這些值不會影響transition在運行時的行為方式;它們僅用于幫助你預覽轉換在不同情況下的外觀

30.Animation FAQ
(1).一般的問題
??Mecanim是什么
????Mecanim使我們集成到Unity中的動畫軟件的名稱。在早期的4.x系列的Unity中,它與humanoid角色動畫相關聯,并且它具有許多特別適合此目的的特征,此時它與舊的(現在遺留的)集成動畫系統時分開的。
????Mecanim集成了humanoid animation retargeting,muscle control以及state machine system.Mecanim這個名字來自法語單詞Mec,意思是Guy。由于Mecanim僅使用humanoid角色進行操作,因此仍然需要我們的傳統動畫系統來為Unity中的non-humanoid角色和其他基于關鍵幀的游戲對象動畫制作動畫。
????后來,Unity開發并擴展了Mecanim,將其與動畫系統的其余部分集成在一起,以便它可以用于項目中所有的動畫。現在Mecanim是Unity的主要動畫系統。
??Animation組件和Animator組件的區別
????Animation組件是傳統動畫系統中的動畫的舊組件。它仍保留在Unity中以實現向后兼容,但你不應將其用于新項目,而應改用最新的Animator組件。

??Animation窗口和Animator窗口的區別
????Animation窗口允許你在Unity中創建和編輯Animation Clips.你可以使用它為幾乎可以在Inspector中編輯的每個屬性,如GameObject的position,material的color,light的brightness,sound的volume,甚至是自定義腳本中的任意值制作動畫。
????Animator窗口允許你將現有的Animation Clip assets組織成一個類似流程圖的系統,稱為狀態機。
????這兩個窗口都是我們當前動畫系統的一部分而不是遺留系統。
????也就是說Animation組件是遺留系統的,新項目不應使用。但是Animation窗口是最新的動畫系統的一部分
??我們正在使用傳統動畫系統來制作角色動畫。現在應該使用當前的動畫系統(Mecanim)嗎?
????一般來說是應該的,Unity的傳統動畫系統僅用于向后兼容舊項目,與當前的動畫系統相比,它的功能集非常有限。你使用舊動畫系統的唯一原因是因為舊項目使用了舊的動畫系統

(2).Import
??為什么導入的mesh上附有Animator組件?
????當Unity檢測到導入的文件在其時間軸中有動畫時,它將在導入時添加Animation組件。你可以在asset的導入設置中通過在Rig選項卡下的"Animation Type"設置為"None"來修改此項。如有必要,你可以一次使用多個文件。

(3).Layer
??Layers的排序是否重要?
????重要。將按順序從上到下評估Layers.設置為override的Layer將始終覆蓋先前的Layer(如果它們具有mask,則基于mask).
??base layer的weight是否應始終設置為0,或者使用另一layer時設置為0?
????base layer的weight的值始終為1,override layer將完全覆蓋base layer
??有沒有什么辦法從controller獲取變量值,不使用string?
????你可以使用int來標識states和parameters。使用Animator.StringToHash函數獲取整數標識符值。例如:

runState = Animator.StringToHash("Base Layer.Run"); animator.SetBool(runState,false);

??如果Sync Layer上的狀態與Base Layer中的響應狀態相比具有不同的長度會發生什么?
????如果layer具有不同的長度,則它們將變得不同步。啟用Timing選項以強制當前層根據source layer計算時間。

(4).Avatar Masks
??有沒有辦法創建除LeftFoot,RightFoot,LeftHand,RightHand之外的AvatarIKGoals?
????有,還支持knee以及elbow IK
??有沒有辦法定義哪些transforms是Avatar Mask的一部分
????有,對于通用剪輯,你可以定義導入的transform動畫。對Humanoid clips,始終導入所有human transforms,并且可以定義額外的transforms。

(5).Animations curves
??具有曲線的動畫如何與不具有曲線的動畫混合?
????如果你有一個帶有曲線的動畫和另一個沒有曲線的動畫,Unity將使用連接到曲線的參數的默認值來進行混合。你可以為參數設置默認值,因此當在具有曲線參數的狀態與不具有曲線參數的狀態之間進行混合時,它將在曲線值和默認參數值之間進行混合。要為參數設置默認值,只需在Animator Tool窗口中設置其值,而不再LiveLink中。

四、Animation 術語表
1.Animation Clip術語

TermDefinition
Animation Clip可用于角色動畫或簡單動畫的動畫數據。它可以是一個簡單的“單位運動”,例如:“Idle”,“Walk”,或者"Run"
Animation Curves曲線可以附加到Animation Clips,并由游戲中的各種參數控制
Avatar Mask骨骼中包含或排除的身體部位的規范。用于Animation Layers或者importer中

2.Avatar術語

TermDefinition
Avatar用于將一個骨骼重新定位到另一個骨骼的界面
Retargeting將為一個模型創建的動畫應用于另一個模型
Rigging為mesh構建骨骼關節的skeleton hierarchy。使用外部工具執行,例如:Autodesk?3dsMax?或Autodesk?Maya?。
Skinning將骨骼關節綁定到角色的mesh或者skin的過程。使用外部工具執行,例如:Autodesk?3dsMax?或Autodesk?Maya?。
Muscle definition這使你可以更直觀地控制角色的骨架。當配置Avatar后,Animation系統在muscle空間中工作,這比bone空間更直觀
T-pose角色的手臂伸直到兩側的姿勢,形成一個"T"。角色制作Avatar所需姿勢
Bind-pose角色建模的姿勢
Human template預定義的骨骼映射。用于將FBX文件中的骨骼與Avatar匹配
Translate DoF與選擇相關的三個自由度(movement in X,Y&Z)

3.Animator以及Animator Controller術語

TermDefinition
Animator Component模型上的組件,使用Animation系統為該模型設置動畫。改組件引用了Animator Controller asset來控制動畫
Root Motion角色根的運動,無論是由動畫本身控制還是由外部控制
Animator ControllerAnimator Controller通過具有Animation State Machines和Animation Blend Trees的Animation Layers控制動畫,由Animation Parameters控制。具有Animator組件的多個模型可以引用相同的Animator Controller
Animator WindowAnimator Controller可視化和編輯的窗口。
Animator LayerAnimation Layer包含一個Animation State Machine,用于控制模型或其一部分的動畫。例如,如果你有一個用于行走或跳躍的全身的Layer,以及一個用于上身運動的更高的Layer,例如:投擲物體或射擊。較高的Layer優先于全身的Layer控制身體的部位
Animation State Machine控制Animation States交互的圖形。每個狀態都引用Animation Blend Tree或單個Animation Clip
Animation Blend Tree用于基于float的Animation Parameters的相似Animation Clips之間的連續混合
Animation Parameters用于腳本和Animator Controller之間進行通信。某些參數可以在腳本中設置并由控制器使用,而其他參數基于Animation Clip中的Custom Curves,可以使用腳本API進行采樣
Inverse Kinematics_(IK)_能夠根據世界各種物體控制角色的身體部位

五、概念敘述:
??IK(反向運動):是使用計算父物體的位移和運動方向,從而將所得信息繼承給子物體的一種物理運動方式。以關節連接的物體由一組通過關節連接的剛性片段組成。變換關節的角度可以產生無窮的形狀。正向運動問題的解,是給定這些角度時物體的姿勢。“逆運動學”問題的難度更高的解是給定物體的姿勢時。例如:給定終端效果器(end-effector)的位置時,找到關節的角度。一般情況下,逆運動學問題沒有解析解。但是逆運動學可以通過非線性編程技術來解決。特定的特殊運動鏈–哪些帶有球形腕的–運行運動去耦合。這使得我們可以把終端效果器的朝向和位置獨立的處理,并導致一個高效的閉形式解。

參考資料:
https://docs.unity3d.com/ScriptReference/Animation.html
https://docs.unity3d.com/Manual/AnimationSection.html
https://blog.csdn.net/noahzuo/article/details/53908141
https://docs.unity3d.com/Manual/animeditor-AnimationEvents.html
https://blog.csdn.net/su9257/article/details/54852529
https://docs.unity3d.com/Manual/AnimatorControllers.html
【Root Motion深度解析】https://blog.csdn.net/cubesky/article/details/39478207
https://docs.unity3d.com/Manual/BlendShapes.html
http://manew.com/thread-108208-1-1.html
http://gad.qq.com/article/detail/37643
http://www.taikr.com/article/502
【Animator- Interruption Source用法】https://zhuanlan.zhihu.com/p/36244526

總結

以上是生活随笔為你收集整理的Unity流水账4:动画的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。