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