使用 Unity 3D 製作 2D 遊戲的重點做法

来源:互联网 发布:快喵vpn mac 编辑:程序博客网 时间:2024/05/08 17:14

2011年5月7日星期六

使用 Unity 3D 製作 2D 遊戲的重點做法

Unity 的官網上有提供一個 2D 遊戲的教學範例,這個遊戲只不過把鏡頭擺放在橫向位置跟隨角色移動,遊戲內物件運動時固定一個軸不動,使他像橫軸式的2D遊戲來玩,本質上其實還是個3D遊戲,所以如果沒有 3D 建模的話不就沒辦法做 2D 遊戲了?其實這些並沒有定論,就看製作者如何運用 Unity 來完成自己的遊戲。



首先我們先來說為何用 Unity 來做 2D 遊戲,除了 3D 與 2D 遊戲各有其樂趣之外,最主要的還是 Unity 方便使用的渲染及物理引擎,如果是像官方範例那樣使用 3D 建模來做,這些物件只需要做過一次,將來要轉成3D遊戲的玩法,也不需要重新建模,重複利用性高,對將來節約開發成本很有幫助,如果不使用 3D 建模的方式而改以平面貼圖的物件來做 2D 遊戲,對於各種物理現象如碰撞、重力、加速度等,也可以直接使用 Unity 的 Component 來完成,而且遊戲空間本身就是個 3D 空間,所以要製作出擁有多層次場景的 2D 遊戲也會變得較為方便,試想自己寫程式來做 2D 遊戲,光是碰撞、重力這種物理動作就夠傷腦筋了,再加上光影效果等變化,勢必要多加很多更細部的貼圖,而不如 Unity 加個燈光或什麼的,由 3D 渲染及物理引擎自行去運作即可。

使用 3D 建模的方式製作 2D 遊戲,直接看官網範例即可,其實和做 3D 遊戲沒啥差別,如果使用平面貼圖物件來做的話,只需要注意到幾個重點就可以很容易完成。

首先,就是如何貼圖呢?也許直覺會想到使用 GUI 來貼圖,但別忘了 GUI 是處在畫面的表面空間,是純 2D 的空間,一方面會受到畫面寬高解析度的影響,一方面是無法套用 3D 物理引擎的東西,而且 GUI Class 只能使用於 OnGUI() 中,根據我的使用經驗,OnGUI() 在每 frame 會執行數次,如果貼圖的圖檔設定不夠優化的話,在較好的硬體可能不受影響,但在 iPhone 3G 或 iPod Touch 等較舊機型硬體上,如此大量 GUI 貼圖及運算將影響到執行效能,降低整個遊戲的順暢度,所以應該避免利用 GUI 貼圖來製作 2D 遊戲內容,當然也可能利用一些程式設計技巧來達到使用 GUI 製作 2D 遊戲的目的,但這並不是這邊想要說明的方式,而且我並不建議那樣做^^,GUI 還是用在靜態的訊息表現上就好了;既然不建議利用 GUI 製作,那麼如何貼圖呢?大家應該都知道使用 Unity 選單建立平面物件 GameObject > Create Object > Plane ,這個平面有 200 個面,對我們來講並不需要那麼多,所以可以自行使用 3D 建模軟體自己拉個只有 2 面的平面來匯入 Unity 使用,建好平面物件後,在 Project 視窗中建立材質球並拉給已建立的平面物件即完成貼圖了,當然在這個材質球未有任何 Texture 的情況下是看不到任何貼圖的,此時只需要將欲貼圖的圖片檔拉給材質球就行了,材質球預設的 Shader 是 Diffuse ,會使貼圖貼滿整個四方形的平面,這樣貼圖的運用就不靈活了,通常我們會使用許多去背圖,此時只需要將 Shader 改為 Transparent 系列的 Shader 就可以達到去背的效果(通常沒特殊需求,我是使用 Transparent > Diffuse),如此貼圖的部份就完成了。


使用 Unity 選單建立平面物件  建立材質球材質球未有任何 Texture 的情況材質球預設的 Shader 是 DiffuseShader 改為 Transparent 系列Shader 是 DiffuseShader 改為 Transparent > Diffuse


此時在鏡頭前,此平面物件看起來就像是一般 2D 畫面的貼圖而已,但 Scene 視窗中可以很明顯的看出它是 3D 空間中的物件,你可以任意的為其加入其他 Component 或自己寫的 Script 來做控制,此時就可以為其加入剛體及碰撞體,那麼許多物理動作就能簡單又快速的完成了;此時會發生一些問題是在碰撞時可能會使平面轉動或是碰撞結果產生錯誤方向的位移,畢竟 2D 遊戲只有 X 軸和 Y 軸,碰撞後多了 Z 軸的位移不就把畫面破壞掉了,以往我們可能需要利用 Update() 或 FixedUpdate() 不斷的將平面的角度及位置調整回來,如今的 Unity 版本(3.3)則可以直接在剛體的 Component (Rigidbody) 上直接凍結某個軸的旋轉及位移,使其在碰撞後不受影響;當然,這個凍結項目只在物理引擎運算下有作用,我們還是可以透過程式碼去操作已凍結的軸。

加入剛體及碰撞體剛體可限制並凍結指定軸接下來是鏡頭的設定,通常預設投射(Projection)方式是透視(Perspective),這使畫面有景深的立體感,有些 2D 遊戲的背景或物件表現需要讓遠一點的東西較小,近一點的東西看起來較大,或是背景映出前景的影子等,那麼直接使用預設的 Perspective 即可,但如果你希望製作的 2D 遊戲是整個平面化的,希望場景內配置的物件不會因為其中一個較遠或較近而影響到大小或呈現角度,此時就必須將 Projection 改為 Orthographic ,那麼畫面內的鏡頭可視範圍將不會有任何遠近感,達到完全平面的效果。

改變鏡頭的投射方式基本上,有了以上三個重點,就能輕易的利用 Unity 3D 製作出 2D 遊戲,其他的就看設計者如何利用 Unity 做更多靈活的變化囉~!!
例如善用 Material 的 Tiling 及 Offset 的數值變化,也能輕易的把靜態貼圖變為有趣的動態貼圖(詳見官網的 material class )。

前陣子在網路上看到 EZ GUI 也是利用類似的原理,並且製作了一個很方便的 GUI 製作工具,在 Unity 的 Asset Store 可以買得到的樣子,有興趣的人不妨玩看看。
另外,上個月 Asset Stone 上架的 RageSpline 似乎也是個不錯的 2D 遊戲製作工具,有需要的人可以買來用看看。
這兩個我都只是看過展示影片而已,如果有哪位使用過,請不吝跟我分享一下使用感想。
原创粉丝点击