[Unity3D]Unity3D 遊戲開發之Unity3D Native2D特性研究,unity3dnative2d

來源:互聯網
上載者:User

[Unity3D]Unity3D 遊戲開發之Unity3D Native2D特性研究,unity3dnative2d

       

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

喜歡我的部落格請記住我的名字:秦元培,我的部落格地址是blog.csdn.net/qinyuanpei。

轉載請註明出處,本文作者:秦元培, 本文出處:http://blog.csdn.net/qinyuanpei/article/details/40452019

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

         大家好,我是秦元培,歡迎大家關注我的部落格,我的部落格地址是blog.csdn.net/qinyuanpei。在Unity4.3版本以後,Unity3D推出了基於Box2D的2D組件,使得Unity3D成為一個可以支援2D遊戲開發的遊戲引擎。在Unity3D推出這一功能之前,大家對使用Unity3D開發2D遊戲已經進行了大量的研究。所以,Unity3D推出2D組件從本質上來講並不算是一個巨大的突破,因為二維與三維的區別就在於三維比二維多了一個Z軸,如果我們將Z軸固定,那麼這就是一個二維的世界。在此之前,我們普遍採用的是正交投影法,即讓攝像機垂直於XY平面進行投影,這樣可以利用3D引擎實現2D遊戲的效果。既然現在Unity可以支援原生2D遊戲開發,為什麼我們不來嘗試一下呢?博主之前就打算抽時間研究下Unity3D的Native2D的特性,不過因為種種原因一直沒有時間來研究,那麼現在正好利用這個周末來研究下吧!


       一、精靈(Sprite)與精靈圖集

    雖然我們將Unity3D的2D特性成為Native2D,不過事實上Natvite只是相對於第三方外掛程式而言的,從本質上Unity3D的2D仍然是屬於3D的範疇。精靈(Sprite)是我們走進Native2D的第一個組件,所以的2D特性都是以這個組件作為基礎。學習過2D遊戲開發的朋友應該知道精靈其實就是我們在2D世界裡一張貼圖。好了,下面我們建立一個新的項目來示範如何使用Sprite組件吧!第一個讓我們激動人心的特性是我們可以在建立項目的時候就決定一個項目是3D遊戲還是2D遊戲,,這裡我們直接選擇2D,因為我們今天要探索的是Unity3D的Native2D特性


進入Unity後我們將注意到Unity的工具列上會出現一個2D/3D的選項按鈕且在當前情境中2D按鈕被啟用,這意味著這是一個2D項目,通過切換該按鈕我們可以發現,Unity3D的Native2D就是將Unity3D的Z軸固定以後的效果,所以從本質上來講Unity3D的Native2D還是3D引擎在2D效果下的一種實現。


博主從愛給網上找了點素材,做了下面的這樣一個情境:


我們注意到Sprite組件中有一個最重要的SpriteRenderer組件,該組件負責的是對Sprite的渲染,我們可以通過指定Sprite這個屬性來指定的渲染的資源。我們選擇其中的一個圖片資源,可以看到其屬性視窗:


其中TextureType用來指明貼圖的類型,這裡我們選擇Sprite類型,因為只有這種類型的貼圖才能提供給Sprite組件來使用。SpriteMod用來指定精靈是一張單個的圖還是一系列圖集,我們注意到這張圖片是一個幀動畫序列,所以我們應該選擇Multiple類型。接下來,我們單擊SpriteEditor按鈕開啟精靈編輯器,目的是將這些精靈圖集分割成單個的圖片。如果大家閱讀過博主剛開始學習Unity3D時寫過的文章,一定記得博主曾經用PhotoShop將一張幀動畫順序圖表用切圖的方式分割出來,再通過繪製貼圖的方式來實現幀動畫吧。這樣是不是很麻煩啊?沒關係,Unity3D的Nativie2D提供的精靈編輯器可以幫你快速地完成這一工作。我們開啟精靈編輯器:


大家可以看到這裡博主將這張圖片分割成了16個圖片。這裡有一個技巧是可以通過Trim按鈕獲得大小一致的圖塊,因為精靈編輯器可以協助你判斷圖形的邊界。這樣做的好處是Unity可以幫你產生16張個幀動畫序列,從而你可以任意地調用某一幀動畫,然而資源管理員中並不會產生相應的檔案,這樣可以節省項目資源的大小。


