1. 程式人生 > >【Unity3D基礎教程】給初學者看的Unity教程(三):通過製作Flappy Bird瞭解Native 2D中的Sprite,Animation

【Unity3D基礎教程】給初學者看的Unity教程(三):通過製作Flappy Bird瞭解Native 2D中的Sprite,Animation

QQ圖片20140529123319

引子

上一次我們講了MonoBehaviour的前世今生,瞭解了遊戲中的每一個GameObjec都是由指令碼控制的,這一次我們開始將Unity中Native 2D中的Sprite,並且使用Animation來讓Sprite動起來。

在接下來的幾篇部落格裡,我會通過做一個Flappy Bird來講解Unity中各個元件的使用,專案的原始碼在這裡:Unity Flappy Bird。歡迎各位前去Fork和Star。

如何建立Sprite

建立一個Sprite可以遵循如下步驟

  1. 將一張圖片拖動到Project檢視中的某個資料夾的方式來新增Sprite資源。
  2. 修改Sprite資源的各項屬性,如果是SpriteSheet的話還要對它在Sprite Editor中進行分割。
  3. 將Sprite資源拖動到Scene檢視中,或者按住ctrl鍵同時選中SpriteSheet中的幾張圖片拖動到Scene檢視中,這種方式會同時創建出一個動畫。

建立Sprite的過程中請注意:

  • Sprite是作為Sprite Renderer元件的一個屬性來新增到一個GameObject中的。
  • 在Sprite Renderer中的Sorting Layer屬性允許你設定Sprite被渲染的優先順序。
  • SpriteRenderer使用在Sprite屬性中的Texture, 但是使用Material中的Shader(著色器) ,預設選擇的Sprites/Default 這種Shader是忽略光照的,而Sprites/Diffuse
    這種Shader則是不會忽略光照的。如果你將Material設定為None時,你會發現無法顯示Sprite,因為你沒有對這個Sprite進行著色。

Sprite的詳細設定

sprite_editor

SpriteSheet:顧名思義,就是指把多個Sprite放到一張圖片裡。一般是把一段幀動畫放在一張圖片裡面,遊戲引擎會將這個SpriteSheet進行分割,輪流播放SpriteSheet中的每一幀,形成一個動畫序列。如下圖:

bird_fly

對應上圖中的1, 2, 3三點,我分別說一下注意事項

  1. 當Sprite Mode為Single時,可以在Inspector中設定Sprite的pivot point,如果你以前使用過Cocos2d-x的話,就會知道其實這個pivot point就相當於Cocos2d-x中的anchor point。在Scene中,我們會以這個pivot point為中心,來對Sprite進行旋轉,平移等Transform的設定。如果你使用的是SpriteSheet的話 ,可以在Sprite Editor中對每一個Sprite進行pivot的設定。
  2. 由於在Unity中的距離單位是Unit,為了保證3D與2D的一致性,所以在2D遊戲中,我們也使用Unit作為計量單位。Pixel to Units幾位這一轉換比例。比如一張寬度為100的Sprite圖片,在Scene中顯示的長度為1Unit。
  3. 在Sprite Editor中可以進行Automatic和Grid兩種形式的切割,一般來說,Automatic就已經可以比較好的解決問題了,一旦遇到我們需要幾張Sprite圖片大小一致時,可以使用Grid(網格)切分,來限制每個Sprite的大小。

如何為Sprite新增一個Animation

有兩種方式可以建立動畫,一種是我們上邊說過的,將SpriteSheet中的幾個Sprite同時拖動到Scene檢視中。

另一種則是在Scene檢視中,選中想要新增動畫的GameObject,然後在Animation檢視中,點選Add Curve來對GameObject的各種屬性進行動畫播放。

在Unity中,Animation是一個比較寬廣的概念,並不侷限於幀動畫。它包括了GameObject的各種屬性的動態變化。如果你點選了Add Curve之後,你會看到這樣的介面:

animation_curve

在上面的圖片裡你可以發現從Position到Color,從Rotation到Sprite都是可以進行Animation的,因為在Unity中的Animation實際上是在新增一個變化曲線。而不是我們普遍理解的Animation。

另一個要解釋的就是Animator和Animation的區別,要注意,如果想躺一個Animation動起來,那麼一定需要兩個Assest資源,分別是Animation Clip和Animator Controller兩種資源。在Project中是以下的表現形式:

clipandcs

animator是一個動畫狀態機,它控制了各個Animation之間的切換。在後面的部落格中我們會講到它的使用。=w=

