Unity2D游戏入门教程(一)宝石迷阵(2)生成宝石地图
本节教程将介绍如何生成一个有效的宝石地图。
游戏概况
我们的宝石矩阵是一个16x8的矩阵,移动相邻两块宝石如果有3块或3块以上连成一条直线,则消除,上面的砖块会掉落。
完善宝石块
添加碰撞体
选中全部宝石块:
添加碰撞体Box Collider 2D,有了这个碰撞体,之后的鼠标点击才能检测到宝石:
创建Block脚本
在Scripts
文件夹中,右键新建C#脚本,命名为Block.cs:
将脚本添加到宝石预制体上:
生成宝石地图
创建Grid脚本
新建脚本Grid.cs,将脚本拖拽到Main Camera
上:
双击打开Grid.cs,如下:
using UnityEngine;
using System.Collections;
public class Grid : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
删除掉Update
函数,这里我们不需要这个函数,添加如下代码:
public class Grid : MonoBehaviour {
public GameObject[] Blocks;
public int Width = 16;
public int Height = 8;
public Block[,] Map;
public int[,] MapNum;
void Start () {
Map = new Block[Width, Height];
MapNum = new int[Width, Height];
}
}
Blocks
用来保存宝石预制体,Width
和Height
是我们矩阵的宽高,Map
用来保存生成好的宝石预制体的组件Block脚本,MapNum
用来保存生成好的宝石对应的数字。现在我们在Unity中为Blocks
赋值,Blocks
的Size
设为7,然后将宝石预制体一一拖到对应的Element
上:
生成宝石地图
然后我们就可以生成宝石地图了,添加两个函数InitMapNum
和InitMap
:
private void InitMapNum()
{
for (int i = 0; i < Width; i++)
{
for (int j = 0; j < Height; j++)
{
int num = Random.Range(0, Blocks.Length);
MapNum[i, j] = num;
}
}
}
private void InitMap()
{
for (int i = 0; i < Width; i++)
{
for (int j = 0; j < Height; j++)
{
GameObject obj = Instantiate(Blocks[MapNum[i, j]], new Vector2(i, j), Quaternion.identity) as GameObject;
Map[i, j] = obj.GetComponent<Block>();
}
}
}
InitMapNum
函数会对地图上的每个点随机初始化一块宝石,将它在Blocks
中的位置保存起来。InitMap
函数则根据MapNum
,在画面上初始化宝石预制体,然后将预制体的Block
脚本保存起来。然后我们在Start
函数中调用这两个函数:
void Start () {
Map = new Block[Width, Height];
MapNum = new int[Width, Height];
InitMapNum();
InitMap();
}
最后点击运行,我们得到了如下的地图:
完善宝石地图
上一幅宝石地图明显还有不完善的地方,有的地方是3个相连,为了不出现这种情况,我们还需要一点改进,首先我们需要一个函数来判断一点是否3点相连,这里我们添加IsLine
函数,该函数判断一点向左向下是否3点相连:
// 判断一点向左向下是否3点相连
private bool IsLine(int i, int j)
{
if (i >= 2 && MapNum[i, j] == MapNum[i - 1, j] && MapNum[i, j] == MapNum[i - 2, j])
return true;
if (j >= 2 && MapNum[i, j] == MapNum[i, j - 1] && MapNum[i, j] == MapNum[i, j - 2])
return true;
return false;
}
然后在InitMapNum
中,随机初始化一个宝石后,我们需要判断该宝石是否存在3点相连的情况,如果存在,则需要重新初始化,直到不3点相连为止:
private void InitMapNum()
{
for (int i = 0; i < Width; i++)
{
for (int j = 0; j < Height; j++)
{
int num = Random.Range(0, Blocks.Length);
MapNum[i, j] = num;
while (IsLine(i, j))
{
num = Random.Range(0, Blocks.Length);
MapNum[i, j] = num;
}
}
}
}
现在我们点击运行,就看不到3点相连的情况发生了:
本节教程完毕,下一节教程中,我将讲解如何判断一幅地图是死图。
参考
上一篇: Three.js中的矩阵
下一篇: [PPPOE]RP-PPPOE脚本分析