《土豆榮耀》重構筆記(五)創(chuàng)建角色以及怪物的動畫

@TOC


前言

??在游戲中财边,角色和AI的移動都需要配上相應的動畫,以免讓玩家產(chǎn)生游戲中的角色或者AI在平移的不真實感。一般來說樊零,角色和AI的動畫都會比前面介紹的游戲背景動畫復雜很多,因為角色和AI的動畫既需要精心編輯動畫讓身體各個部位的運動看起來很真實孽文,又需要協(xié)調身體各個部位的運動驻襟。本篇文章的主要內容,就是講述如何使用Unity制作角色和怪物的動畫芋哭。


創(chuàng)建角色和怪物

??在開始制作角色和怪物的動畫之前沉衣,我們需要先創(chuàng)建角色和怪物。在Project窗口打開Sprites\Character目錄减牺,可以看到char_enemy_alienSlugchar_hero_beanMan并不是一張完整的圖片豌习,而是多張圖片拼在一起的圖集。點擊char_hero_beanMan拔疚,在Inspector窗口我們可以看到它的Sprite ModeMultiple肥隆,這表示這張圖片是多張圖片拼接而成,Unity會自動幫我們切成多張單獨的圖片稚失。當然栋艳,我們也可以點擊Sprite Editor來決定自己要怎么切割圖片,Sprite Editor的具體用法可見Unity的Sprite Editor句各。切割完成之后吸占,點擊char_hero_beanMan右下角的三角形圖標晴叨,我們可以看到有許多張小圖片以列表的形式展示出來,這些就是切割產(chǎn)生的圖片矾屯,我們可以像使用普通Sprite一樣使用它們兼蕊。

Multiple Sprite

??接著,我們在Hierarchy列表中創(chuàng)建一個Empty GameObject件蚕,將其命名為Player后孙技,在它下面創(chuàng)建一個名為CharacterEmpty GameObject并將char_hero_beanMan切割得到的圖片都拖拽到Character下。

Player的結構

??為了讓Character下各個Sprite都能正常顯示骤坐,我們還需要創(chuàng)建一個名為Character的Sorting Layer绪杏,該Sorting Layer與其他Sorting Layer的關系如下:

Sorting Layer

Player各個子物體的被修改的屬性如下:

  • Character:
    * Scale: (0.48, 0.48, 0.48)
  • bazooka:
    • Position: (0.234, 0.394, 0)
    • Sorting Layer: Character, Order In Layer: 0
  • body:
    * Sorting Layer: Character, Order In Layer: 1
  • hat:
    • Position: (-0.4, 1.43, 0), Rotation: (0, 0, -5.724)
    • Sorting Layer: Character, Order In Layer: 2
  • leftEye
    • Position: (0.39, 0.892, 0)
    • Sorting Layer: Character, Order In Layer: 3
  • leftFoot
    • Position: (0.81, -1.63, 0)
    • Sorting Layer: Character, Order In Layer: 3
  • leftHand
    • Position: (0.937, -0.058, 0)
    • Sorting Layer: Character, Order In Layer: 3
  • rightEye
    • Position: (-0.212, 0.801, 0)
    • Sorting Layer: Character, Order In Layer: 3
  • rightFoot
    • Position: (-0.49, -1.87, 0)
    • Sorting Layer: Character, Order In Layer: 3
  • rightHand
    • Position: (-0.975, -0.386, 0)
    • Sorting Layer: Character, Order In Layer: 3
  • tache
    • Position: (-0.019, 0.173, 0)
    • Sorting Layer: Character, Order In Layer: 3

??接著,我們創(chuàng)建一個名為AlienSlugEmpty GameObject纽绍,然后在AlienSlug下創(chuàng)建一個名為CharacterEmpty GameObject蕾久,并將char_enemy_alienSlug切割得到的圖片拖拽到Character下面。

AlienSlug的結構

