洪流學堂,讓你快人幾步。你好,我是跟着大智學Unity的萌新,我叫小新,這幾周一起來複(yu)習(xi)動畫系統。
“智哥,我現在做的吃雞遊戲沒有人物,看着好奇怪啊,從哪能搞點人物模型呢?”
“号外号外:本人已與百度達成合作,以後有任何問題,隻要在百度中輸入問題就可瞬間獲得答案,友善快捷,特此公告,造福大家。”
“智哥沒看出來你這麼‘牛X’啊”
“去,你這個伸手黨家夥,不過我這還真有一個角色的神器,發給你去看看吧”
動畫資源神器
小新QQ上收到了智哥發來的連結:
https://www.mixamo.com/
小新打開,注冊了一個Adobe賬戶登陸進去,就看到了很多人物的模型。
選好一個人物模型,再切換到Animation,哇,這麼多的動作!
“智哥,這個簡直是神器啊,有這麼多現成的角色模型和動畫,還竟然都是免費的”
“哈哈,這是Adobe收購mixamo以後免費開放的,不僅僅有這些哦,這個網站還有一個強大的功能是自動綁定骨骼,如果你有一個角色想在遊戲中使用,但是如果連骨骼都沒有綁定的話,是沒辦法用骨骼動畫的,也沒辦法将其他動畫重定向到這個模型上。點右上角的UploadCharacter就可以上傳自己的模型,自動綁定骨骼了!”
“太棒了!!!”
代碼控制Animator
“智哥,我搜集了一堆動畫,就差把它們組裝起來了,給我講講如何把這些動畫跟我的操作關聯起來呗?”
“你來的真是時候,我剛好要休息一會,就給你講講吧。還記得之前學過的Animator麼?”
“就是那個控制動畫播放的東西呗?那個不是隻能用于切換動畫什麼的麼?”
“基本都對,不過你那個‘隻’字用錯了。我們在學Transition的時候,隻用到了按播放時間切換動畫,但是更強大的功能是按參數切換動畫。”
“啊?還有這個功能呢?”
“那當然了,我們當時把Animator類比為一個視訊播放器,視訊播放器在我點選下一個的時候當然要能切換到下一個視訊了。”
“說的也是,那這個參數在哪設定呢?”
“打開Animator看左上角。”
“原來都沒發現還有一個Parameters。”
“你沒用到當然沒發現了,現在你可以添加一個參數,比如人物的速度。”
“好,那我添加一個float類型的speed參數。”
“這時候比如你想讓人物從靜止狀态切換到走路狀态,就可以加一個transition,條件用speed >0了,你試試。”
“添加上了!現在我怎麼才能看到效果呢?”
“現在把場景運作起來,手動改一下那個speed的值就能看到效果了!”
“但是現在感覺不太流暢,問題在哪呢?”
“第一個,你這個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有兩個重載:
右滑檢視完整代碼
對于第一個重載,第一個參數類型是string,對應的是parameter中的參數名稱。第二個參數是要設定的值。
對于第二個重載,第一個參數是animator中parameter中參數的ID。
什麼是參數的ID?
其他SetFloat、SetBool、SetTrigger都類似,但是唯一不同的是SetFoat還有額外的兩個重載方法:
右滑檢視完整代碼
其中前兩個參數和上面是類似的,不同的是後面兩個參數。
- dampTime 阻尼時間。
- deltaTime 時間增量。
難點詳解
“大智,我看完了,但是我想考考你,嘿嘿,則呢麼樣?”
“還考我?放馬過來吧!”大智内心道:“你這點小技倆我還看不出來,不就是自己沒看懂的地方麼!”
“聽好了,第一題:bool參數和Trigger參數的差別是什麼?”
“bool參數和trigger參數很像,都是代表布爾值,但是trigger參數隻能被設為true,一旦被transition使用,就會自動被設為false。”
“回答的不錯,嗯。。。”小新沉思了10秒鐘
“小樣兒,就你。bool類型一般用于持續的狀态,比如角色是否趴下。而trigger一般用于使用一次就會恢複的狀态,比如開槍,開槍動畫播放完以後,會自動恢複到之前的動作。”
“我明白了。第二題:parameter的id是什麼?”
“我們在設定parameter的時候設定的是一個字元串的名稱,但是在Unity内部是有一個數字id跟它對應的,使用以下API可以将字元串的參數名轉為數字id。使用數字id的代碼運作效率會稍微高一些。”
Animator.StringToHash(string name)
“第三題:SetFloat的那個damp是怎麼用的?”
“damp翻譯過來一般是阻尼的意思,你可以了解為緩行。這樣Fload值會漸變過去,而不是一下子變成設定的Float值,這個在有些情況下很有用,比如人物的速度。玩家按下W的時候,應該是一個逐漸從0到最大速度的過程,而不應該一下從0到最大速度,這時候就可以用到damp。如果你對那兩個參數還不知道怎麼設定,可以看一下這個公式:”
總結
“看完這個公式我好像明白多了,我得再去試一試” "我給你簡單總結一下:"
- Animator中可以設定參數,用來控制Transition的變化
- Has Exit Time也是transition切換的一個條件,隻有transition的所有條件都滿足時才會進行切換
- 在代碼中可以使用Animator類中的SetXXX方法控制參數,進而控制狀态的轉換。
今日思考題
“給你布置個思考題,實作人物的站立、走、跑的狀态切換” “收到!我去也!” “收獲别忘了分享出來!也别忘了分享給你學Unity的朋友,也許能夠幫到他。” - 喜歡本文,關注部落客 - 如果你喜歡本文的話,在官網 unity.cn 或 Unity Connect App 搜尋關鍵詞“動畫系統詳解” 就可以找到這篇文章,還可以收藏起來,慢慢學習哦。
想要你的創意被更多人看見嗎? 快快加入Unity社群, 在社群内分享經驗,你也有機會獲得Unity官方推薦哦! 部落格釋出入口:unity.cn/articles - “寫文章"
長按關注
Unity 官方微信
第一時間了解Unity引擎動向,學習最新開發技巧