好了,接下來,我們來編寫指令碼來展示如何使用這組精靈動畫:

using UnityEngine;using System.Collections;public class SpriteScript : MonoBehaviour {//向上的精靈集合public Sprite[] UpSprites;    //向下的精靈集合public Sprite[] DownSprites;//向左的精靈集合public Sprite[] LeftSprites;//向右的精靈集合public Sprite[] RightSprites;//上一次使用的精靈集合private Sprite[] lastSprites;//當前使用的精靈集合private Sprite[] currentSprites;//當前幀序列索引private int index=0;//每秒畫面格數private float fps=10;//當前經曆時間private float currentTime=0;//角色目前狀態private PlayerState state;//精靈渲染器private SpriteRenderer renderer=null;void Start () {//初始化角色狀態state=PlayerState.Idle;//初始化角色精靈集合currentSprites=UpSprites;lastSprites=currentSprites;//擷取精靈渲染器renderer=GetComponent<SpriteRenderer>();}void FixedUpdate () {if(Input.GetAxis("Horizontal")==1){state=PlayerState.Walk;SetSprites(RightSprites);MoveTo(new Vector2(Time.deltaTime * 2.5F,0));}else if(Input.GetAxis("Horizontal")==-1){state=PlayerState.Walk;SetSprites(LeftSprites);MoveTo(new Vector2(-Time.deltaTime * 2.5F,0));}else if(Input.GetAxis("Vertical")==1){state=PlayerState.Walk;SetSprites(UpSprites);MoveTo(new Vector2(0,Time.deltaTime * 2.5F));}else if(Input.GetAxis("Vertical")==-1){state=PlayerState.Walk;SetSprites(DownSprites);MoveTo(new Vector2(0,-Time.deltaTime * 2.5F));}else if(!Input.anyKey){state=PlayerState.Idle;}DrawSprites(currentSprites);}//角色移動private void MoveTo(Vector2 offest){   //根據位移量計算角色位置   float x=transform.position.x + offest.x;   float y=transform.position.y + offest.y;   //使用2D剛體組件來移動精靈   this.rigidbody2D.MovePosition(new Vector2(x,y));}//設定當前精靈集合private void SetSprites(Sprite[] sprites){currentSprites=sprites;    //如果當前精靈集合和上一次使用的精靈集合不等則表明要切換精靈集合if(currentSprites!=lastSprites){   lastSprites=currentSprites;   index=0;}}    //繪製當前精靈集合private void DrawSprites(Sprite[] sprites){  //如果角色處於站立狀態則顯示第一幀  if(state==PlayerState.Idle){ renderer.sprite=sprites[0];  }else{ currentTime+=Time.deltaTime; //如果目前時間大於幀動畫渲染時間則需要渲染新的幀動畫 if(currentTime>1/fps){//使索引增加並將目前時間清零以便於重新計數    index+=1;currentTime=0;//使索引連續畫面迴圈if(index>=sprites.Length){   index=0;} }  }  //渲染  renderer.sprite=sprites[index];}#region 角色狀態枚舉定義#enum PlayerState{Walk,Idle}#endregion}
那麼,我們來看看實際的運行效果吧:



這是一個控制人物沿著上、下、左、右四個方向進行移動的動畫效果,我們很容易就實現了。不過,我們代碼似乎寫了不少啊,那麼有沒有一種更好的方法呢?在Unity3D沒有推出2D組件的時候,我們可以以貼圖的形式來繪製一個Sprite,對於這種幀動畫順序圖表片,我們可以通過offset來決定貼圖上要顯示的位置。不過這種方法似乎只對普通的貼圖管用,對於Sprite無能為力。博主個人還是喜歡使用這種方式,畢竟有了精靈編輯器後,切圖就是一件很簡單的事情了。下面,我們再來給出一個通用的指令碼,該指令碼可以實現任何連續幀動畫的迴圈播放,適合在遊戲中表現相對玩家來說靜止的效果,比如在遊戲中飄揚的旗子、飛來飛去的小鳥等等:

using UnityEngine;using System.Collections;public class FightScript: MonoBehaviour {//序列幀動畫集合public Sprite[] Animations;//當前幀序列索引private int index=0;//每秒畫面格數public float fps=10;//當前經曆時間private float currentTime=0;//精靈渲染器private SpriteRenderer renderer;void Start(){//擷取精靈渲染器renderer=GetComponent<SpriteRenderer>();}void FixedUpdate () {DrawSprite();}//提供一個外部介面以便於隨時改變動畫public void SetAnimations(Sprite[] sprites,int index){this.Animations=sprites;this.index=index;}//根據精靈集合播放動畫void DrawSprite(){currentTime+=Time.deltaTime;//如果目前時間大於幀動畫渲染時間則需要渲染新的幀動畫if(currentTime>1/fps){//使索引增加並將目前時間清零以便於重新計數index+=1;currentTime=0;//使索引連續畫面迴圈if(index>=Animations.Length){index=0;}}   //渲染   renderer.sprite=Animations[index];}}
這個指令碼的特點是只要指定了一系列幀動畫序列,就可以讓動畫從某一幀開始迴圈播放動畫。下面,我們添加兩個帶有攻擊效果的Sprite:

怎麼樣?效果還不錯吧,哈哈。好了,下面我們來說說精靈圖集吧!大家可以注意到隨著項目的持續推進,項目中使用的圖片資源會越來越多,如果不注意控制的話,整個遊戲的體積會越來越大。為瞭解決這個問題,Unity提供了精靈圖集的打包製作功能Sprite Packer。所謂精靈圖集呢,其實就是把分散的圖片資源集中到一張圖片啊,這樣可以減少圖片資源的容量。這其實有點類似於NGUI裡面的圖集啦,博主前段時間還解包了《仙劍奇俠傳四》的部分資源,對於遊戲中的圖片資源它同樣是採用這種方式進行處理的。好了,下面我們就來看看如何在Unity3D中實現精靈打包吧!首先需要在Unity中啟用Sprite Packer功能:

接下來通過Window->Sprite Packer開啟Sprite Packer視窗後,然後到項目資源中選擇要打包的圖片資源,並將其Packing Tag設為同一個名稱如enemys,這樣它們將會被打包在同一張圖片上。

接下來我們點擊Pack,就會發現這些圖片被合成在一張圖片上,如果我們修改任何一張圖片的Packing Tag,則這張圖片會從當前圖集中消失。

好了,第一部分內容到此結束,大家稍作休整,我們開始本文的第二部分:2D物理世界一樣美好


     二、2D物理與Box2D

     提及2D遊戲引擎就不能不說Box2D。Box2D是一個用於類比2D剛體物體的C++引擎,通常作為物理引擎被用到2D遊戲引擎中,因此在很多遊戲引擎中都能找到它的身影,而Unity3D的Native2D就是使用了Box2D這個引擎。關於這個引擎的細節大家可以自己去瞭解,總之如果遊戲世界缺少了碰撞,那麼遊戲世界未免太無趣了吧!人生就像憤怒的小鳥,當你失敗的時候總有豬在笑。該面對的我們還是要去面對,就算在現實中碰壁被撞得頭破血流,可是這樣的人生總是值得我們去追逐的,因為寒冷寂寞的生,終究是比不上轟轟烈烈的死。好了,閑話少敘,我們下面來一起學習下Unity3D中2D物理吧。在Unity3D中,所有與2D物理相關的組件都被放到Physics  2d這個父菜單中,因此我們可以在這裡找到相關的2D物理組件。Unity中提供的2D物理組件主要有三類:剛體、碰撞體、關節。目前我們只需要關注剛體和碰撞體就可以了。估計2D物理這塊很多朋友會覺得無所謂吧,大不了自己寫唄。博主之前和一個朋友交流,他做的一款打擊感不錯ARPG手遊從頭到尾從來沒有用過碰撞,所有的邏輯幾乎都是自己寫的,因為2D物理實在是簡單啊,只要通過計算距離就可以了。可是作為一名有節操的程式員,在深刻理解了不重複製造輪子這一內涵後,還會執著地自己寫碰撞檢測嗎?所以我們這裡就直接使用Unity提供的2D組件了。我們首先給主角添加一個剛體Rigidbody 2D組件,並勾選Fixed Anglg這是因為我們在碰撞的過程中並不需要角度的變化。同樣,我們不需要重力,所以需要將Gravity Angle設為0.


接下來我們分別給情境裡的主角、兩個戰鬥角色和一個NPC添加Box Collider 2D碰撞器,並編寫以下指令碼來分別測試碰撞器和觸發器,這裡需要把握一個細節,就是如果需要物體碰撞後有力的效果,則需要給該物體增加一個剛體組件,因為力的作用是相互的。下面給出指令碼:

using UnityEngine;using System.Collections;public class CollisionCheck : MonoBehaviour {void OnCollisionEnter2D(Collision2D Coll2D){if(Coll2D.gameObject.tag=="Fight Player"){Debug.Log("請離我遠一點,我正在練習絕世武功!");}}void OnTriggerEnter2D(Collider2D Coll2D){if(Coll2D.gameObject.tag=="NPC Player"){Debug.Log(" 儘管我是一名NPC,但是我的戲份還是要有的!");}}}
2D物理世界裡的碰撞檢測和3D物理世界裡的碰撞檢測基本一致,大家可以參考官方最新的API文檔,因為國內翻譯的API文檔基本上都沒有這一部分。好了,我們來看看運行效果吧!


       好啦,今天的內容就是這樣了,希望大家喜歡啊,為什麼每次寫完部落格都這麼累啊?難道是因為要查閱大量的資料嗎?有不懂的地方大家可以給我留言,我盡量給大家解決,還是希望大家能關注和支援博主的部落格,這樣博主才有勇氣一直寫下去。好了,就這樣啦!


每日箴言:生命中所有的挫折與傷痛,所有的經曆,都是為了造就你鍛煉你。不要總說歲月殘忍,它其實溫柔了你。




-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

喜歡我的部落格請記住我的名字:秦元培,我的部落格地址是blog.csdn.net/qinyuanpei。

轉載請註明出處,本文作者:秦元培, 本文出處:http://blog.csdn.net/qinyuanpei/article/details/40452019

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



問幾個對於unity3D開發遊戲的問題

我接觸過virtools和unity,感覺引擎都是各有優點的,只要精通了都一樣,個人感覺unity符合我的風格。不是很華麗,但是所有遊戲功能都可以實現。unity商店上有很多的資源可以下載,做2d遊戲也很方便。
沒事也可以匯出自己做的遊戲到手機上,自己自戀下,有種滿足感。你能把美工和編程結合起來還是很好的,這方面的人才學精的很少的。unity學習起來不是很難,只要多跟著視頻完整的做完幾個遊戲製作的例子就能實現大部分的功能,要想再精通,就要鑽研。
unity破解版網上很多,3.0的就足夠了,破解版還算穩定吧。偶爾出現問題。
感覺現在筆記本5000左右的都能滿足需求,做精模就要用台式機了。
 
unity3d開發過什遊戲?最好是知名點兒的

unity3d開發的遊戲不多!尤其是中文遊戲,開發的多數是網路遊戲以及第一人稱遊戲,pc上的大型遊戲好像只有新仙劍奇俠傳OL其他的網遊都是國外的多數是韓國和歐美,unity3d開發的遊戲多數都是用在iphone以及android等手機端遊戲!比較出名的是武士系列遊戲!塗鴉保齡球,城堡勇士,3D方塊貼圖,以及很多殭屍遊戲。境之邊緣,榮譽勳章空降兵,生化奇兵,虛擬競技場都是用UDK開發的,UDK是另外一種3D引擎不要混淆了!UDK比unity3d功能強大拓展性強而且比unity3d畫面效果強很多但是要求配置也比unity3d高不少,但是不如unity3d效率高,用unity3d製作遊戲更快。跨平台更好,而且很有針對性,啟動菜單可以選擇為android,IOS,pc,ps,psp,xbox等開發遊戲,而且unity3d可以製作網頁3d遊戲以及匯出flash功能!雖然unity3d沒有中文支援但在國內unity3d比UDK使用更廣泛!UDK有中文版的官方還出了中文字幕教程。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.