Unity動畫系統詳解4:如何用代碼控制動畫?

摘要:通過上一篇咱們知道了播放動畫需要使用Animator,那麼如何用代碼控制動畫呢?

洪流學堂,讓你快人幾步。你好,我是跟着大智學Unity的萌新,我叫小新,這幾週一起來複(yu)習(xi)動畫系統。

“智哥,我現在做的喫雞遊戲沒有人物,看着好奇怪啊,從哪能搞點人物模型呢?”

“號外號外:本人已與百度達成合作,以後有任何問題,只要在百度中輸入問題就可瞬間獲得答案,方便快捷,特此公告,造福大家。”

“智哥沒看出來你這麼‘牛X’啊”

“去,你這個伸手黨傢伙,不過我這還真有一個角色的神器,發給你去看看吧”

動畫資源神器

小新QQ上收到了智哥發來的鏈接,https://www.mixamo.com/

小新打開,註冊了一個Adobe賬戶登陸進去,就看到了很多人物的模型。

人物模型選擇

選好一個人物模型,再切換到Animation,哇,這麼多的動作!

“智哥,這個簡直是神器啊,有這麼多現成的角色模型和動畫,還竟然都是免費的”
“哈哈,這是Adobe收購mixamo以後免費開放的,不僅僅有這些哦,這個網站還有一個強大的功能是自動綁定骨骼,如果你有一個角色想在遊戲中使用,但是如果連骨骼都沒有綁定的話,是沒辦法用骨骼動畫的,也沒辦法將其他動畫重定向到這個模型上。點右上角的UploadCharacter就可以上傳自己的模型,自動綁定骨骼了!”
“太棒了!!!”

Mixamo詳解: 【建議收藏】找不到免費的角色動畫?來試試mixamo

代碼控制Animator

“智哥,我搜集了一堆動畫,就差把它們組裝起來了,給我講講如何把這些動畫跟我的操作關聯起來唄?”

“你來的真是時候,我剛好要休息一會,就給你講講吧。還記得之前學過的Animator麼?”

“就是那個控制動畫播放的東西唄?那個不是隻能用於切換動畫什麼的麼?”

“基本都對,不過你那個‘只’字用錯了。我們在學Transition的時候,只用到了按播放時間切換動畫,但是更強大的功能是按參數切換動畫”

“啊?還有這個功能呢?”

“那當然了,我們當時把Animator類比爲一個視頻播放器,視頻播放器在我點擊下一個的時候當然要能切換到下一個視頻了”

“說的也是,那這個參數在哪設置呢”

“打開Animator看左上角”

“原來都沒發現還有一個Parameters”

“你沒用到當然沒發現了,現在你可以添加一個參數,比如人物的速度”

“好,那我添加一個float類型的speed參數”

“這時候比如你想讓人物從靜止狀態切換到走路狀態,就可以加一個transition,條件用speed >0了,你試試”

“添加上了!現在我怎麼才能看到效果呢?”

“現在把場景運行起來,手動改一下那個speed的值就能看到效果了!”

調整Animator參數.gif

“但是現在感覺不太流暢,問題在哪呢?”

“第一個,你這個Transition除了speed大於0這個條件,還有一個條件是Has Exit Time,就是播放完idle的動畫並且speed>0纔會切換到下一個動畫,這個Has Exit Time得去掉。第二個,你這個兩個動畫都應該是循環播放吧”

“知道了,我改掉再試試”

“改成這樣了,嘿嘿,貌似可以了。那我怎麼用代碼控制呢,比如說我按鍵盤上WASD的時候控制人物移動。”

“使用動畫系統時,有兩種控制人物移動的方式:”
1 使用動畫中的位移

  • 好處是:人物的腳步會跟地面貼合,不會出現滑步的問題(人物的移動距離比步子大或者小),控制簡單
  • 缺點是:比較依賴動畫的製作,程序控制性不高

2 使用代碼控制人物的位移

  • 好處:可控性高
  • 缺點:容易出現滑步,控制複雜

小新:“那我先來試試這個簡單的方式吧,使用動畫中的位移。”

