2022-05-14 Unity核心7——2D动画
文章目錄
- 一、序列幀動畫
- 二、骨骼動畫 —— 2D Animation
- 三、反向動力學 IK
- 四、換裝
- 五、骨骼動畫 —— Spine
一、序列幀動畫
(一)什么是序列幀動畫
? 我們最常見的序列幀動畫就是我們看的日本動畫片,以固定時間間隔按序列切換圖片,就是序列幀動畫的本質(zhì)
? 當固定時間間隔足夠短時,我們?nèi)庋劬蜁J為圖片是連續(xù)動態(tài)的,進而形成動畫(會動的畫面)
? 它的本質(zhì)和游戲的幀率概念有點類似,原理就是在一個循環(huán)中按一定時間間隔不停的切換顯示的圖片
(二)制作序列幀動畫
? 方法一:
創(chuàng)建一個空物體
創(chuàng)建一個動畫
直接將某一個動作的序列幀拖入窗口中
? 方法二:
? 直接將圖片拖入 Hierarchy 層級窗口中
? 注意:可以修改動畫幀率,來控制動畫的播放速度
二、骨骼動畫 —— 2D Animation
? 2D 骨骼動畫是利用 3D 骨骼動畫的制作原理進行制作的
? 將一張 2D 圖片分割成 n 個部位,為每個部位綁上骨骼,控制骨骼旋轉(zhuǎn)移動,達到用最少的 2D 美術(shù)資源做出流暢的 2D 動畫效果
? 在 Package Manager 窗口搜索 2D Animation 并安裝
? 導入工具后,在 Sprite Editor 窗口會多一個選項 Skinning Editor
(一)單張圖片骨骼編輯
? 菜單欄按鈕:
? Bones:骨骼
Preview Pose:預(yù)覽模式,可以預(yù)覽動作并不會真正地改變設(shè)置
Edit Bone:編輯骨骼,可以改變骨骼位置、長度、方向、名稱等
Create Bone:創(chuàng)建骨骼,需要雙擊圖片進行選中后才能創(chuàng)建骨骼
左鍵創(chuàng)建骨骼,默認每一個骨骼是上一個骨骼的子對象
右鍵取消父子關(guān)系繼續(xù)創(chuàng)建骨骼
Split Bone:拆分骨骼,將一個骨骼一分為二
? Geometry:蒙皮
? 蒙皮決定了骨骼主要控制哪一部分
- Outline Detail:邊緣細節(jié),值越大,輪廓越細致
- Alpha Tolerance:阿爾法公差值,控制蒙皮細節(jié)
- Subdivide:細化程度,控制蒙皮細節(jié)
- Weights:是否自動設(shè)置權(quán)重,一般勾選
? Weights:權(quán)重
? 權(quán)重決定了當骨骼運動時如何影響頂點和邊
- Mode:計算模式
- Add And Subtract:加減法
- Grow And Shrink:增長和搜索
- Smooth:平滑
- Bone:設(shè)置權(quán)重的骨骼
- Normalize:標準化設(shè)置
- Amount:數(shù)量級
- Vertex Weight:頂點權(quán)重對應(yīng)的骨骼
? 設(shè)置完成后,將圖片拖入 Hierarchy 窗口中,為其添加 Sprite Skin 腳本,點擊 Create Bones 按鈕,將生成骨骼
? 之后便可以通過 Animation 為其添加動畫
(二)圖集圖片骨骼編輯
? 在編輯之前,我們需要對圖片進行如下操作:
- 設(shè)置 Sprite 為圖集模式
- 對圖集圖片進行切片
? 具體對圖集中每一張圖片的骨骼操作與上述類似
?
? 在 Hierarchy 窗口中,創(chuàng)建一個根物體當作圖集的父對象,依次將每一張圖拖進根物體下。
? 每次拖入一張圖后,為其添加 Sprite Skin 腳本,點擊 Create Bones 按鈕,將生成骨骼
? 按照圖集中圖片的父子關(guān)系繼續(xù)拖入場景中,可以修改圖片 Sprite Renderer 組件上的 Order In Layer 參數(shù)來調(diào)整圖片的前后顯示
(三)psb 圖片骨骼編輯
? PS(photoshop)是一款強大的圖像處理軟件,在各領(lǐng)域都被廣泛使用,在游戲行業(yè)中也是美術(shù)同學使用最多的圖像處理軟件之一
? PSD 和 PSB 兩種格式,都是 PS 這款軟件用于保存圖像處理數(shù)據(jù)的文件格式
? PSD 和 PSB 兩種格式并沒有太大的區(qū)別,最大的區(qū)別是 PSD 格式兼容除 PS 以外的其它一些軟件,而 PSB 只能用 PS 打開
? 在 Unity 中官方建議使用 PSB 格式,需要在 Packages Manager 窗口中引入 2D PSD Importer 工具包
? PSB 文件關(guān)鍵參數(shù):
? PSB 文件也是一種圖片文件,因此大多數(shù)參數(shù)與一般的圖片參數(shù)一致(見 圖片導入與圖片設(shè)置),這里主要講解其獨有的參數(shù)
? 骨骼編輯界面變化:
? 在為每一個圖層生成蒙皮時,可能會覆蓋其他圖層的骨骼,這時可以在 Bone Influence 選項界面中設(shè)置影響的骨骼
三、反向動力學 IK
? 在骨骼動畫中,構(gòu)建骨骼的方法被稱為正向動力學,它的表現(xiàn)形式是,子骨骼(關(guān)節(jié))的位置根據(jù)父骨骼(關(guān)節(jié))的旋轉(zhuǎn)而改變
? 用我們?nèi)梭w舉例子,當我們抬起手臂時,是肩部關(guān)節(jié)帶動的整個手臂的運動,用父子骨骼理解的話就是父帶動了子
? IK 全稱是 Inverse Kinematics,翻譯過來的意思就是反向動力學的意思
? 它和正向動力學恰恰相反,它的表現(xiàn)形式是,子骨骼(關(guān)節(jié))末端的位置改變會帶動自己以及自己的父骨骼(關(guān)節(jié))旋轉(zhuǎn)
? 用我們?nèi)梭w舉例子,當我們拿起一個杯子的時候是用手掌去拿,以杯子為參照物,我們移動杯子的位置,手臂會隨著杯子一起移動
? 用父子骨骼理解的話就是子帶動了父
? 在 Package Manager 窗口中引入 2D IK 工具包,需要在 Advanced 高級選項中選中 Show preview packages(顯示預(yù)覽包),這樣才能看到2D IK相關(guān)內(nèi)容
? 注意:如果在引入包時報錯,需要在 Windows 防火墻中添加入站規(guī)則
(一)IK Manager 2D
? 將上一小節(jié)的 PSB 文件拖入 Hierarchy 窗口中,為其創(chuàng)建父對象 Player 來方便管理,給 Player 添加 IK Manager 2D 腳本
- Chain(CCD):可以自定義影響 N 個關(guān)節(jié)點,不能反向
- Chain(FABRIK):可以自定義影響 N 個關(guān)節(jié)點,可以反向
- Limb:只會影響 3 個關(guān)節(jié)點,一般用于控制四肢
? 添加完成后,為需要添加 IK 效果的骨骼新建一個空物體 IK,并將其位置移動到骨骼末端位置處
? 在 IK Manager 2D 腳本中點擊加號,新建一個 IK 對象,會發(fā)現(xiàn)在 Player 下面多了一個 IK 對象并掛載了對應(yīng)的腳本
(二)CCD Solver 2D
? 設(shè)置好參數(shù)后,點擊 Create Target,Target 會被創(chuàng)建在該腳本掛載的物體的子物體上并被自動關(guān)聯(lián)
(三)Fabrik Solver 2D
(四)Limb Solver 2D
? IK 的用處:
- 瞄準功能
- 頭部朝向功能
- 拾取物品功能
? 對于有指向性的功能,我們都可以通過 IK 來達到目的最大的作用,可以方便我們進行動畫制作
四、換裝
(一)在同一個 psb 文件中制作換裝資源
- 在 ps 中制作美術(shù)資源時,將一個游戲?qū)ο蟮乃袚Q裝資源都擺放好位置
- 當我們導入該資源時,要注意是否導入了隱藏的圖層
? 在右側(cè)的 Visibility 面板上為每一個圖層設(shè)置分類,右邊的標簽相當于其在分類中的名稱
? 注意事項:
- 每個部位 關(guān)聯(lián)的骨骼要明確設(shè)置
- 為同一個部位的不同裝備分組
? 骨骼、蒙皮設(shè)置完成后,將圖片導入場景中,會發(fā)現(xiàn)其自動添加了精靈資料庫 Sprite Library,用于確定類別分組信息
? 同時, Unity 會為每一個設(shè)置了類別的裝備添加精靈解算器 Sprite Resolver,用于確定部位類別和使用的圖片
? 使用代碼進行換裝示例:
using UnityEngine.Experimental.U2D.Animation;private Dictionary<string, SpriteResolver> equipDic = new Dictionary<string, SpriteResolver>();// 1.獲取各部位的SpriteResolver(需要引用命名空間) // 2.使用SpriteResolver的API進行裝備切換 // GetCategory() 獲取當前部位默認的類別名 // SetCategoryAndLabel 設(shè)置當前部位想要切換的圖片信息private void Start() {SpriteResolver[] srs = this.GetComponentsInChildren<SpriteResolver>();for (int i = 0; i < srs.Length; i++) {equipDic.Add(srs[i].GetCategory(), srs[i]);}ChangeEquip("Cask", "CASK 1"); }public void ChangeEquip(string category, string equipName) {if (equipDic.ContainsKey(category)) {equipDic[category].SetCategoryAndLabel(category, equipName);} }(二)在不同 psb 文件中制作換裝資源
? 保證個部位在 PS 文件中的統(tǒng)一,基礎(chǔ)部位可選擇性隱藏
? 注意事項:不同文件的骨骼信息必須統(tǒng)一,所以我們直接使用復制的方式
為根對象添加 Sprite Library 并關(guān)聯(lián)數(shù)據(jù)文件
為換裝部位關(guān)聯(lián) Sprite Resolver
? 換裝較少的游戲,比如只有面部表情更換,可以使用同一 psb 文件方案
? 換裝較多的游戲,比如各部位有 n 種裝備,可以使用不同 psb 文件方案,拓展性更強
? 一切根據(jù)需求而定
五、骨骼動畫 —— Spine
? Spine 是一個收費的跨平臺的 2D 骨骼動畫制作工具,它支持 Unity,UE,Cocos2D,Cocos2D-x 等等游戲引擎
? 相對 Unity 2018 才推出的 2D Animation,Spine 是目前商業(yè)游戲中較為常用的骨骼動畫制作方案 穩(wěn)定且高效
? 官方地址:http://zh.esotericsoftware.com/
? 制作骨骼動畫是美術(shù)人員的工作,除非你是要做獨立游戲,美術(shù)程序一人包,那么我們沒有必要去學習如何通過 Spine 制作骨骼動畫
? 我們只需要學習如何在 Unity 中通過程序使用 Spine 制作的資源
? 如果想要學習如何制作 Spine 骨骼動畫,可以根據(jù)官網(wǎng)提供的教學內(nèi)容進行學習
? 有了 Spine 提供的支持 Unity 開發(fā)的運行庫,我們才能在 Unity 中使用 Spine 制作的骨骼動畫
? 你可以簡單理解其實就是官方寫好的識別文件處理文件呈現(xiàn)效果的代碼
? 我們只需要學習如何使用它提供的 API 即可
(一)骨骼動畫使用
? Spine 導出的資源有 3 個文件:
- .json 存儲了骨骼信息
- .png 使用的圖片圖集
- .atlas.txt 圖片在圖集中的位置信息
? 當我們把這三個資源導入到已經(jīng)引入了 Spine 運行庫的 Unity 工程后,會自動為我們生成:
- _Atlas 材質(zhì)和 .atlas.txt 文件的引用配置文件
- _Material 材質(zhì)文件
- _Skeleton Data、json 和 _Atlas 資源的引用配置文件
? 創(chuàng)建動畫的兩種方式:
(二)骨骼動畫參數(shù)
? 骨骼數(shù)據(jù)文件:
- Animation State Data:動畫狀態(tài)數(shù)據(jù)
- Default Mix Duration:默認混合持續(xù)時間
- Add Custom Mix:添加自定義混合
? 骨骼動畫腳本:
Skeleton Data Asset:關(guān)聯(lián)的骨骼動畫信息
Sorting Layer:所在排序?qū)?/p>
Order in Layer:排序?qū)拥男蛱?/p>
Mask Interaction:與精靈遮罩交互的方式
- None:不與場景中任何精靈遮罩交互
- Visible Inside mask:精靈遮罩覆蓋的地方可見,而遮罩外部不可見
- Visible Outside mask:精靈遮罩外部的地方可見,而遮罩覆蓋處不可見
Advanced:高級設(shè)置,一般不修改,了解即可
- Initial Flip X / Y:初始反轉(zhuǎn) X / Y
- Update When Invisible:不可見時是否更新
- Nothing:不更新
- Only Animation Status:僅動畫狀態(tài)
- Only Event Timelines:僅事件
- Everything Excepts Mesh:除了網(wǎng)格其他都更新
- Full Update:更新所有
- Use Single Submesh:使用單個子網(wǎng)格
- Fix Draw Order:固定提取順序
- Immutable Triangles:不變?nèi)切?/li>
- Clear State On Disable:禁用時清除狀態(tài)
- Separator Slot Names:分隔符插槽名稱
- Z Spacing:Z 間距
- Vertex Data:頂點數(shù)據(jù)
- PMA Vertex Colors:PMA 頂點顏色
- Tint Black:淡黑色
- Add Normals:添加法線
- Solve Tangents:求解切線
- Add Skeleton Utility:添加骨骼公共程序
Animation Name:當前播放的動畫名
Loop:是否循環(huán)
Initial Skin:初始蒙皮
美術(shù)在制作時可能有幾套蒙皮,一般情況下只需要一套
Time Scale:時間縮放,值越大,動畫播放的越快
Root Motion:是否添加根運動的腳本,一般不添加
(三)骨骼動畫代碼
using Spine; using Spine.Unity; using UnityEngine;private SkeletonAnimation sa;[SpineAnimation] // 可以在Unity面板中選擇動畫,而不是填入字符串 public string jumpName;[SpineBone] // 可以在Unity面板中選擇骨骼,而不是填入字符串 public string boneName;[SpineSlot] // 可以在Unity面板中選擇部位,而不是填入字符串 public string slotName;[SpineAttachment] // 可以在Unity面板中選擇附件,而不是填入字符串 public string attachmentName;// Start is called before the first frame update void Start() {sa = this.GetComponent<SkeletonAnimation>();// 動畫播放// 方法一:直接改變SkeletonAnimation中參數(shù)// 需要先改循環(huán)為false后再設(shè)置動畫sa.loop = true;sa.AnimationName = "jump";// 方法二:使用SkeletonAnimation中動畫狀態(tài)改變的函數(shù)// 馬上播放sa.AnimationState.SetAnimation(0, jumpName, false);// 排隊播放sa.AnimationState.AddAnimation(0, "walk", true, 0);// 轉(zhuǎn)向sa.skeleton.ScaleX = -1;// 動畫事件// 動畫開始播放sa.AnimationState.Start += (t) => { print(sa.AnimationName + "動畫開始播放"); };// 動畫被中斷或者清除sa.AnimationState.End += (t) => { print(sa.AnimationName + "動畫中斷或者清除"); };// 播放完成sa.AnimationState.Complete += (t) => { print(sa.AnimationName + "動畫播放完成"); };// 做動畫時添加的自定義事件sa.AnimationState.Event += (t, e) => { print(sa.AnimationName + "自定義事件"); };// 便捷特性// 動畫特性 [SpineAnimation] // 骨骼特性 [SpineBone] // 插槽特性 [SpineSlot] // 附件特性 [SpineAttachment] // 獲取骨骼、設(shè)置插槽附件// 獲取骨骼Bone b = sa.skeleton.FindBone(boneName);sa.skeleton.SetAttachment(slotName, attachmentName);// 在UI中使用// SkeletonGraphic(UnityUI) }總結(jié)
以上是生活随笔為你收集整理的2022-05-14 Unity核心7——2D动画的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++数据结构,三万字详解(强烈建议收藏
- 下一篇: 高校和科研院所“合并”!一所新大学成立