Animation的詳細設定

animation_editor

我在上面的圖中,把Animation檢視中的一些重要的案件在圖中標註出來了。

  1. 關鍵幀是Animation的轉折點,你會在這一幀處設定一些Sprite的變化點,或者是Position這種資料的轉折點。
  2. 動畫事件可以在動畫的某一幀設定,在這一幀可以設定的所謂動畫事件即是這一GameObject上所有指令碼元件的非過載函式(即排除掉OnUpdate,Start之類的函式)。設定完動畫事件之後。你會發現每次動畫迴圈一遍,這個函式都會在該幀被呼叫。
  3. 增加一條變化曲線,上文中說道,可以對任意屬性進行變換。
  4. Sample指的是取樣,即在1s內設定多少幀,在圖中我們可以看到1s的間隔中有12個虛線,代表的就是在這一秒中,我們設定了12幀來調節動畫。注意這裡的sample和我們為遊戲設定的重新整理幀率是沒有關係的。

總結

總的來說,在Unity的Animation中編輯動畫 是非常方便的,和以前使用Cocos2d-x編輯動畫時,有種鳥槍換炮的感覺。但是對Sprite本身的支援 還是令人有些不爽,因為做2D時,還是不習慣Unity中德座標體系,因為製作2D遊戲的我們經常害死會把畫素Pixel當成是最重要的度量單位,Unity換成了Unit為單位之後,感覺有些不知所措,不過這就是3D引擎思考方式的一種變化吧。

參考資料

相關推薦

Unity3D基礎教程初學者Unity教程通過製作Flappy Bird瞭解Native 2DSpriteAnimation

引子 上一次我們講了MonoBehaviour的前世今生,瞭解了遊戲中的每一個GameObjec都是由指令碼控制的,這一次我們開始將Unity中Native 2D中的Sprite,並且使用Animation來讓Sprite動起來。 在接下來的幾篇部落格裡,我會通過做一個Flappy Bird來講解

Unity3D基礎教程初學者Unity教程通過製作Flappy Bird瞭解Native 2D的RigidBody2D和Collider2D

引子 認識RigidBody 當RigidBody2D的質量屬性被設定為0時,剛體的質量變為無限大,此時剛體相當於靜態剛體,永遠一動不動。但是在Unity中你是無法把一個RigidBody2D的質量設定為0的,所以,當你想建立一個靜態剛體時,只需要建立碰撞器,而不需要建立RigidBo

Unity3D基礎教程初學者Unity教程如何學習Unity3D

cos 詳解 component lock index unity3d遊戲 design 技術棧 log 【Unity3D基礎教程】給初學者看的Unity教程(零):如何學習Unity3D http://www.cnblogs.com/neverdie/p/How_To_

Unity3D基礎教程初學者Unity教程理解Unity的新GUI系統UGUI

理解UGUI的基礎架構 UGUI是Unity在4.6中引入的新的GUI系統,與傳統的中介軟體NGUI相比,這套新GUI系統有幾個核心亮點: 放棄了Atlas的概念,使用Packing Tag的方式來進行圖集的規劃 放棄了depth來確定UI顯示層級的概念,使用Hierarchy的SiblingIndex

Unity3D基礎教程初學者Unity教程所有指令碼元件的基類 -- MonoBehaviour的前世今生

引子 上一次我們講了GameObject,Compoent,Time,Input,Physics,其中Time,Input,Physics都是Unity中的全域性變數。GameObject是遊戲中的基本物件。GameObject是由Component組合而成的,GameObject本身必須有

Unity3D基礎教程初學者Unity教程詳解Unity3D的協程Coroutine

為什麼需要協程 在遊戲中有許多過程(Process)需要花費多個邏輯幀去計算。 你會遇到“密集”的流程,比如說尋路,尋路計算量非常大,所以我們通常會把它分割到不同的邏輯幀去進行計算,以免影響遊戲的幀率。 你會遇到“稀疏”的流程,比如說遊戲中的觸發器,這種觸發器大多數時候什麼也不做,但

Unity3D基礎教程初學者Unity教程Unity構建健壯的單例模式Singleton

該部落格中的程式碼均出自我的開源專案 : 迷你微信 為什麼需要單例模式 遊戲中需要單例有以下幾個原因: 我們需要在遊戲開始前和結束前做一些操作,比如網路的連結和斷開,資源的載入和解除安裝,我們一般會把這部分邏輯放在單例裡。 單例可以控制初始化和銷燬順序,而靜態變數和場景中的GameObject都無法控制

