天天看點

動畫狀态機Animator

unity的新動畫系統叫Mecanim,使用Animator來取代舊系統Animation。

模型的基本知識:

    1.建立動畫的一個基本步驟是設定一個可了解的簡化後的骨骼到骨架中實際骨骼的映射;在Mecanim的術語中,這個映射稱為Avatar,即avatar是骨骼到骨架的映射。

  

動畫狀态機Animator

(圖檔來自網)

  Avatar主要用于類人骨骼模型,可以實作角色之間的重定向(Retargeting)。非類人模型可以認為骨架就是骨骼。

    2.構模組化型的基本步驟:

  modelling->rigging->skinning(模組化->建構骨架->蒙皮)

  1.modelling 模組化:

    1.Observe a sensible topology(遵循合理的拓撲結構),一個合理的标準是動畫帶動的網格變形是漂亮的;

    2.注意網格的縮放比例。最好做一下各個模組化軟體模型的導入測試,來設定好正确的縮放比例(不同模組化軟體導入比例不一樣)

    3.安放角色使得角色的腳站在坐标原點或者模型的“錨點”。角色通常是豎直地走在地面上,如果角色的錨點(也就是他的變換中心)在地面上會更容易控制。

    4.如果是類人模型,則盡量使用T字姿态模組化(Unity為類人模型提供了許多功能和優化)

    5.整理你的模型,去掉垃圾。隻要可能的話,覆寫孔洞,焊接頂點并且移除隐藏的面,這會對蒙皮有幫助,特别是自動蒙皮過程。

  2.Rigging 搭骨架:建立骨架上的關節來控制你的模型進行運動。

    非類人模型的話,可以認為沒有骨架,隻有骨骼,骨骼直接控制動畫,類人模型是骨架控制動畫。步驟1中的模型已經有腳,手,頭,武器等骨骼,還有受擊骨骼等,這些可以用來控制模型或者懸挂額外物件。

  3.Skinning 蒙皮:給骨架附加網格。

    1.把網格中的頂點綁定到骨骼,包括硬綁定(一個頂點指定一個骨骼,不是一一對應,可能多個頂點指定的是一個骨骼)和軟綁定(一個頂點指定多個骨骼,每個骨骼有一定權重)

    2.蒙皮的實操步驟:先自動蒙皮,接着用一個測試動畫看看蒙皮效果并根據此效果慢慢改啊改。

    3.每個頂點最多綁定4個骨骼,這是U3D的上限

3.動畫檔案導入unity後,我們對它的處理和設定,這些在Inspector面闆:Animation Importing settings

  

動畫狀态機Animator

  分3個頁簽:

    Model:這裡的參數基本由美術來定,其他的使用預設就好了,這裡隻提4個參數:

      1.scale factor 模型縮放比例,不同模組化軟體導入比例不一樣,unity的實體機關是1m,這個根據不同模組化軟體設定

      2.readable/writeable和UITexture一樣,如果開了unity就必須拷一份到記憶體,盡量不開。

      3.Generate Colliders一般用于生成場景的mesh collider,其他地方就不要打開了。

      4.Normals&Tangents是導入時對頂點和切線的處理,比如是否導入模型的頂點等,可限制模型精度和影響後續渲染等,比如vfshader就需要用到模型的 normal。

      

動畫狀态機Animator

    Rig:這裡Animation Type包括(Generic/Humanoid/Legacy/None)

      Generic 用于非類人模型;Humanoid用于類人模型

      Avatar Definition:可以使用現有的avatar,也可以create from this model,一般地,模型網格檔案選create,這個時候,Avatar子資産被增加到模型資産的下面,即Avatar是unity根據網格檔案生成的,對Humanoid類型,還會自動比對骨骼到骨架,不符合會報錯;而動畫檔案使用copy,使用已有資源。

    

動畫狀态機Animator

Animations:對一個Animation Clip卡通片段進行設定

動畫狀态機Animator

      勾選該選項可以對動畫進行切割

      動畫資源也分兩種情況:

            1. 各個動畫部分都是獨立的

            2. 所有的動畫內建在一個卡通片段中。

            注:第2種情況,需要在導入資源之後手動分解成不同功能的卡通片段。

動畫狀态機Animator

1.AnimationEvent

  給動畫添加事件Event:(如果一個動畫的屬性是Read—Only,那麼複制該動畫然後進行修改)

    這個在animation中可以給clip加幀事件,即播到某幀時觸發某個事件:

動畫狀态機Animator

    1.給clip的某些幀上加event,這個Function就是事件的名字,其他的是這個函數的參數

    2.定義一個腳本來接受這個事件,比如這個圖需要定義一個腳本,并且腳本裡定義了void ani(xxx){}函數

    3.參數的處理:根據腳本的函數定義格式傳參數,比如void ani(int a),則傳Int那個參數,ani(Object a)則傳Object那個參數,ani(float a, string b)則傳Float和String這2個參數,而,ani(AnimationnEvent a)則傳整個event進去(包括所有參數和目前event對應的clip的資訊)

    ps:添加了event的clip的animator物體必須挂上定義了該事件名Function的函數的腳本,否則會報錯

    

動畫狀态機Animator

  Unity Script部分:可檢視class AnimationEvent,主要是獲得該event所在clip的一些資訊:與此event相關的stateinfo,clipinfo,和該event本身的資訊:event調用的函數名functionName、函數調用的參數:float/int/string/Object(采用哪個看函數定義式)、time(事件的觸發時間)

  實際應用:這個event機制可以在播到某些幀執行一些事件。那麼我們可以,在某個點播某個特效,在某個點播某個聲音,在某個點進行一些畫面特效,在某個點進行對敵人“擊退”“擊飛”“擊浮空”,非常有利于實作各種節奏效果!還可以加入技能打斷機制:當播到某2個幀之間可以被打斷:比如我遠撲某個玩家,結果我在空中被打斷,我就被彈回來。這種效果一定很爽吧。讀者可以在一個專門的腳本中定義各種接受事件的函數,并進行相應處理來進行使用此event機制。

2.AnimationCurve:

        相關内容:http://blog.sina.com.cn/s/blog_471132920101f8nv.html

3.關于Mecanim的更多介紹

        http://www.cnblogs.com/hammerc/p/4825877.html