動畫導入
美工做好的模型,直接將文件夾拖進來就導入好了。導入模型后,檢查模型的材質貼圖等是否丟失,若丟失,根據名字補上。如果美工取名規范,一一對應的話,就很簡單。如果不是,那就呵呵噠。
有的美工做的比較差,所有模型的動畫都在一個上面,需要我們后續的動畫分割,遇到這種,嗯,心里罵罵就好了。但是,作為一個程序,分割動畫真的好麻煩的好吧。
而有的美工就做的很好了,動畫都是單獨的,不需要我們后續動畫分割,但也有可能會需要一些小的調整。
選中模型后,Rig表示動畫的導入方式
Node:不導入動畫
Legacy:老版本的動畫導入方式,現在基本不會用到了,但是如果用到老版本的資源,也會使用到這個。使用此種方式導入的動畫,只能使用Animation組件播放動畫,而不能使用新版的動畫狀態機。
Generic:新版的動畫導入方式,適用於非人型的東西。選擇此種方式,要指定Avatar Definition(骨骼映射方式)和Root node(根節點)。其中骨骼映射方式可以選擇從當前模型創建和從其它骨骼復制,后者需要兩個模型具有相同的骨骼,通常一個美工做的是一樣的。參數Optimize Game Object,表示模型優化,建議在打包時勾選。
注意:此種方式不能使用動畫重定向,而且動畫的控制,比如移動等,都需要代碼控制!!!
Humanoid:新版的動畫導入方式,人型和非人型都能用。這種方式動畫不需要代碼單獨控制,而且相同的骨骼模型可以使用動畫重定向
Bake Into Pose:勾選后表示當前屬性不會隨動畫動作改變
Based Upon:相當於基點
Loop match:循環匹配,綠點表示匹配的很好
動畫分割
選中Animation進行動畫分割,勾選Loop Pose表示該動畫循環播放
通過動畫狀態機播放動畫
導入動畫后,將模型拖到場景中,創建的物體身上會自帶一個Animator組件,其中的Controller就是動畫狀態機。動畫狀態機可以手動創建(右鍵,Animator Controller),在Animator界面中可以對狀態機進行編輯。
通過代碼控制動畫狀態機
在Animation界面中的Parameter中,添加一個控制狀態,使用這個狀態來控制動畫的切換。其中,物體的Animator組件控制這些狀態。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Biker : MonoBehaviour {
private Animator anim;
void Start () {
// 獲取Animator組件
anim = GetComponent<Animator>();
}
void Update () {
float v = Input.GetAxisRaw("Vertical");
// 使用代碼控制狀態
anim.SetInteger("Vertical", (int)v);
//transform.Translate(Vector3.forward * v * Time.deltaTime * 4);
}
}
StringToHash把參數字符串轉換成ID:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Biker : MonoBehaviour {
private Animator anim;
// 轉換ID
int verticalID = Animator.StringToHash("Vertical");
void Start () {
// 獲取Animator組件
anim = GetComponent<Animator>();
}
void Update () {
float v = Input.GetAxisRaw("Vertical");
// 使用代碼控制狀態
anim.SetInteger(verticalID, (int)v);
//transform.Translate(Vector3.forward * v * Time.deltaTime * 4);
}
}
動畫的反向控制:
在Curves(曲線)里添加一個狀態曲線,左側添加一個相同名字的參數。在動畫運行的時候,因為動畫中有這個曲線,所以不能通過代碼來控制參數。但是,曲線運動時,在不同時間參數值會根據曲線變化。我們可以獲取到這個值來使用,比如,一個添加了角色控制器的角色翻牆,在翻牆動畫播放時,有一段時間需要將角色的角色控制器禁用,否則角色控制器會碰到牆壁。這時,設置好曲線,在翻牆動畫播放到一個時間段時,禁用角色控制器。