unity有兩種動畫系統 一種是用Animator的(unity5以后)的新動畫系統
另一種是用Animation的老動畫系統
Animator適合創建更加復雜的動畫,而Animation創建相對簡單的動畫
對比兩種動畫界面參數
Animation創建的動畫默認是不循環的,而Animator是默認循環的
當我們添加一個clip時,Animation會將該clip添加至Animations列表中,而Animator會將其添加至Controller
一個小坑:當使用Animation時需要在Animation面板中創建動畫而不能在外面創建,在外面創建的動畫默認是給Animator用的動畫
一、老版Animation動畫
老動畫需要用代碼來控制,一些基本的api如下
//1、播放動畫
if (Input.GetKeyDown(KeyCode.Alpha1))
{
anim.Play("1");
}
//* 通常用這種
//2、淡入播放,自動產生過渡效果
//當你播放的動畫開始狀態和當前狀態不一樣時,就會產生過渡效果
if (Input.GetKeyDown(KeyCode.Alpha2))
{
anim.CrossFade("2");
}
//3、前一個播放完再播放下一個
if (Input.GetKeyDown(KeyCode.Alpha3))
{
anim.PlayQueued("3");
}
//4、前一個播放完自動產生過渡效果到下一個動畫
if (Input.GetKeyDown(KeyCode.Alpha4))
{
anim.CrossFadeQueued("4");
}
//5、停止播放所有動畫
anim.Stop();
//6、是否在播放某個動畫
if (anim.IsPlaying("1"))
{
}
//7、播放模式設置
anim.wrapMode = WrapMode.Loop;
//8、==其他 層級和權重以及混合等等
//設置層級
anim["1"].layer = 1;
//設置權重
anim["1"].weight = 1;
//混合模式 疊加還是混合
anim["1"].blendMode = AnimationBlendMode.Additive;
//設置混合組相關的骨骼信息
//anim[""].AddMixingTransform();
動畫事件
在animation面板點擊事件標簽進行設置
需要在腳本中public觸發的方法,可以添加最多一個參數
//動畫事件
public void AnimationEvent()
{
Debug.Log("動畫事件觸發");
}
public void AnimationEvent2(GameObject obj)
{
}
二、Animator有限狀態機動畫
Animator指的是有限狀態機動畫,
有限狀態機是表示有限個狀態在這些狀態之間的轉移和動作等行為的數學模型
它是通過條件來進行狀態的切換的
比如有限狀態機可以做的系統:
動作系統:當滿足某個條件切換一個動作,且動作是有限的
AI系統:當滿足某個條件切換一個狀態
Animator面板窗口
通過導線進行狀態切換時有四種可以設置的變量
float:
int:
bool:bool和trigger看似類似,但bool需要人為切換true or false,trigger打開后會自動關上
trigger:trigger通常用於切換過去時需要判斷,回來時不需要判斷的情況。bool適用於去和回都要進行判斷的情況
此外:這個條件是需要同時滿足才能切換狀態
使用注意事項:
1、在使用anyState切換動畫時 記得將該動畫的can translation to self給取消勾選。(默認勾選 就很坑)然后別忘了添加Exit退出狀態
2、像這樣多個箭頭 代表我們有多個轉換條件,我們可以通過右鍵->make translation的方式添加 然后在下面這個面板進行查看和刪除。每個轉換條件相當於是或的關系。
要注意的是每個轉換條件都需要我們單獨設置參數 如has exit time這些參數
三、2D動畫系統
2D動畫有兩種常規的創建思路,一種是逐幀動畫,另一種是骨骼動畫。
通常骨骼動畫系統也有兩種工作流,一種是使用unity自帶的2D Animation,另一種是使用spine
略...下次再補充
四、模型導出至unity要點
1、使用FBX格式模型
2、注意FBX格式導出規范
參考官方文檔 在 Unity 外部創建資源 - Unity 手冊
導入模型的基本流程
1、美術將制作好的模型導出FBX格式模型資源
2、程序將這些模型資源導入到unity資源文件中
3、在unity內部對這些模型進行設置——模型、骨骼、動作、材質
即在以上面板進行設置
參數解釋:
Scale Factor:用於縮放模型的大小。通常我們縮放模型會在此進行設置,而不是在場景中的scale進行設置(這樣會導致模型降低分辨率)
Read/Write Enbled:通常如果模型需要變形 那就會將其勾上
Generate Colliders:導入模型時自動添加Mesh Collider而不用手動一個個添加了
動畫復用——Avatar化身系統
我們在使用人形骨骼的時候,會使用Avatar化身系統,什么是Avatar化身系統?
即我們可以把一個標准人形動作通過化身系統復用到另一個模型上,只需要我們保證他們的關節對應關系是一致的
只要兩個模型都是人形骨骼,那么他們的動畫就可以進行共有了
我們可以自動或者手動將model和標准model進行匹配
動畫相關:
將動畫導出時建議將模型和動畫文件分別導出
1.導出包含網格信息不包含動作信息模型
2.導出不包含網格信息包含動作信息的動作(模型)文件
具體的導出規則可以參考
1.如何導入外部創建的模型資源
在 Unity 外部創建資源 - Unity 手冊 (unity3d.com)
2.使用多個模型文件來導入動畫
提取動畫剪輯 - Unity 手冊
我們在使用其他人的美術模型資源時,將動畫導入進來可能會遇到以下幾種情況
1、動畫和模型保存在一起。如果是多個動畫存放在一個動畫模型中,那么我們還需要對其進行切割。
2、帶動畫的模型和骨骼模型分開保存,這樣我們看來好像導入了好多角色模型,但實際上動畫模型會不包含模型骨骼信息。
3、動畫單獨保存為clip且和模型分開保存
(如果是切割完的動畫 它的命名格式通常是這樣的“模型名+@+動畫名”)
Animator狀態機連線
參數:
Has Exit Time:如果兩個動畫轉換不需要過渡,那么我們就直接取消勾選就行。但是需要自動轉換狀態的動畫 我們一定要將它勾選上
使用分層和遮罩
利用動畫分層我們可以做到
1.上下半身播放兩個動畫進行組合,比如上半身扔炸彈,下半身待機移動蹲下
2.快速制作正常狀態和受傷狀態的動作切換
在animator面板中制作兩個layer層——>次層級使用同步其它層的設置同步主層——>根據需求設置動畫遮罩——>通過調節權重來更改動畫
animator.SetLayerWeight(animator.GetLayerIndex("MyLayer2"), 1);
其他一些動畫相關API
將Animator中的動畫String名稱轉為int類型 的id,通常我們將這個寫在Start生命周期中,便於我們修改
Animator.StringToHash
返回 AnimatorStateInfo,其中包含有關當前或下一個狀態的信息。通常可以幫助我們獲取或者判斷當前動畫狀態信息
Animator.GetCurrentAnimatorStateInfo
Animator.GetNextAnimatorStateInfo
動畫事件
我們有兩個地方可以添加動畫事件
一個是Animation面板
直接在上面添加事件后選中事件和我們選中攜帶Animator物體后后再點擊事件他們的面板是不一樣的(我們給具體的某個角色動畫添加事件時 需要在角色的Animation面板中找到該動畫)
選中角色的該動畫 可以直接設置為角色身上的腳本的某個public的函數
不選中角色后的該動畫 相當於每個用這個事件的角色都附帶了這個事件效果
Event參數中Function就是我們角色腳本中的一個函數(要記得設置腳本)
float、int、string、Object這些就是我們要傳遞的數據
另一個設置動畫事件的地方在我們的動畫模型中
等有其他新內容再添加...