Unity3D基礎教程初學者Unity教程GameObjectCompoentTimeInputPhysics

Unity3D重要模組的類圖 最近剛剛完成了一個我個人比較滿意的小專案:【深入Cocos2d-x】使用MVC架構搭建遊戲Four,在這個遊戲中,我使用了自己搭建的MVC架構來製作一個遊戲,做到了比較好的SoC(關注點分離)。但是苦於Cocos2d-x沒有一個比較完善的編輯器,所以我開始學習另一個非常流行

SSH之旅一步步學習Hibernate框架關於持久化

stc localhost 對象 schema hbm.xml java let pass [] 在不引用不論什麽框架下,我們會通過平庸的代碼不停的對數據庫進行操作,產生了非常多冗余的可是又有規律的底層代碼,這樣頻繁的操作數據庫和大量的底層代碼的反復

Selenium-WebDriver自學Selenium-IDE測試創建

html 位置 當我 模塊 mage baidu 用例 問題 測試 =======================================================================================================

linuxValgrind工具集詳解列印資訊說明

一、列印資訊格式 Valgrind列印資訊的格式如下,很容易和程式輸出資訊區分出來 == 程序ID ==Valgrind的列印資訊 二、列印到何處 1、列印到檔案描述符中 主要是設定列印到終端上,預設情況下為2(stderr標準錯誤輸出)。如果要想列印到其他檔

深度分析ZigbeeZstack協議棧初窺協調器的組網過程詳解

這一講我要詳細說一下協調器的組網過程。在Zstack中,網路組網是從ZDApp_Init函式開始的。具體的執行流程為:Main()->osal_init_system()->osalInitTasks()->ZDApp_In it()。進入到ZDApp_I

Gin-API系列配置檔案和資料庫操作

我們前面已經實現了API的基礎版本,能對引數校驗和返回指定資料,這一章,我們將對主機和交換機進行建模,存入資料庫。 考慮到資料庫安裝和使用的簡便性,我們採用文件儲存結構的MongoDB資料庫。 > Mongo資料庫下載安裝,安裝後不用設定密碼,直接使用即可 下載連結 [https://www.file

翻譯CodeMix使用教程Emmet

CodeMix中的Emmet Emmet是改善開發人員工作流程的好方法。 使用Emmet,可以動態解析類似CSS的表示式,並根據您在縮寫中鍵入的內容生成輸出。 Emmet支援內置於CodeMix中,無需擴充套件。 CodeMix外掛與基於Eclipse的IDE和工具(如MyEclips

鏈塊技術55期超級賬本Fabric教程Hyperledger Fabric 1.0架構及原理

原文連結:超級賬本Fabric教程(三):Hyperledger Fabric 1.0架構及原理   如果說以比特幣為代表的貨幣區塊鏈技術為 1.0,以以太坊為代表的合同區塊鏈技術為 2.0,那麼實現了完備的許可權控制和安全保障的 Hyperledger 專案毫無疑問代表著區塊鏈技

暑期基礎2D HDU Palindromes _easy version迴文字串

迴文字串的水題 #include <stdio.h> #include <ctype.h> #include <string.h> int main() {

H.264/AVC視訊編解碼技術詳解七、 熵編碼演算法1基礎知識

《H.264/AVC視訊編解碼技術詳解》視訊教程已經在“CSDN學院”上線,視訊中詳述了H.264的背景、標準協議和實現,並通過一個實戰工程的形式對H.264的標準進行解析和實現,歡迎觀看! “紙上得來終覺淺,絕知此事要躬行”,只有自己按照標準文件以程式碼

Win 10 應用開發UI Composition 劄記與 XAML 集成

單獨使用 切換 column gif 頂部 tel border 靜態 ons 除了 DirectX 遊戲開發,我們一般很少單獨使用 UI Composition ,因此,與 XAML 互動並集成是必然結果。這樣能夠把兩者的優勢混合使用,讓UI布局能夠更靈活。 說到與 X

Spring Cloud服務提供與調用 EurekaFinchley 版

fan default fun cer 觀察 微服務 divide 動態 erl Spring Cloud(三):服務提供與調用 Eureka【Finchley 版】 發表於 2018-04-15 | 更新於 2018-05-07 | 上一篇文章我們介紹了 Eure

golang-GUI開發qt之signal和slot

類型 取消 htm return 所在 turn hang nbsp type 想了很久,我決定還是先從signal和slot(信號槽)開始講起。 signal和slot大家一定不陌生,先看一段示例(選自文檔): 1 class Counter : public QOb