天天看點

(Animator詳解二)Unity Animator的基本屬性

在Inspector下

(Animator詳解二)Unity Animator的基本屬性

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的位置拉近一點,隻是略微調整手腳動畫的位置,它可以一定程度上改善手腳部動畫的不自然,但不一定能滿足高品質的動畫需求

(Animator詳解二)Unity Animator的基本屬性

為了使用IK ,在動畫層級這裡需要勾選IK Pass,這樣我們就可以在腳本裡調用相關的IK方法了。

(Animator詳解二)Unity Animator的基本屬性
//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部落格

(Animator詳解二)Unity Animator的基本屬性

這裡在額外說一下一些腳本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() 裡實時檢測目前的動畫