07 動畫系統

    Mecanim動畫(新版動畫)異步

   選中一個動畫在右側的屬性面板中能夠查看動畫的種種屬性,
    動畫類型:None:無任何動畫
    Legacy:舊版Animation動畫
   Generic:通常動畫(非人型動畫)
    Humanoid:人型動畫
oop

人型動畫設置:動畫

人型動畫最重要的表示骨骼的設置,沒有與之相匹配的骨骼,動畫就不會播放spa

在屬性面板進入動畫剪輯中可對動畫的長度以及播放時的狀態進行編輯3d

LoopTime: 循環播放
Loop Pose:循環姿式,解決最後一幀和最後一幀銜接天然的方法
Cycle Offset:偏移量,表示從哪開始播放,只在播放一次的時候使用比較明顯
loopmatch:循環檢測 紅表示不能循環(死亡動畫),黃色表示循環效果很差,綠色表示當前動畫能夠循環
BakeInto Pose :表示烘焙到姿式,勾選後,模型在執行動畫過程當中就不會發生動畫形成的旋轉和位移 勾選上Bake into Pose,播放有位移的動畫時,模型實際位置不會改變,直到動畫結束,其位置才改變;不勾選,模型隨動畫中位移而位移
Based Upon:基於哪一個節點
origin:當前動畫表示由模型師來決定繞哪一個旋轉,即模型師製做模型時設置的旋轉點
BodyOrientation:當前人物的上半身的中心點當作當前旋轉的參照點
CenterofMess:當前人物質量的中心,重心的位置
Feet:基於腳的旋轉code

Animator組件:
人型動畫可以使用該組件orm

Controller:動畫控制器,用來設置人物的行爲,包括狀態機,融合樹以及腳本控制的事件
在Project中建立。雙擊後可打開Animator視圖
Avatar:當前角色身上的骨骼
ApplyRootMotion 應用跟動做:是使用角色自身動畫帶來的位移仍是在腳本中控制角色的運動
勾選上Apply Root Motion,模型的實際位置會隨動畫中模型的位移而發生變化;不勾選就不發生變換。
UpdateMode 1 .Update更新(動畫的更新在腳本的Update中) 2.基於物理更新
3. 使動畫的更新不依賴Time.timeScale
CullingMode 刪除模式,動畫的剔除模式blog

狀態機:
將要編輯的動畫拖入狀態機,系統會默認第一個拖入的動畫爲角色的初始狀態。
拖入多個動畫後,在動畫上右擊MakeTransition可設置動畫與動畫之間的過渡,在過渡的箭頭上能夠添加過渡的條件。動畫之間的過渡使用狀態機和狀態參數實現可以使用的參數類型有四種:遊戲

Trigger參數爲狀態開關參數
動畫狀態機中設置動畫執行的參數類型爲哪幾種?對應的設置的方法是什麼
(1)float:SetFloat
(2)int:SetInteger
(3)bool:SetBool
(4)trigger:SetTrigger事件

動畫狀態的設置;

 

Animator類:
當使用狀態機編輯動畫時,爲了體現靈活性,使用腳原本改變狀態參數,這是會使用到Animator類;

Animator類經常使用方法;
設置反向動力學位移權重:SetIkPositionWeight

AnimatorClipInfo[] infos = anim.GetCurrentAnimatorClipInfo (0);
AnimatorClipInfo info = infos [0];
Debug.Log (info.clip.name);

BlendTree融合樹
其功能是將多個類似的動畫進行融合,使得狀態機內看起來不那麼雜亂無章
在狀態機內右鍵可建立融合樹
動畫融合樹
一個Blend Tree其實也就是一個狀態,和狀態不一樣的地方就是一個狀態只能設定一個動畫,而一個Blend Tree則能夠設定爲多個動畫的混合,分爲一維、二維和多維融合樹

融合樹的屬性:

 

1D模式 一個參數數值的變化來實現動畫之間的過渡
2D模式:

兩個參數控制動畫的過渡,實現多個動畫之間的切換

Motion:導入動畫
使用傳入的兩個數值賦值給 X,Y從而是紅點的位置發生改變,紅點移動到相應的位置時便會播放相對應位置的動畫

1.一個參數控制的融合樹,單一方向的動畫融合,
2.2D SimpleDirctional 2D融合樹有兩個參數控制動畫切換,只是這種單一方向上只能存在一個動畫,水平份量
3.2D FreeFormDirctional 是2D融合樹的一種,在一個方向上能夠存在兩個動畫,有一個根動畫,有根動畫可切換至其餘任意一個動畫
4.2D FreeFormCartesian 2D笛卡爾融合樹,能夠在任何一個方向上有兩個動畫
5.Direct 多維融合樹(高精度融合樹),主要用於面部表情之類比較細膩的動畫製做

 

