原文地址: http://www.rocket5studios.com/tutorials/make-a-2d-game-with-unity3d-using-only-free-tools-part-3/
原版翻譯,轉載請註明出處:http://blog.csdn.net/ariel7321/article/details/7777157
本節中,我們將加入主角、掛鉤一些腳本、給梯子和繩索添加碰撞,最後主角可以在這個關卡里移動。
點擊這裏查看本節完成後的效果:點我!
製作主角的精靈圖集
如果你跟着我這個教程,你肯定會爲主角的移動而興奮,因此我們用TexturePacker先製作一個精靈圖集。
Download
the source sprite .png’s ,解壓到項目中。如果你在第二節中已經做過了就跳過此步驟。
打開TexturePacker ,並將sprites/player目錄下的所有.png文件都拖到Sprites面板中。
Texture Settings / Layout:
- 將Algorithm 設置成Basic。
- 將Border Padding設置爲1.
- 將Shape Padding設置爲1.
- 不勾選Trim。
Texture Settings / Output:
- 保留Data格式爲cocos2d。
- 在Data File中,點擊...,將輸出保存到項目的Assets下(我保存在Assets/SpriteAtlases),保存爲“player”。
- TexturePacker 自動給文件加了後綴.plist,但是Unity需要.xml文件,因此我們將.plist改爲.xml。
- Texture File路徑應該也被設置成和Data File一樣的了。
如果你點擊Publish,然後切換到unity你就會在項目視圖裏看到SpriteAtlases 文件夾,在此文件夾下看到精靈貼圖和精靈數據文件。
- 在項目視圖裏選擇player.png,在Inspector 中將Filter Mode改爲Point。
- 點擊 Override for Web,將Format 設置成Truecolor ,然後點擊Apply。
製作主角精靈
- 在unity的項目視圖,點開orthello:Orthello –> Objects –> Sprites –> SpriteAtlas,然後將 SpriteAtlas-Cocos2D拖到Hierarchy中。
- 在Hierarchy窗口,點開OT->Containers,你會發現出現了一個新的Container,名字類似“Container (id=-6840)“,這個Container將會包容我們關卡需要的所有的精靈,所有我們可以命名它爲“player”。
- 將“player.png”拖放到“OTSprite Atlas Cocos 2D” 腳本的Texture位置。
- 將“player.xml”拖放到“OTSprite Atlas Cocos 2D” 腳本的Atlas Data File 位置。
- 將Animation 對象拖到Hierarchy中 Orthello –> Objects –> Sprites ,這將會在OT –> Animations下添加一個新的對象,名字類似 “Animation (id=-4320)“,將其重新命名爲“player anims”。
- 點選剛創立的動畫對象,將設置修改爲下圖所示的。
- 在Framesets下,將Size設置爲9.
- 爲了填充Container區域,將 OT –> Containers 下的player拖放進去。
製作主角精靈
- 然後將Orthello –> Objects –> Sprites 下的AnimatingSprite 拖放到Hierarchy中,這會給場景添加一個新的對象,名字類似“Animating Sprite (id=-23050)“。將名字改爲“player“。
- 將“player anims”拖放到“player”的Animation位置。 Sprite Container位置會被自動填上“player”容器對象。如果沒有,你可以自己將“player”容器對象拖放到此位置。
- 此時你應該看到player精靈在場景中,如果你播放,你會看到player的動畫在一直播放。但我們不希望動畫在一開始就播放,所以將 Play On Start的勾選去掉。
給主角添加碰撞檢測
爲了使主角能正確的和梯子繩子進行碰撞,我們需要做以下設置:
- 選中player,勾選“OTAnimating Sprite”下的Collidable,這會給對象自動添加一個Rigidbody。
- 點開Physics旁的下拉菜單,選擇Custom。
- 在Transform中,將Scale Z設爲1.
- 將Depth改爲-1.
- 在Box Collider中,將Center Y改爲-0.1,Z改爲1. 將Size X改爲0.45, Y改爲0.6,Z改爲0.4.
如果你按照上面的步驟去做了,那麼你將得到下面圖示結果:
將Depth改爲-1以及將Box
Colider的Z改爲1,這會使主角靠近攝像機一些,使碰撞器在Z軸的0位置。這樣做有兩個效果:首先可以保證主角始終在關卡背景的前面而不會被擋住,其次保證碰撞器在Z軸的0位置使之可以和梯子繩子進行碰撞。這聽起來玄乎,但是你看看下圖就明白是怎麼回事了:
設置射擊動畫
我們需要添加另外一個動畫,當我們按下開火鍵時,會有子彈從主角身上發出,並撞擊地面。
製作射擊動畫
- 將Orthello –> Objects –> Sprites中的Aniamtion對象拖放到Hierachy中。這會在OT –> Animations下創建一個新的名字類似“Animation (id=-4320)“的對象,將其重命名爲“shoot anims”。
- 點選“shoot anims”對象,將設置設成下圖所示。將OT –> Containers下的level容器拖放到Container 區域。
製作射擊精靈
- 然後將Orthello –> Objects –> Sprites 下的AnimatingSprite 拖放到Hierarchy中,這會給場景添加一個新的對象,名字類似“Animating Sprite (id=-23050)“。將名字改爲“shoot“。
- 將“shoot anims”拖放到“shoot”的Animation位置。 Sprite Container位置會被自動填上“level”容器對象。如果沒有,你可以自己將“level”容器對象拖放到此位置。
- 將Transform Position X設置爲-1,這樣就會使其位置在主角精靈的左側。
- 將深度Depth改爲-1,這樣它始終在關卡背景的前面。
- 將 Frame Index設置爲18.
- 此時你應該看到shoot精靈在場景中,如果你播放,你會看到shoot的動畫在一直播放。但我們不希望動畫在一開始就播放,所以將 Play On Start的勾選去掉。
- 我們只希望在主角真的發射子彈時子彈纔出現,所以我們把 Mesh Render給勾掉,隱藏子彈動畫,直到我們用腳本來重新打開它。
給子彈精靈加個父節點
我們希望子彈精靈跟隨者主角,我們也希望能根據主角的面向來左右翻轉這個精靈。
- 創建空對象 Object –> Create Empty。
- 將其命名爲“shoot parent”,並是Position在0、0、0位置。
- 在Hierarchy中,將shoot精靈拖放到shoot parent上,使shoot成爲shoot parent的子節點對象。
- 將shoot parent對象拖放到player精靈上,使之成爲player精靈的子節點對象。
如果你按照我的步驟,你的Hierarchy就跟下圖差不多。注意,爲了使結構更緊湊,我把所有level相關的對象都放到了一個名爲“LEVEL”的空對象下了。
注意:爲了使後面的腳本能正確的工作,player下的子節點對象的名字一定要和上圖中的一模一樣。
添加腳本
我們終於要添加腳本來使主角移動了。
- Download the player scripts 下載腳本,解壓到你電腦硬盤中。
- 將裏面的腳本拖放到項目的Asset文件夾裏。
- 創建一個空遊戲對象Game Object –> Create Empty。
- 將新對象命名爲“Scripts”。
- 將xa.cs腳本文件拖放到Scripts對象上。
- 將player.cs 和 playerAnims.cs腳本文件拖放到player對象上。
- 確保主角站在一個磚上,這樣他不會掉下去。要記住,實際上是主角的Box Collider和其它物體碰撞,而不是可見主角精靈,所以要使主角的位置像0,0,-1(x,y無所謂,但是z一定要保持在-1)。
好了,如果你按照了以上所有步驟,那麼此時當你播放這個遊戲,你會發現主角能夠站在磚上而不會掉下去了。並且當你按鍵盤上的左右方向鍵時主角會跟着移動,而且還有動畫。
本教程並不解釋腳本如何工作的,但是我在腳本里做了註釋,希望能幫到你。如果你有任何的疑問,你可以在回覆中提問,也可以給我email。
給梯子加碰撞
創建一個梯子碰撞體
- 創建一個Cube,GameObject –> Create Other –> Cube。
- 將Cube命名爲“Ladder”。
- 打開Tag Manager,Edit –> Project Settings –> Tags。
- 創建“Ladder”和“Rope”兩個Tag。
- 讓我們再創建一個層Layer “NoDraw”。
- 現在將Ladder對象的Tag改爲Ladder,Layer改爲NoDraw。
在遊戲視圖中隱藏梯子碰撞體
- 點擊Main Camera。
- 在Camera下面,打開Culling Mask下拉菜單,點掉NoDraw。這樣在NoDraw層的物體都不會在遊戲視圖裏看到了。
調整梯子碰撞體的大小和位置
梯子碰撞體需要比可見的梯子大一個單元,這就是說,如果你的梯子有4塊拼圖片高,那麼碰撞體得有5個高。
- 假設你的梯子有4個單位高:選擇Ladder碰撞體,將Scale Y改爲5.
- 使用Vertex Snap將Ladder與梯子的底部拐角對齊。
- 你可以複製這個Ladder,然後與其他梯子對齊。
你的Ladder應該跟下圖所示一樣:
現在你按Play,當主角碰到梯子時,可以上下爬梯子了,可以從梯子的上下兩端走出,如果你從梯子中間走出去,也可以從梯子的中間掉下來。
給繩子加碰撞
創建一個繩子碰撞體
- 創建一個Cube,GameObject –> Create Other –> Cube。
- 將Cube命名爲“Rope”。
- 現在將Rope對象的Tag改爲Rope,Layer改爲NoDraw。
調整繩子碰撞體的大小和位置
繩子碰撞體需要比可見的繩子大一個單元,這就是說,如果你的繩子有4塊拼圖片長,那麼碰撞體得有5個長。
- 假設你的繩子有4個單位長:選擇Rope碰撞體,將Scale X改爲5.
- 使用Vertex Snap將Rope與繩子的底部拐角對齊。
- 你可以複製這個Rope,然後與其他繩子對齊。
現在你按Play,當主角碰到繩子時,可以左右爬繩子了,可以從繩子的左右兩端走出,如果你從繩子中間走出去,也可以從繩子的中間掉下來。
結尾
現在已經完成了主角的所有移動動作了:跑、爬梯子和繩子。下一講我們將加入計分系統、打破磚塊和撿起物體。
你可以下載本項目 download the project up to this point,也可以試玩本項目 play the web version of the project here.