Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Unity遊戲程式設計(03) 製作及應用2D動畫
Search
Wu, ShyiShiou
November 11, 2016
Programming
0
1.3k
Unity遊戲程式設計(03) 製作及應用2D動畫
使用unity animation及animator工具製作2D動畫,並套用程式腳本
Wu, ShyiShiou
November 11, 2016
Tweet
Share
More Decks by Wu, ShyiShiou
See All by Wu, ShyiShiou
使用Evernote雲端筆記本
sswu
0
76
mBot教學(6)光感測器應用
sswu
0
720
Unity遊戲程式設計(04) 2D移動與碰撞處理I
sswu
0
1.2k
Unity遊戲程式設計(01) Unity簡介
sswu
0
520
Unity遊戲程式設計(02) 應用2D圖片物件
sswu
0
1.1k
Other Decks in Programming
See All in Programming
AHC041解説
terryu16
0
540
サーバーゆる勉強会 DBMS の仕組み編
kj455
1
360
月刊 競技プログラミングをお仕事に役立てるには
terryu16
1
1.3k
SRE、開発、QAが協業して挑んだリリースプロセス改革@SRE Kaigi 2025
nealle
1
3.2k
2025.01.17_Sansan × DMM.swift
riofujimon
2
660
Оптимизируем производительность блока Казначейство
lamodatech
0
990
個人アプリを2年ぶりにアプデしたから褒めて / I just updated my personal app, praise me!
lovee
0
300
法律の脱レガシーに学ぶフロントエンド刷新
oguemon
4
590
SpringBoot3.4の構造化ログ #kanjava
irof
2
760
ATDDで素早く安定した デリバリを実現しよう!
tonnsama
1
2.4k
ISUCON14感想戦で85万点まで頑張ってみた
ponyo877
1
790
AWS Lambda functions with C# 用の Dev Container Template を作ってみた件
mappie_kochi
0
220
Featured
See All Featured
Why Our Code Smells
bkeepers
PRO
335
57k
Measuring & Analyzing Core Web Vitals
bluesmoon
6
220
The Illustrated Children's Guide to Kubernetes
chrisshort
48
49k
The Cult of Friendly URLs
andyhume
78
6.2k
How GitHub (no longer) Works
holman
312
140k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.5k
Code Reviewing Like a Champion
maltzj
521
39k
Documentation Writing (for coders)
carmenintech
67
4.6k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
28
2.2k
Unsuck your backbone
ammeep
669
57k
Typedesign – Prime Four
hannesfritz
40
2.5k
Transcript
電子工程系應 用 電 子 組 電 腦 遊 戲 設
計 組 Unity遊戲程式設計(03) 製作及應用2D動畫 吳錫修 Nov 11, 2016
shape the future 素材Pixel Per Unit設定為100,表示Unity裡的1單位代表100 pixel Camera
Size建議值為視野半高 假設遊戲畫面為1024*768,Camera視野半高為7.68/2 = 3.84,則 Camera Size建議值為3.84 Camera size設定 2 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future Sprite可以是單張圖片,或由動作分鏡及相關圖片所組成 Sprite物件 1/2 Wu, ShyiShiou Dept.
of E.E., NKUT 3 sprite 1 sprite 2
shape the future Sprite Mode Single單張矩形裁切 Multiple裁切成多張素材
Polygon單張多邊形裁切 Sprite物件 2/2 Wu, ShyiShiou Dept. of E.E., NKUT 4
shape the future 在Assets下新增Sprite目錄 Assets快顯功能表Create/Folder 將素材圖片拖曳到Assets/Sprite目錄
屬性編輯器 (inspector) 將貼圖類型 (Texture Type)設定為Sprite (2D and UI) 將圖片類型 (Sprite Mode)設定為Multiple 點擊「Sprite Editor」按鈕 剪裁Sprite 1/3 Wu, ShyiShiou Dept. of E.E., NKUT 5
shape the future 由Slice下拉選單設定剪裁方式 (Type),之後點擊「Slice」按鈕 Automatic 自動剪裁
Grid By Cell Size 固定大小剪裁 Grid By Cell Count 指定行列個數方式剪裁 剪裁Sprite 2/3 Wu, ShyiShiou Dept. of E.E., NKUT 6
shape the future 自動裁切後可依需求調整剪裁後的sprite素材屬性 剪裁後每幅sprite會自動設定個別的名稱 剪裁Sprite 3/3 Wu,
ShyiShiou Dept. of E.E., NKUT 7
shape the future Filter Mode指的是素材顯示時,圖片在3D空間中被拉扯或扭曲時 pixel間的顏色如何顯示 2D遊戲中建議採用Point模式
選取原圖,將Generate Mip Maps取消 將Filter Mode選定為Point 素材Filter Mode 8 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 透過改變sprite位置、大小、角度等,達到動畫效果 砲塔發射炮彈,變化砲塔位置來產生後座力效果 攻擊怪物,變化怪物大小來產生被攻擊受傷效果
由動作分鏡之⼀連串sprite,連續播放達到動畫效果 動畫原理 9 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 將turret.png滙入到專案Assets\Sprite資料夾 開啟Sprite Editor,將Pivot設定到砲座下方中央位置 火炮動畫製作I 1/15
10 Wu, ShyiShiou Dept. of E.E., NKUT Pivot位置
shape the future 將turret素材拖曳到場景中,並命名為Turret 把Turret的Position座標初始值設定為(x,y,z)=(6, -2, 0)
把Turret的Rotation向左旋轉180度(x,y,z)=(0, 180, 0) 把Turret的Scale縮小0.8倍(x,y,z)=(0.8, 0.8, 1) 火炮動畫製作I 2/15 11 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 火砲發射砲彈時,火砲會因瞬間後座力而往後彈,再慢慢往前收 選取Turret元件 點選「Window/Animation」,開啟動畫編輯工具
可以將Animation Tab停靠到習慣的作業窗格上 火炮動畫製作I 3/15 12 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 點擊Animation工具之「Create」按鈕建立動畫檔 動畫檔命名為TurretShoot,並儲存到專案中的Assets\Animation 資料夾底下 火炮動畫製作I 4/15
13 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future Animation Tab初始狀態會是這樣 滑鼠滾輪可調整時間軸解析度 火炮動畫製作I 5/15
14 Wu, ShyiShiou Dept. of E.E., NKUT 「錄製鈕」壓下去表示正在錄製Key Frame 紅線代表我們在第幾秒
shape the future 點選Turret,將X座標變更為6.35;會自動在第零秒第零Frame 處 (0:00) 建立keyframe紀錄 火炮動畫製作I 6/15
15 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 點擊箭頭展開可以檢視細節設定 目前記錄在0:00 key frame,Position X為6.35,Position
Y為2, Position Z為0 火炮動畫製作I 7/15 16 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 滑鼠壓著紅線區域處,可以移動時間軸 將紅線移至0.1秒處 火炮動畫製作I 8/15 17
Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 將座標X設回6;會自動在0.1秒第零Frame 處(0:10)新增keyframe 紀錄 火炮動畫製作I 9/15 18
Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 點擊播放按鈕可以預覽動態效果 點擊左下角的Curve按鈕可以調整key frame與key frame間的轉換 細節
關閉Curve再開啟,會自動調整顯示比例 火炮動畫製作I 10/15 19 Wu, ShyiShiou Dept. of E.E., NKUT 播放
shape the future 由控制點快顯功能表點選「Free Smooth」,會出現⼀條灰色的斜 率控制線 火炮動畫製作I 11/15 20
Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 拉動灰色點點可以調整斜率 火炮動畫製作I 12/15 21 Wu, ShyiShiou
Dept. of E.E., NKUT
shape the future 外⼀端點套用同樣的方法調整斜率 若要增加畫面張力,砲管向後時可以同時放大,再慢慢復原 火炮動畫製作I 13/15 22
Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 點擊Animation視窗左上角Clip下拉式選單,點選「Create New Clip…」建立另⼀動畫檔,檔名TurretIdle 火炮動畫製作I 14/15 23
Wu, ShyiShiou Dept. of E.E., NKUT
shape the future TurretIdle動畫中只設定⼀個Frame,讓砲塔回到初始狀態 任意變更Position X值,再重置為6 完成動畫錄製後,點⼀下錄製按鈕,使它彈起停⽌錄製
火炮動畫製作I 15/15 24 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 完成動作錄製後,要透過Animator編輯器設定動作狀態切換 開啟Animator編輯器 由Project窗格雙擊建立Turret動畫時自動產生的Controller;
或選取Turret物件,點選「Window/Animator」 火炮狀態切換控制 1/9 25 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 第⼀個建立的動畫clip會被設定為default state 由TurretIdle快顯功能表,選擇Set as Layer
Default State 火炮狀態切換控制 2/9 26 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 由TurretIdle快顯功能表,選擇Make Transition 把Transition的箭頭拉到TurretShoot 火炮狀態切換控制 3/9
27 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 由TurretShoot快顯功能表,選擇Make Transition 把Transition的箭頭拉到TurretIdle 火炮狀態切換控制 4/9
28 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 建立動作狀態切換控制變數 點擊左上角的Parameters 點擊+號,新增⼀個狀態機變數
選擇Trigger,並取名為Shoot 火炮狀態切換控制 5/9 29 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 設定TurretIdleTurretShoot動作狀態切換條件 點選TurretIdleTurretShoot轉換線 取消Has Exit
Time Settings/Transtion Duration設為0 在Consitions中新增Shoot 火炮狀態切換控制 6/9 30 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 設定TurretShootTurretIdle動作狀態切換條件 點選TurretShootTurretIdle轉換線 勾選Has Exit
Time Settings/Exit Time設定為1 Settings/Transtion Duration設為0 火炮狀態切換控制 7/9 31 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 從Project Tab中選取TurretShot,關閉Loop Time (不重複播放) 從Project
Tab中選取TurretIdle,關閉Loop Time (不重複播放) 火炮狀態切換控制 8/9 32 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 測試動畫狀態切換 點擊執行遊戲按鈕 每點擊Animator編輯器中的Shoot,應該會觸發⼀次TurretShoot 火炮狀態切換控制
9/9 33 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 剛才製作的火炮動畫是以移動火炮位置達到動畫效果,但火炮位置 已寫死在動畫中,就算將火炮移到場景其它位罝,執行時火炮還是 會回到動畫中所設定的位置 除非在你的遊戲中,動畫道具是要放固定位置 (且沒有複本),否則
在設計時要避免使用絕對位置方式 隱藏在火炮動畫的問題 34 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 將turret.png滙入到專案Assets\Sprite資料夾,命名為turret2a。開 啟Sprite Editor,將Pivot設定到砲座底部中央位置 將turret_2.png滙入到專案Assets\Sprite資料夾,命名為turret2b。 開啟Sprite
Editor,將Pivot設定到砲座底部中央位置 將turret.png滙入到專案Assets\Sprite資料夾,命名為turret2c。開 啟Sprite Editor,將Pivot設定到砲座底部前側位置 火炮動畫製作II 1/9 35 Wu, ShyiShiou Dept. of E.E., NKUT turret2a turret2c turret2b
shape the future 將turret2a素材拖曳到場景中,並命名為Turret2 把Turret2的Position座標初始值設定為(x,y,z)=(-6, -2, 0)
把Turret2的Rotation向左旋轉180度(x,y,z)=(0, 0, 0) 把Turret2的Scale縮小0.8倍(x,y,z)=(0.8, 0.8, 1) 火炮動畫製作II 2/9 36 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 點選「Window/Animation」,開啟動畫編輯工具 點擊Animation工具之「Create」按鈕建立動畫檔 動畫檔命名為Turret2Shoot,並儲存到專案中的Assets\Animation 資料夾底下
依序將turret2a、 turret2b、 turret2c、 turret2a拖曳到 Animation影格中,適度調整key frame時間點 火炮動畫製作II 3/9 37 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 點擊Animation視窗左上角Clip下拉式選單,點選「Create New Clip…」建立另⼀動畫檔,檔名Turret2Idle 火炮動畫製作II 4/9 38
Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 拖曳turret2a到Turret2Idle動畫,讓砲塔回到初始狀態 完成動畫錄製後,點⼀下錄製按鈕,使它彈起停⽌錄製 火炮動畫製作II 5/9 39
Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 雙擊Assets/Animation資料夾中的Turret2動畫狀態控制器,開啟 Animator編輯器 火炮動畫製作II 6/9 40 Wu,
ShyiShiou Dept. of E.E., NKUT
shape the future Turret2Idle設定為Default State 建立Turret2Idle到Turret2Shoot轉換線 建立Turret2Shoot到Turret2Idle轉換線
建立⼀個名為Shoot的Trigger參數 火炮動畫製作II 7/9 41 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 設定Turret2IdleTurret2Shoot動作狀態切換條件 點選Turret2IdleTurret2Shoot轉換線 取消Has Exit
Time Settings/Transtion Duration設為0 在Consitions中新增Shoot 設定Turret2ShootTurret2Idle動作狀態切換條件 點選Turret2ShootTurret2Idle轉換線 勾選Has Exit Time Settings/Exit Time設定為1 Settings/Transtion Duration設為0 火炮動畫製作II 8/9 42 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 從Project Tab中選取Turret2Shot,關閉Loop Time (不重複播放) 從Project
Tab中選取Turret2Idle,關閉Loop Time (不重複播放) 測試動畫狀態切換 點擊執行遊戲按鈕 每點擊Animator編輯器中的Shoot,應該會觸發⼀次Turret2Shoot 火炮動畫製作II 9/9 43 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 在Assets/Script資料夾中新增⼀個名為TurretScript之C# Script檔 編輯TurretScript程式如下: public class
TurretScript : MonoBehaviour { private Animator _animator; void Start () { _animator = this.GetComponent<Animator> (); } private void PlayShootAnimation(){ _animator.SetTrigger ("Shoot"); } void Update () { if (Input.GetKeyDown (KeyCode.Space)) { PlayShootAnimation (); } } } 撰寫動畫控制程式腳本 44 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 由Project面板將TurretScript腳本曳到Hierarchy面板中的Turret及 Turret2元件上 套用動畫控制程式腳本 45 Wu, ShyiShiou
Dept. of E.E., NKUT
shape the future 執行遊戲專案 按空白鍵發射火炮 測試動畫控制程式腳本 46 Wu,
ShyiShiou Dept. of E.E., NKUT
shape the future 角色動畫製作 1/5 47 Wu, ShyiShiou Dept. of
E.E., NKUT 匯入角色動畫素材到Assets/Sprite資料夾
shape the future 拖曳idle_000到場景中,命名為Ninja,並適度調整大小 由Unity選單「Window/Animation」,開啟動畫編輯工具 點擊Animation工具右下方「Create」按鈕建立動畫檔
動畫檔名Ninja_Idle,並儲存到專案中的Assets\Animation資料夾 角色動畫製作 2/5 48 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 將所有的Idle分鏡動畫素材依序拖曳到Animation影格中,適度調整 撥放時間 角色動畫製作 3/5 49 Wu,
ShyiShiou Dept. of E.E., NKUT
shape the future 點擊Animation視窗左上角Clip下拉式選單,點選「Create New Clip…」建立動畫檔,檔名Ninja_Attack 角色動畫製作 4/5 50
Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 比照Idle動畫製作方式,將attack分鏡動畫素材逐⼀拖曳到 Animation影格中,並適度調整撥放時間 以同樣方式建立Ninja_Run及Ninja_Jump動畫檔 角色動畫製作 5/5
51 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 雙擊Ninja動畫控制器,開啟Animator編輯器,編輯動作狀態切換 控制 角色動畫控制 1/6 52 Wu,
ShyiShiou Dept. of E.E., NKUT
shape the future 將Ninja_Idle設設定為Default State 建立Ninja_Idle與Ninja_Run轉換線 建立Ninja_Idle與Ninja_Jump轉換線
建立Ninja_Idle與Ninja_Attack轉換線 建立⼀個名為Action的Int參數 角色動畫控制 2/6 53 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 設定NinjaIdleNinjaAttack動作狀態切換條件 取消Has Exit Time
Settings/Transtion Duration設為0 在Consitions中新增Action Equals 1 設定NinjaIdleNinjaJump動作狀態切換條件 取消Has Exit Time Settings/Transtion Duration設為0 在Consitions中新增Action Equals 2 角色動畫控制 3/6 54 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 設定NinjaIdleNinjaRun動作狀態切換條件 取消Has Exit Time
Settings/Transtion Duration設為0 在Consitions中新增Action Equals 2 設定其它狀態NinjaIdle動作狀態切換條件 勾選Has Exit Time Settings/Exit Time設定為1 Settings/Transtion Duration設為0 角色動畫控制 4/6 55 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 在Assets/Script資料夾中新增⼀個名為NinjaControl之C# Script檔 編輯NinjaControl程式如下: public class
TurretScript : MonoBehaviour { private Animator _animator; void Start () { _animator = this.GetComponent<Animator> (); } private void PlayAnimation(int action){ _animator.SetInteger ("Action", action); } 角色動畫控制 5/6 56 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future void Update () { if (Input.GetKeyDown (KeyCode.Z))
{ PlayAnimation (1); } else if (Input.GetKeyDown (KeyCode.X)) { PlayAnimation (2); } else if (Input.GetKeyDown (KeyCode.C)) { PlayAnimation (3); } else PlayAnimation (0); } } 角色動畫控制 6/6 57 Wu, ShyiShiou Dept. of E.E., NKUT
shape the future 新建2D專案,並以學號-2做為專案名稱 下載ninjaadventurenew.zip,使用以下5種分鏡動畫素材製作 動畫 http://gameart.eu.org/files/ninjaadventurenew.zip
實作練習 1/2 58 Wu, ShyiShiou Dept. of E.E., NKUT Idle Attack Jump Run Throw
shape the future 設計動作狀態控制 使用Has Exit Time回到Ninja_Idle 實作練習
2/2 59 Wu, ShyiShiou Dept. of E.E., NKUT 按鍵 觸發 目前狀態 下一狀態 → Run Ninja_Idle Ninja_Run ↑ Jump Ninja_Idle Ninja_Jump Space Attack Ninja_Idle Ninja_Attack Z Throw Ninja_Idle Ninja_Throw