Unity 3D官方教程——2D Roguelike學習記錄


1.准備工作

新建2D項目命名為2D Roguelike,導入官方資源。保存場景命名為Main。

2.動畫制作

Assets文件夾下新建2個文件夾Animations和AnimatorControl。新建空對象命名為Player,打開Sprites文件夾下精靈並展開,將前6個小人兒畫一起拖入(點第一個摁住shift點最后一個),會自動彈出保存動畫對話框,存入Animations文件夾下並命名為PlayerIdle。



把Animations下的Player動畫控制器拖入AnimatorController文件夾下。接着拖入另外兩個小人兒動畫,命名為PlayerChop和PlayerHit(具體拖入哪些精靈看官方視頻)。每個游戲對象可有多個動畫,但只能有一個動畫控制器。雙擊Player動畫控制器,單擊橙色方框的PlayerIdle將Speed改為0.5(動畫速率)。


將游戲對象Player的Tag 選為"Player",Lay選為"BlockingLayer",Sprite Renderer下的Sorting Layer選為"Units"(列表最后一個,即 最后被渲染,在游戲圖層顯示為最上層)。為Player添加Rigidbody2D和Box Collider,將Rigidbody2D的Body Type改為Kinematic。(我們將用腳本來控制移動),Box Collider的Size改為(0.9,0.9)(比其本身體積稍小,使得運行后player看上去與其他對象接觸 了后觸發)。將Player拖入Prefabs文件夾成為預制件。



如法依次制作Enemy1的游戲對象及其動畫,將Enemy1的動畫控制器拖入AnimatorController。並添加Rigidbody2D和BoxCollider,制作完畢后將Enemy1拖入Prefabs。


接着把Enemy1改名為Enemy2,拖入Enemy2所需的動畫。我們看到Enemy2的動畫控制器和Enemy1的一樣,動畫控制器,把Enemy2的動畫從控制器里移除,因為兩個敵人的動畫切換邏輯是一樣的。所以在AnimatorController文件夾內新建Animator Override Controller命名為Enemy2,將新建的動畫改寫控制器的Controller選為Enemy1,(意思是該改寫控制器的父對象是Enemy1 動畫控制器),並替相應動畫。



切回到Hierarchy下的Enemy2,把Animator組件下的Controller替換為Enemy2動畫控制器,接着把游戲對象Enemy2拖入prefabs,並刪除Hierarchy下的Enemy2。


3.其他對象預制件(Tile Prefabs)

先添加地板,新建空對象命名為Floor1,添加Sprite Renderer,將Sprite選為所需對象,Sorting Layer選為Floor。然后將Floor1拖入Prefabs,接着將Floor1改名為Floor2,並更換精靈,拖入Prefabs。依次把所有地板預制件制作好(共有8種地板)。




接着制作出口,把Floor8更名為Exit,Tag改為Exit。精靈更換好,Sorting Layer改為Items。為Exit添加Box Collider2D並勾選Is Trigger。拖入預制件。



然后制作食物和汽水,和上面制作出口一樣,SortingLayer為Items,Box Collider勾選Is trigger,注意Tag是food和Soda。存入Prefabs。


之后制作外牆,將Soda改名為OuterWall1,Tag選為Untagged,Layer選為BlockingLayer(玩家,敵人,牆都是不可直接通過的),Sorting Layer選為Floor,取消勾選Is trigger。依次制作其他外牆(共有3個)。記得每個都拖入Prefabs。


接下來是內牆,OutWall3改名為Wall1,Sorting Layer選為Items。不要勾選Is Trigger。依次制作其他內牆,共8堵。




4.隨機生成地圖&儲存地圖(Board Manager)

新建Scripts文件夾新建BaordManager腳本,並編輯





5.游戲流程控制(Game Manager)

Hierarchy下新建空對象命名為GameManager,新建腳本命名為GameManager並拖入。編輯。





注意:OnLevelWasLoaded已經被淘汰了,官方package里附帶的說明pdf里將這一方法修正為:








將BoardManager腳本也拖入,並在Inspector下拖入所需的各個prefab(小技巧:點擊Inspector右上角的小鎖鎖定該面板方便拖入)。
點擊Main Camera,將Position設為(3.5,3.5,0),以對准場景,背景設為黑色。
把Hierarchy下的GameManager拖入Prefabs。並deleteHierarchy下的。
我們再新建一個腳本命名為Loader,以確保加載GameManager。將Loader腳本掛到Main Camera上


注意:在實際運行時會發現level直接是2,4,6...這樣一路跳上去。
在官方論壇里給出了解釋:https://forum.unity.com/threads/2d-tutorial-roguelike-issues.435126/