AlienSlug各個子物體的被修改的屬性如下:

  • Character:
    • Scale: (0.4, 0.4, 0.4)
  • enemy1-eye:
    • Position: (0.06, 0.59, 0)
    • Sorting Layer: Character, Order In Layer: 0
  • enemy1-eyelid:
    • Position: (-0.07, 1.07, 0)
    • Sorting Layer: Character, Order In Layer: 1
  • enemy1-body:
    • Position: (0, 0, 0)
    • Sorting Layer: Character, Order In Layer: 2
  • enemy1-tail:
    • Position: (-1.52, -1.49, 0)
    • Sorting Layer: Character, Order In Layer: 1

??最后拌夏,我們創(chuàng)建一個名為AlienShipEmpty GameObject僧著,然后在AlienShip下創(chuàng)建一個名為CharacterEmpty GameObject。因為char_enemy_alienShipSprite ModeSingle障簿,因此我們直接將這張圖片拖拽到AlienShip下的Character下并將CharacterScale設置為(0.4, 0.4, 0.4)即可盹愚。

AlienShip的結構

創(chuàng)建怪物的動畫

??首先,我們在AnimationAnimator文件夾下都創(chuàng)建一個名為Enemy的文件夾用于保存怪物的動畫和狀態(tài)機站故。然后打開Animation Editor皆怕,在Hierarchy窗口選中AlienShip創(chuàng)建一個名為AlienShip.anim的動畫,并將AlienShip.controller移動到Animator\Enemy文件夾下西篓。創(chuàng)建完畢后愈腾,我們?yōu)?code>AlienShip添加char_enemy_alienShip的Rotation為動畫控制屬性,然后添加關鍵幀岂津。

AlienShip關鍵幀

??為了使動畫在循環(huán)播放時順暢播放虱黄,不產(chǎn)生明顯的停滯感,我們不能在KeyFrame處對Animation Curve作平滑處理吮成,因此這里橱乱,所有的KeyFrame的Tangent Type我們都設置為Auto

AlienShip新增的關鍵幀的屬性值如下(起始幀和結尾幀不變粱甫,Tangent Type都為Auto):

  • KeyFrame 1:
    • frame: 15, Rotation: (0, 0, 4.8)
    • Tangent Type: Auto
  • KeyFrame 2:
    • frame: 30, Rotation: (0, 0, 0)
    • Tangent Type: Auto
  • KeyFrame 3:
    • frame: 45, Rotation: (0, 0, -4.8)
    • Tangent Type: Auto

??接著泳叠,我們用相同的辦法創(chuàng)建一個名為AlienSlug.anim的動畫。創(chuàng)建完畢后茶宵,我們?yōu)?code>AlienSlug添加enemy1-eyelid的Positonenemy1-tail的Scale這兩個動畫控制屬性析二,然后添加關鍵幀。

AlienSlug關鍵幀

??因為在眨眼和伸縮尾巴時,有短暫的停頓并不會影響動畫效果叶摄,因此,所有的KeyFrame的Tangent Type我們都使用默認的Clamped Auto安拟,以確保能產(chǎn)生一條光滑的曲線蛤吓。

AlienSlug新增的關鍵幀的屬性值如下(起始幀和結尾幀不變。Tangent Type都為Clamped Auto ):

  • KeyFrame 1:
    • frame: 20
    • enemy1-tail的Scale: (1.6, 1, 1)
    • Tangent Type: Clamped Auto
  • KeyFrame 2:
    • frame: 30
    • enemy1-eyelid的Rotation: (-0.07, 1.31, 0)
    • Tangent Type: Clamped Auto

創(chuàng)建角色動畫

??角色的動畫比較復雜糠赦,除了靜止時的Idle動畫会傲,我們還需要創(chuàng)建行走時的Walk、跳躍時的Jump拙泽、射擊時的Shoot和死亡時的Death淌山。我們先從最簡單的Idle動畫做起。