動畫系統進階:
1.動畫層與遮罩效果
在Unity動畫系統中一般每一幀只能執行一個動畫,但在許多遊戲中須要每一幀執行多個動做。這時候就須要使用動畫層。
打開動畫狀態機後在左側點擊layers按鈕,點擊加號會添加一個新的動畫層,在這個層中能夠添加新的動畫,但動畫的起始狀態必須是建立的一個空的動畫,由空動畫來過渡到其餘的將要執行的動畫中。

異步:勾選該複選框可以使使得該層動畫同步到其餘的指定層,使得另外一個層保持與本層相同的狀態,播放一樣的動畫。(該選項只有在動畫狀態機中有多層動畫時纔會生效)
Ik Pass:勾選後可以使用IK動畫(反向動力學)
權重:權重的大小決定了,該層動畫執行的前後順序,權重大的層,這一層的動畫執行時會優先選擇。


重寫或疊加:動畫會覆蓋上一層的動畫
遮罩:遮罩是和動畫層配合使用的
在Project中右鍵建立Avatar Mask,可添加到該位置,實現動畫遮罩

圖中紅色部分表示人型動畫的該部位被禁止,動畫在播放時該部位將不會執行相對應動做;動畫遮罩只能遮罩一層動畫。

2.Ik動畫
方向動力學(Ik):經過先肯定子骨骼的位置,而後反推導出其所在骨骼鏈上n級父骨骼的位置,從而肯定整條骨骼鏈。
只有人型動畫才能設置Ik動畫
Ik動畫須要經過代碼來爲人型動畫的哥哥位置設置權重,設置位置。並且Ik動畫的功能實現要寫在Ik動畫回調方法中OnAnimatorIK

void OnAnimatorIK ()
    {
        anim.bodyPosition = transform.position;
        anim.bodyRotation = transform.rotation;

        //
        if (headTarget != null) {
            anim.SetLookAtWeight (1f);
            anim.SetLookAtPosition (headTarget.position);
        }
        //左手
        if (leftHandTarget != null) {
            anim.SetIKPositionWeight (AvatarIKGoal.LeftHand, 1f);
//            anim.SetIKRotationWeight (AvatarIKGoal.LeftHand, 1f);
            anim.SetIKPosition (AvatarIKGoal.LeftHand, leftHandTarget.position);
//            anim.SetIKRotation (AvatarIKGoal.LeftHand, leftHandTarget.rotation);
        }
        //右手 
        if (rightHandTarget != null) {
            anim.SetIKPositionWeight (AvatarIKGoal.RightHand, 1f);
//            anim.SetIKRotationWeight (AvatarIKGoal.RightHand, 1f);
            anim.SetIKPosition (AvatarIKGoal.RightHand, rightHandTarget.position);
//            anim.SetIKRotation (AvatarIKGoal.RightHand, rightHandTarget.rotation);
        }
        //左腳
        if (leftFootTarget != null) {
            anim.SetIKPositionWeight (AvatarIKGoal.LeftFoot, 1f);
//            anim.SetIKRotationWeight (AvatarIKGoal.LeftFoot, 1f);
            anim.SetIKPosition (AvatarIKGoal.LeftFoot, leftFootTarget.position);
//            anim.SetIKRotation (AvatarIKGoal.LeftFoot, leftFootTarget.rotation);
        }
        //右腳
        if (rightFootTarget != null) {
            anim.SetIKPositionWeight (AvatarIKGoal.RightFoot, 1f);
//            anim.SetIKRotationWeight (AvatarIKGoal.RightFoot, 1f);
            anim.SetIKPosition (AvatarIKGoal.RightFoot, rightFootTarget.position);
//            anim.SetIKRotation (AvatarIKGoal.RightFoot, rightFootTarget.rotation);
        }
    }

3.動畫曲線
動畫在執行時的0到1秒內,所返回的值,可當作變量使用。

曲線名稱:在設置曲線名稱時將曲線名稱設置的與要修改的標量名字一致,就能夠將動畫執行過程當中連續變化的值賦給相對應的變量。

4.動畫事件
在動畫設置面板中Events中能夠爲動畫添加動畫事件,使動畫在執行到某一幀時執行某個時間,動畫事件添加後須要在腳本中寫上與所添加的動畫事件名字相同的方法。

相關文章
相關標籤/搜索