@TOC
前言
??在游戲中财边,角色和AI的移動都需要配上相應的動畫,以免讓玩家產(chǎn)生游戲中的角色或者AI在平移的不真實感。一般來說樊零,角色和AI的動畫都會比前面介紹的游戲背景動畫復雜很多,因為角色和AI的動畫既需要精心編輯動畫讓身體各個部位的運動看起來很真實孽文,又需要協(xié)調身體各個部位的運動驻襟。本篇文章的主要內容,就是講述如何使用Unity制作角色和怪物的動畫芋哭。
創(chuàng)建角色和怪物
??在開始制作角色和怪物的動畫之前沉衣,我們需要先創(chuàng)建角色和怪物。在Project
窗口打開Sprites\Character
目錄减牺,可以看到char_enemy_alienSlug
和char_hero_beanMan
并不是一張完整的圖片豌习,而是多張圖片拼在一起的圖集
。點擊char_hero_beanMan
拔疚,在Inspector
窗口我們可以看到它的Sprite Mode
為Multiple
肥隆,這表示這張圖片是多張圖片拼接而成,Unity會自動幫我們切成多張單獨的圖片稚失。當然栋艳,我們也可以點擊Sprite Editor
來決定自己要怎么切割圖片,Sprite Editor
的具體用法可見Unity的Sprite Editor句各。切割完成之后吸占,點擊char_hero_beanMan
右下角的三角形圖標
晴叨,我們可以看到有許多張小圖片以列表的形式展示出來,這些就是切割產(chǎn)生的圖片矾屯,我們可以像使用普通Sprite一樣使用它們
兼蕊。
??接著,我們在Hierarchy
列表中創(chuàng)建一個Empty GameObject
件蚕,將其命名為Player
后孙技,在它下面創(chuàng)建一個名為Character
的Empty GameObject
并將char_hero_beanMan
切割得到的圖片都拖拽到Character
下。
??為了讓Character
下各個Sprite都能正常顯示骤坐,我們還需要創(chuàng)建一個名為Character的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)建一個名為AlienSlug
的Empty GameObject
纽绍,然后在AlienSlug
下創(chuàng)建一個名為Character
的Empty GameObject
蕾久,并將char_enemy_alienSlug
切割得到的圖片拖拽到Character
下面。
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)建一個名為AlienShip
的Empty GameObject
僧著,然后在AlienShip
下創(chuàng)建一個名為Character
的Empty GameObject
。因為char_enemy_alienShip
的Sprite Mode
為Single
障簿,因此我們直接將這張圖片拖拽到AlienShip
下的Character
下并將Character
的Scale
設置為(0.4, 0.4, 0.4)
即可盹愚。
創(chuàng)建怪物的動畫
??首先,我們在Animation
和Animator
文件夾下都創(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
為動畫控制屬性,然后添加關鍵幀岂津。
??為了使動畫在循環(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的Positon
和enemy1-tail的Scale
這兩個動畫控制屬性析二,然后添加關鍵幀。
??因為在眨眼和伸縮尾巴時,有短暫的停頓并不會影響動畫效果叶摄,因此,所有的KeyFrame的Tangent Type
我們都使用默認的Clamped Auto
安拟,以確保能產(chǎn)生一條光滑的曲線蛤吓。
AlienSlug新增的關鍵幀的屬性值如下(起始幀和結尾幀不變。
Tangent Type
都為Clamped Auto ):
- KeyFrame 1:
frame
: 20enemy1-tail的Scale
: (1.6, 1, 1)Tangent Type
: Clamped Auto- KeyFrame 2:
frame
: 30enemy1-eyelid的Rotation
: (-0.07, 1.31, 0)Tangent Type
: Clamped Auto
創(chuàng)建角色動畫
??角色的動畫比較復雜糠赦,除了靜止時的Idle
動畫会傲,我們還需要創(chuàng)建行走時的Walk
、跳躍時的Jump
拙泽、射擊時的Shoot
和死亡時的Death
淌山。我們先從最簡單的Idle
動畫做起。
??首先顾瞻,我們在Animation
和Animator
文件夾下都創(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
翻翩,所以添加的關鍵幀屬性值參見下圖。
??創(chuàng)建完畢后稻薇,我們點擊Create New Clip
嫂冻,創(chuàng)建一個名為Walk.anim
的動畫并將其保存在Animation\Player
文件夾下。
??創(chuàng)建完畢之后颖低,我們?yōu)?code>Walk動畫添加動畫控制屬性和關鍵幀絮吵。因為該動畫精細程度要求不高,我們可以先將采樣率從60減少到5
忱屑,再添加動畫控制屬性蹬敲。具體添加的動畫控制屬性見下圖。
Walk動畫新增的關鍵幀的屬性值如下(起始幀和結尾幀不變莺戒,
Tangent Type
都為Free Smooth + Flat):
- KeyFrame 1:
frame
: 1leftFoot的Position
: (0.15, -1.87, 0)tache的Rotation
: (0, 0, -3.25)Tangent Type
: Free Smooth + Flat- KeyFrame 2:
frame
: 2bazooka的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
: 3leftFoot的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動畫修改的關鍵幀的屬性值如下:
- KeyFrame 0:
frame
: 0hat的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.5sTangent 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幀處
添加了一個關鍵幀警没,因此添加的關鍵幀屬性值參見下圖匈辱。
??最后,我們?yōu)榻巧珓?chuàng)建和死亡相關的動畫杀迹。首先新建Death.anim
的動畫并將其保存在Animation\Player
文件夾下亡脸。創(chuàng)建完畢之后,我們?yōu)?code>Death動畫添加動畫控制屬性和關鍵幀佛南。Death
動畫是最為復雜的動畫梗掰,涉及到的動畫控制屬性較多,且創(chuàng)建的步驟有所不同嗅回。
Death動畫的創(chuàng)建步驟:
- 添加動畫控制屬性
- 刪除默認生成的結尾幀動畫
- 添加在第10幀處的關鍵幀
- 添加在第4幀處的關鍵幀
- 添加在第15幀處的關鍵幀
修改的關鍵幀的屬性值如下:
- KeyFrame 1:
frame
: 4Character的Rotation
: (0, 0, 0)Tangent Type
: Clamped Auto- KeyFrame 2:
frame
: 10Character的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
: 15Character的Rotation
: (0, 0, 65.82201)Tangent Type
: Clamped Auto
??角色死亡后及穗,還需要一個掉落的動畫。首先新建Falling.anim
的動畫并將其保存在Animation\Player
文件夾下绵载。創(chuàng)建完畢之后埂陆,我們?yōu)?code>Falling動畫添加動畫控制屬性和關鍵幀。需要注意的是娃豹,Falling
動畫是接著Death
動畫播放的焚虱,因此Falling
動畫的第一幀是以Death
動畫的最后一幀為基礎的。此外懂版,Falling
涉及到的動畫控制屬性較多鹃栽,具體有哪些動畫控制屬性參照下圖。
Death動畫修改的關鍵幀的屬性值如下:
- KeyFrame 0:
frame
: 0Character的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
: 10body的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
: 20Character的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
饮亏、AlienSlug
和AlienShip
這三個GameObject從Hierarchy
窗口中拖拽到Project
下的Assets\Prefabs\Character
文件夾中耍贾,將它們做成Prefab。
后言
??至此路幸,創(chuàng)建角色和怪物動畫的所有工作都已經(jīng)完成荐开。在制作動畫的過程中,讀者可以根據(jù)自己的喜好調整參數(shù)劝赔。最后誓焦,本篇文章所做的修改,可以在PotatoGloryTutorial這個倉庫的essay3
分支下看到着帽,讀者可以clone這個倉庫到本地進行查看。