??首先顾瞻,我們在AnimationAnimator文件夾下都創(chuàng)建一個名為Player的文件夾用于保存角色的動畫和狀態(tài)機泼疑。然后打開Animation Editor,在Hierarchy窗口選中Player創(chuàng)建一個名為Idle.anim的動畫荷荤,并將Player.controller移動到Animator\Player文件夾下退渗。創(chuàng)建完畢之后,我們?yōu)?code>Idle動畫添加body的Position屬性作為動畫控制屬性蕴纳,然后添加關鍵幀会油。因為在Idle動畫中,我們只在第30幀處添加了一個關鍵幀古毛,切所有關鍵幀的Tangent Type為默認的Clamped Auto翻翩,所以添加的關鍵幀屬性值參見下圖。

Idle動畫添加的關鍵幀

??創(chuàng)建完畢后稻薇,我們點擊Create New Clip嫂冻,創(chuàng)建一個名為Walk.anim的動畫并將其保存在Animation\Player文件夾下。

創(chuàng)建新動畫

??創(chuàng)建完畢之后颖低,我們?yōu)?code>Walk動畫添加動畫控制屬性和關鍵幀絮吵。因為該動畫精細程度要求不高,我們可以先將采樣率從60減少到5忱屑,再添加動畫控制屬性蹬敲。具體添加的動畫控制屬性見下圖。

Walk動畫的控制屬性

Walk動畫新增的關鍵幀的屬性值如下(起始幀和結尾幀不變莺戒,Tangent Type都為Free Smooth + Flat):

  • KeyFrame 1:
    • frame: 1
    • leftFoot的Position: (0.15, -1.87, 0)
    • tache的Rotation: (0, 0, -3.25)
    • Tangent Type: Free Smooth + Flat
  • KeyFrame 2:
    • frame: 2
    • bazooka的Position: (0.33, 0.47, 0)
    • leftFoot的Position: (-0.56, -1.8, 0)
    • leftFoot的Rotation: (0, 0, -59.081)
    • leftHand的Position: (1.033, 0.018, 0)
    • rightFoot的Position: (0.56, -1.8, 0)
    • rightFoot的Rotation: (0, 0, 37.936)
    • rightHand的Position: (-1.07, -0.386, 0)
    • Tangent Type: Free Smooth + Flat
  • KeyFrame 3:
    • frame: 3
    • leftFoot的Position: (0.15, -1.87, 0)
    • Tangent Type: Free Smooth + Flat

??接著伴嗡,我們繼續(xù)創(chuàng)建一個名為Jump.anim的動畫并將其保存在Animation\Player文件夾下。創(chuàng)建完畢之后从铲,我們?yōu)?code>Jump動畫添加動畫控制屬性和關鍵幀瘪校。因為該動畫精細程度要求不高,我們可以,我們可以先將采樣率從60減少到10阱扬,再添加動畫控制屬性泣懊。具體添加的動畫控制屬性見下圖。

Jump動畫的控制屬性

Jump動畫修改的關鍵幀的屬性值如下:

  • KeyFrame 0:
    • frame: 0
    • hat的Position: (-0.5, 1.6, 0)
    • leftFoot的Position: (1.07, -1.89, 0)
    • rightFoot的Position: (-0.73, -2.11, 0)
    • rightHand的Position: (-1.59, -0.58, 0)
    • Tangent Type: Free Smooth + Flat
  • KeyFrame 1:
    • frame: 從10移動到5麻惶,表示動畫只有0.5s
    • Tangent Type: Free Smooth + Flat

??設置好Jump動畫的關鍵幀之后馍刮,我們繼續(xù)創(chuàng)建一個名為Shoot.anim的動畫并將其保存在Animation\Player文件夾下。創(chuàng)建完畢之后窃蹋,我們?yōu)?code>Shoot動畫添加動畫控制屬性和關鍵幀卡啰。Shoot動畫所有關鍵幀的Tangent Type都為Free Smooth + Flat,因為Shoot動畫只在第30幀處添加了一個關鍵幀警没,因此添加的關鍵幀屬性值參見下圖匈辱。

Shoot動畫添加的關鍵幀