第一種修改方案:GameManager里像說明pdf里修改,Loader里再次如上所說修改




記得把GameManager游戲對象存成prefab,然后刪掉hierarchy下的。把Loader掛到Main Camera上並把對應prefab拖入。


第二種修改方案:

【參考:https://answers.unity.com/questions/1139046/fix-for-2d-roguelike-no-restart-and-jumping-scenes.html】


保持原Loader腳本,然后把GameManager進行如下修改




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


6.移動游戲對象(Moving Objects)

在這個游戲里,player和enemy的移動模式有相似之處,所以把這些移動相似之處寫成一個抽象類腳本,里面有若干待改寫的基類方法。

新建腳本MovingObject並編輯,






7.對內牆的設置

牆分外牆和內牆,我們想要Player可攻擊並打碎內牆,新建腳本命名為Wall並編輯。



選中八個內牆預制件拖入腳本,並把對應的精靈填入。



8.玩家設置

把Player prefab拖到Hierarchy下。(每次restart場景(nextlevel)hierarchy下都只剩Main Camera和Player。運行時由Main Camera下的Loader實例化GameObject,再由GameObject實例化一系列其他的東西。在first level后GameObject不銷毀,除了Player地圖上的其他東西實例化)

先來制作Player的游戲控制器,打開Player的游戲控制器。從休閑狀態到戳刺狀態:



注意取消勾選Has Exit Time,並把Transition Duration設為0(2D動畫沒有過渡),同樣戳刺狀態到休閑狀態的箭頭設置:



切回休閑狀態的邏輯是戳刺狀態動畫存在一秒,不需要Conditions。勾選Has Exit Time並設置為1。

Idle和hurt狀態的也是同樣的操作





接下來編寫player移動攻擊等腳本,新建Player腳本拖入Player並編輯。








記得將腳本的BlockLayer選上。



9.敵人設置

新建腳本命名為Enemy,打開並編輯




接着設置怪物的動畫控制器,打開Enemy1動畫控制器,和Player的動畫控制器一樣,只有一個狀態轉換,新設置狀態Trigger命名為enemyAttack(注意和腳本里的拼寫要一致),按照上面Player的說明操作。我們不需要設置Enemy2的控制器,他們共享轉換狀態(Animator Override Controller)。將兩個Enemy都拖入腳本,並選上BlockingLayer,將Enemy1的傷害值填為10,2的傷害值填為20。

10.計分板和關卡設置

Hierarchy下新建Image命名為LevelImage,Anchor Presets選為全覆蓋(摁住alt+shift,點擊最右下角的圖標),顏色設為黑色,新建Text命名LevelText,Anchor Presets選為中心,字體大小為32,顏色為白色。字體太大了屏幕無法容納,所以選擇Horizontal Overflow和Vertical Overflow,並且點選居中。將字體選為PressStart2P-Ragular。將Level Text拖選成Level Image的子對象。



新建Text命名為FoodText,一系列如下設置后將FoodText拖到LevelImage的上方為較低圖層。




將FoodText的Anchor-Ymin和max都設為0.05,修改Pos-Y為0,使分數板稍微上移。

將腳本里所有有關UI的注釋語句還原。(可根據視頻教程自行添加),注意GameManager下的這段,找到游戲對象可用name = GameObject.Find("targetname");




11.音頻設置

Hierarchy下新建並命名為SoundManager,添加2個Audio Source組件,並新建腳本命名為SoundManager。



保存后拖到SoundManager並在Wall,Player和Enemy腳本添加相應的語句以拖入音頻並順利播放。(看視頻教程)。

12.移動端發布

首先要在Buliding Settings添加當前場景,Platform選擇Ios后關閉Building Settings,然后在Player腳本加上下面語句



UNITY_EDITOR適用於unity本身調試,UNITY_STANDLONE適用於IOS,WINDOW和LINUX,UNITY_WEBPLAY適用於網頁調試。




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

完成游戲了,實際上測試的話,游戲只可以玩兒第一關,第二關就無法加載了,這是版本更迭腳本語句變化引起的。

將GameManager腳本做如下替換


替換為


並把private int level = 1;改為private int level =0(否則將導致直接從第二關開始)

再把Player腳本的如下語句


改成


注意到我把food值存入語句放入了Restart,刪除了Disable方法,這是因為如果按照原來那樣放food值根本不變。




最后,如果在官方教程的學習里遇到任何問題去看Unity官方論壇的2D Roguelike: Q&A會非常有幫助。


參考:

http://liuqingwen.me/blog/2017/10/12/learning-notes-of-2d-roguelike-tutorial-in-unity3d/

http://blog.csdn.net/fjl2007/article/details/46982163

https://www.jianshu.com/p/8fb81841fcf9








注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com