大智:“這種方式**需要先設置兩個地方:1、物體上Animator組件的Apply Root Motion需要勾選,相當於就是把動畫中的位置修改應用到物體上;2、人物的動畫類型需要設置爲Humanoid。**這兩個地方設置好以後,再用代碼去修改animator組件中的參數就行了,這個你去看文檔!”

“好嘞,我去設置一下”

小新設置完這兩個地方後,就開始去查看Animator組件的文檔,怎麼修改Animator Controller中的參數呢?小新在文檔中尋找了半天,並沒有找到相關的說明。但是找到了Unity的一篇教程,裏面說到設置參數的辦法是使用SetInteger、SetFloat、SetBool、SetTrigger四個方法。小新在Unity的API文檔中找到了這幾個方法,並記下了下面的筆記:

SetInteger、SetFloat、SetBool、SetTrigger分別對應Paramters中的Int、Float、Bool、Trigger類型。

SetInteger有兩個重載:

public void SetInteger(string name, int value);
public void SetInteger(int id, int value);

對於第一個重載,第一個參數類型是string,對應的是parameter中的參數名稱。第二個參數是要設置的值。

對於第二個重載,第一個參數是animator中parameter中參數的ID什麼是參數的ID?

其他SetFloat、SetBool、SetTrigger都類似,但是唯一不同的是SetFoat還有額外的兩個重載方法:

public void SetFloat(string name, float value, float dampTime, float deltaTime);
public void SetFloat(int id, float value, float dampTime, float deltaTime);

其中前兩個參數和上面是類似的,不同的是後面兩個參數。

  • dampTime 阻尼時間。
  • deltaTime 時間增量。
    隱隱約約感到一股神祕的力量,但是不是特別明白

難點詳解

“大智,我看完了,但是我想考考你,嘿嘿,則呢麼樣?”

“還考我?放馬過來吧!”大智內心道:“你這點小技倆我還看不出來,不就是自己沒看懂的地方麼!”

“聽好了,第一題:bool參數和Trigger參數的區別是什麼?”

“bool參數和trigger參數很像,都是代表布爾值,但是trigger參數只能被設爲true,一旦被transition使用,就會自動被設爲false。”

“回答的不錯,嗯。。。”小新沉思了10秒鐘

“小樣兒,就你。bool類型一般用於持續的狀態,比如角色是否趴下。而trigger一般用於使用一次就會恢復的狀態,比如開槍,開槍動畫播放完以後,會自動恢復到之前的動作。

“我明白了。第二題:parameter的id是什麼?”

“我們在設置parameter的時候設置的是一個字符串的名稱,但是在Unity內部是有一個數字id跟它對應的,使用Animator.StringToHash這個API可以將字符串的參數名轉爲數字id。使用數字id的代碼運行效率會稍微高一些。”

“第三題:SetFloat的那個damp是怎麼用的?”

“damp翻譯過來一般是阻尼的意思,你可以理解爲緩行。這樣Fload值會漸變過去,而不是一下子變成設置的Float值,這個在有些情況下很有用,比如人物的速度。玩家按下W的時候,應該是一個逐漸從0到最大速度的過程,而不應該一下從0到最大速度,這時候就可以用到damp。如果你對那兩個參數還不知道怎麼設置,可以看一下這個公式:”

總結

“看完這個公式我好像明白多了,我得再去試一試”

“我給你簡單總結一下:”

  • Animator中可以設置參數,用來控制Transition的變化
  • Has Exit Time也是transition切換的一個條件,只有transition的所有條件都滿足時纔會進行切換
  • 在代碼中可以使用Animator類中的SetXXX方法控制參數,進而控制狀態的轉換。

今日思考題

“給你佈置個思考題,實現人物的站立、走、跑的狀態切換”
“收到!我去也!”
“收穫別忘了分享出來!也別忘了分享給你學Unity的朋友,也許能夠幫到他。”

擴展閱讀

【擴展學習】洪流學堂公衆號回覆動畫可以閱讀本系列所有文章,更有視頻教程等着你!


呼~ 今天小新絮絮叨叨的真是夠夠的了。沒講清楚的地方歡迎評論,咱們一起探索。

我是大智(微信:zhz11235),你的技術探路者,下次見!

別走!點贊收藏哦!

好,你可以走了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章