[游戏开发-学习笔记]菜鸟慢慢飞(二)-迷宫
简介:练手Demo,《走出迷宫》,文章主要说说如何创建迷宫。
学习Unity3D有一段时间了,自己想了一个项目来练手手。然后就有了这篇。
一.固定的格数,开局后随机生成。
说明:这个迷宫10*10,开始后随机生成,四周留下一个空做出口。
先说如何实现:
- 主要准备了三个Prefab:横墙,竖墙,柱子,墙高度是10,宽度是10,厚度是1,柱子高度是10.宽度和厚度都是10.
手动按照10*10排列(参考下图)
- 脚本
#region //初始化游戏 #endregion using System.Collections; using System.Collections.Generic; using UnityEngine; public class StartSet : MonoBehaviour { public GameObject[] aroundWalls; public GameObject[] walls; public int maxi=2; // Use this for initialization void Start() { //出口 int i=Random.Range(1, aroundWalls.Length); aroundWalls[i].SetActive(false); //生成迷宫 for (int j = 0; j < walls.Length; j++) { int x = Random.Range(0, maxi); if (x==0) { walls[j].SetActive(false); } else { walls[j].SetActive(true); } } } }
- 把四周的墙拖给Around Walls,里面的墙拖给Walls。
下面是部分图:
- 测试
下面,把脚本StartSet挂到Camera上,可以点开始游戏看效果了。
下面几个图是我这里的运行效果:
小结:
- 竖墙/横墙。其实是一样的,只是角度相差90。我这里为了脚本代码方便就做了两个。
- 这样的迷宫没有路径可言,完全是随机的。不一定走得到出口。我的想法是可以让角色带有“击穿墙”类似的功能。
- public int maxi=2 如果调大这个数,可以让迷宫难度升级。我最初的想法是制定 maxi=1,实际上却不是。
二. 随机大小迷宫
参照上面的内容我继续想,能不能做成随机大小的迷宫。
比如,我输入10,生成一个10*10的迷宫给我,输入25,生成一个25*25的迷宫给我。
延续上面的思路,生成“格子”,再用上面的脚本修改成迷宫。
- 先看看效果:分别是13*13,27*27,50*50
2. 如何实现
- 还是三个Prefab,横墙,竖墙,柱子。这里的大小比上面的大了10倍,偷懒少算点小数点^.^。
- 脚本:
1 using UnityEngine; 2 3 /// <summary> 4 /// 初始化迷宫 5 /// </summary> 6 public class InitializeMaze : MonoBehaviour 7 { 8 public GameObject WallH; 9 public GameObject WallV; 10 public GameObject pillar; 11 public int sidenumber = 100; 12 13 // Use this for initialization 14 void Awake() 15 { 16 int sidexy = sidenumber * 11; 17 18 for (int i = 0; i < (sidenumber + 1); i++) 19 { 20 for (int j = 0; j < (sidenumber + 1); j++) 21 { 22 int pillarx = i * 110; 23 int wallHx = 55 + 110 * i; 24 int pillarz = j * 110; 25 int wallVz = 55 + 110 * j; 26 27 if (i== sidenumber && j== sidenumber) 28 { 29 Instantiate(pillar, new Vector3(pillarx, 50, pillarz), Quaternion.identity); 30 continue; 31 } 32 if (i == sidenumber) 33 { 34 Instantiate(pillar, new Vector3(pillarx, 50, pillarz), Quaternion.identity); 35 Instantiate(WallV, new Vector3(pillarx, 50, wallVz), Quaternion.identity); 36 continue ; 37 } 38 if (j== sidenumber) 39 { 40 Instantiate(pillar, new Vector3(pillarx, 50, pillarz), Quaternion.identity); 41 Instantiate(WallH, new Vector3(wallHx, 50, pillarz), Quaternion.identity); 42 } 43 else 44 { 45 Instantiate(pillar, new Vector3(pillarx, 50, pillarz), Quaternion.identity); 46 Instantiate(WallH, new Vector3(wallHx, 50, pillarz), Quaternion.identity); 47 Instantiate(WallV, new Vector3(pillarx, 50, wallVz), Quaternion.identity); 48 } 49 } 50 } 51 } 52 }
3.测试
把三个Prefab拖到脚本对应位置,在Sidernumber中输入边。开始游戏就可以得到网格了。
得到网格后,第一个例子中的StartSet代码中,添加一段查找GameObject的代码,就能得到想要的迷宫了(可以试试,代码就不贴了)
总结:
1. 挺有意思的是生成网格的时候,很绕人,需要去掉边边角角。睡觉前灵感突然就来了,就想通了,挺有意思的。
2. Quaternion这个API看不懂,先放到学习清单中,如果会这个,应该就可以横墙,竖墙只用一个。
水平有限,欢迎指教:workhai@outlook.com
许愿:希望自己能找到一份全职游戏开发的工作。