??最后,我們?yōu)榻巧珓?chuàng)建和死亡相關的動畫杀迹。首先新建Death.anim的動畫并將其保存在Animation\Player文件夾下亡脸。創(chuàng)建完畢之后,我們?yōu)?code>Death動畫添加動畫控制屬性和關鍵幀佛南。Death動畫是最為復雜的動畫梗掰,涉及到的動畫控制屬性較多,且創(chuàng)建的步驟有所不同嗅回。

Death動畫的關鍵幀

Death動畫的創(chuàng)建步驟:

  1. 添加動畫控制屬性
  2. 刪除默認生成的結尾幀動畫
  3. 添加在第10幀處的關鍵幀
  4. 添加在第4幀處的關鍵幀
  5. 添加在第15幀處的關鍵幀

修改的關鍵幀的屬性值如下:

  • KeyFrame 1:
    • frame: 4
    • Character的Rotation: (0, 0, 0)
    • Tangent Type: Clamped Auto
  • KeyFrame 2:
    • frame: 10
    • Character的Rotation: (0, 0, 24.075)
    • bazooka的Position: (-4.36, 0.65, 0)
    • bazooka的Rotation: (0, 0, 270.688)
    • bazooka的Scale: (0.85, 0.85, 0.85)
    • bazooka的Color: (255, 255, 255, 0)
    • hat的Position: (-1.52, 3.21, 0)
    • hat的Rotation: (0, 0, -214.424)
    • hat的Color: (255, 255, 255, 0)
    • leftEye的Position: (0.39, 0.97, 0)
    • leftFoot的Position: (1.03, -1.25, 0)
    • leftFoot的Rotation: (0, 0, 18.147)
    • leftHand的Position: (0.77, 0.56, 0)
    • rightEye的Position: (-0.11, 0.79, 0)
    • rightFoot的Position: (-0.3, -1.6, 0)
    • rightFoot的Rotation: (0, 0, 5.605)
    • rightHand的Position: (-0.86, 0.51, 0)
    • tache的Position: (0, 0.22, 0)
    • tache的Scale: (0.8, 0.8, 0.8)
    • Tangent Type: Clamped Auto
  • KeyFrame 3:
    • frame: 15
    • Character的Rotation: (0, 0, 65.82201)
    • Tangent Type: Clamped Auto

??角色死亡后及穗,還需要一個掉落的動畫。首先新建Falling.anim的動畫并將其保存在Animation\Player文件夾下绵载。創(chuàng)建完畢之后埂陆,我們?yōu)?code>Falling動畫添加動畫控制屬性和關鍵幀。需要注意的是娃豹,Falling動畫是接著Death動畫播放的焚虱,因此Falling動畫的第一幀是以Death動畫的最后一幀為基礎的。此外懂版,Falling涉及到的動畫控制屬性較多鹃栽,具體有哪些動畫控制屬性參照下圖。

Faliing動畫的關鍵幀

