在Inspector下
Animator的第一項為狀态機的名稱(注意:這裡的名稱不是動畫名稱)
Tag 目前動畫的Tag标簽,可以通過Tag值來處理一些邏輯
Motion:卡通片段的名稱
Speed:動畫的播放速度:1表示正常播放,
speed >1 表示加速 0< speed<1,表示減速
speed < 0 表示倒放
動畫的speed一般是不可更改的,如果需要更改需要勾選下方Parameter
Multiplier 會被激活,此時動畫的速度會是與multiplier變量的乘積 是float變量
Motion Time :表示播放卡通片段的特定時間點 0~1 0代表卡通片段的開始,1表示結束,也是需要關聯一個float變量 比如0.5 表示從動畫的中間播放 (和Cycle Offset有一定差別)
Mirror:表示将動畫鏡像(隻對人形動畫管用),需要關聯一個bool類型的變量
Cycle Offset :動畫偏移,範圍是0~1 需要關聯一個float變量 值為0.5f 表示從動畫的中間播放,(隻是更改了一下播放的位置,并不是分割,播放的動畫還是完整的)
Foot IK: :IK的動畫矯正機制
這個屬性需要特殊說明一下,在我們使用了Avatar替身系統之後,我們角色的骨骼會出現一些手和腳偏移的情況,unity 為了保證骨骼的正确性,提前骨骼系統下正确的手腳位置記錄下來,放在了4個IK Goal上,如下圖所示,手部和腳部紅色的球,unity認為使用原來的骨骼系統時,角色的手應該放在這個位置, 手肘處是IK Hint 可以通過它來防止肘部關節在運動時出現的一些奇怪的扭曲,
Foot IK的作用就是把我們腳部的實際位置向這裡的IK Goal的位置拉近一點,隻是略微調整手腳動畫的位置,它可以一定程度上改善手腳部動畫的不自然,但不一定能滿足高品質的動畫需求
為了使用IK ,在動畫層級這裡需要勾選IK Pass,這樣我們就可以在腳本裡調用相關的IK方法了。
//IK goal的權重範圍是0~1 數值越大 腳部的位置越靠近IK goal
[Range(0,1)] public float weight = 0;
private void OnAnimatorIK(int layerIndex)
{
//設定右腳的值為零點位置
animator.SetIKPosition(AvatarIKGoal.RightFoot, Vector3.zero);
//設定右腳的權重
animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, weight);
}
如果加上一些射線檢測 我們可以根據它開發出腳步适應地形的效果
Write Defaults:寫入預設值,unity官方API解釋為 AnimatorStates 是否為其運動執行未動畫化的屬性寫入預設值 (???看不懂,跟沒說一樣???)
在查了一些資料後,這裡解釋一下unity 的生命周期OnEnable 在運作開始時,unity會執行一次OnEnable 此時unity會周遊角色對象下所有的腳本,以及animator裡所有的卡通片段 ,我們知道AnimationClip(卡通片段)是描述了物體的位移、旋轉以及縮放屬性(當然 動畫也可以描述物體的材質變化 以及腳本屬性) 這裡舉個例子,比如我們做一個簡單的開門關門動畫,在開始運作時,unity 會周遊OpenDoor和CloseDoor的動畫屬性,如果更改了某些參數,就把這個參數記錄下來,未更改的參數寫入預設值,有興趣的小夥伴參考一下這篇文章,寫的很詳細
[Unity] AnimatorStates中的write defaults詳解_Rickshao1993的部落格-CSDN部落格
這裡在額外說一下一些腳本API
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
public Animator animator;
public AnimatorStateInfo currentStateInfo;
// Start is called before the first frame update
void Start()
{
animator = character.GetComponent<Animator>();
//通過層索引值擷取目前狀态機的動畫狀态
currentStateInfo = animator.GetCurrentAnimatorStateInfo(0);
//通過層名稱擷取目前狀态機的動畫狀态
currentStateInfo = animator.GetCurrentAnimatorStateInfo(animator.GetLayerIndex("Base Layer"));
}
void Update()
{
}
}
AnimatorStateInfo動畫狀态資訊,可以根據索引值和名字來擷取目前層播放的動畫,當然這裡隻是示範,正确的用法應放在Update() 裡實時檢測目前的動畫