Death動畫修改的關鍵幀的屬性值如下:

  • KeyFrame 0:
    • frame: 0
    • Character的Rotation: (0, 0, 65.82201)
    • bazooka的Color: (255, 255, 255, 0)
    • body的Rotation: (0, 0, 0)
    • hat的Color: (255, 255, 255, 0)
    • leftFoot的Position: (1.03, -1.25, 0)
    • leftFoot的Rotation: (0, 0, 18.147)
    • leftHand的Position: (0.77, 0.56, 0)
    • leftHand的Rotation: (0, 0, 0)
    • rightFoot的Position: (-0.3, -1.6, 0)
    • rightFoot的Rotation: (0, 0, 5.605)
    • rightHand的Position: (-0.86, 0.51, 0)
    • rightHand的Rotation: (0, 0, 0)
    • tache的Position: (0, 0.22, 0)
    • tache的Scale: (0.8, 0.8, 0.8)
    • Tangent Type: Clamped Auto
  • KeyFrame 1:
    • frame: 10
    • body的Rotation: (0, 0, -4.336)
    • leftFoot的Position: (1.06, -0.99, 0)
    • leftFoot的Rotation: (0, 0, 11.305)
    • leftHand的Position: (1.06, 0.9, 0)
    • leftHand的Rotation: (0, 0, 17.069)
    • rightFoot的Position: (-0.16, -1.91, 0)
    • rightFoot的Rotation: (0, 0, 6.283)
    • rightHand的Position: (-0.93, 0.28, 0)
    • rightHand的Rotation: (0, 0, -13.507)
    • Tangent Type: Clamped Auto
  • KeyFrame 2:
    • frame: 20
    • Character的Rotation: (0, 0, 65.82201)
    • leftFoot的Position: (1.15, -1.43, 0)
    • leftFoot的Rotation: (0, 0, -8.312)
    • leftHand的Position: (0.95, 0.17, 0)
    • leftHand的Rotation: (0, 0, -17.067)
    • rightFoot的Position: (-0.25, -1.61, 0)
    • rightFoot的Rotation: (0, 0, 19.564)
    • rightHand的Position: (-0.94, 0.59, 0)
    • rightHand的Rotation: (0, 0, 6.41)
    • Tangent Type: Clamped Auto

制作Prefab

??創(chuàng)建完所有角色和怪物的動畫之后躯畴,我們還需要做一點小小的收尾工作民鼓。首先,我們在Assets文件夾下都創(chuàng)建一個名為Prefabs的文件夾蓬抄,然后在Prefabs文件夾下都創(chuàng)建一個名為Character的文件夾丰嘉,用于存放角色和怪物的Prefab。接著嚷缭,我們將Player饮亏、AlienSlugAlienShip這三個GameObject從Hierarchy窗口中拖拽到Project下的Assets\Prefabs\Character文件夾中耍贾,將它們做成Prefab。

制作Prefab

后言

??至此路幸,創(chuàng)建角色和怪物動畫的所有工作都已經(jīng)完成荐开。在制作動畫的過程中,讀者可以根據(jù)自己的喜好調整參數(shù)劝赔。最后誓焦,本篇文章所做的修改,可以在PotatoGloryTutorial這個倉庫的essay3分支下看到着帽,讀者可以clone這個倉庫到本地進行查看。


參考鏈接

  1. Unity的Sprite Editor
  2. Prefabs
  3. Creating Prefabs
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末移层,一起剝皮案震驚了整個濱河市仍翰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌观话,老刑警劉巖予借,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異频蛔,居然都是意外死亡灵迫,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門晦溪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瀑粥,“玉大人,你說我怎么就攤上這事三圆∧唬” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵舟肉,是天一觀的道長修噪。 經(jīng)常有香客問我,道長路媚,這世上最難降的妖魔是什么黄琼? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮整慎,結果婚禮上脏款,老公的妹妹穿的比我還像新娘。我一直安慰自己院领,他們只是感情好弛矛,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著比然,像睡著了一般丈氓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天万俗,我揣著相機與錄音湾笛,去河邊找鬼。 笑死闰歪,一個胖子當著我的面吹牛嚎研,可吹牛的內容都是我干的。 我是一名探鬼主播库倘,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼临扮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了教翩?” 一聲冷哼從身側響起杆勇,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎饱亿,沒想到半個月后蚜退,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡彪笼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年钻注,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片配猫。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡幅恋,死狀恐怖,靈堂內的尸體忽然破棺而出章姓,到底是詐尸還是另有隱情佳遣,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布凡伊,位于F島的核電站零渐,受9級特大地震影響,放射性物質發(fā)生泄漏系忙。R本人自食惡果不足惜诵盼,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望银还。 院中可真熱鬧风宁,春花似錦、人聲如沸蛹疯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捺弦。三九已至饮寞,卻和暖如春孝扛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背幽崩。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工苦始, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人慌申。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓陌选,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蹄溉。 傳聞我的和親對象是個殘疾皇子咨油,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內容