欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity2D游戏入门教程(一)宝石迷阵(2)生成宝石地图

程序员文章站 2024-03-16 18:11:34
...

本节教程将介绍如何生成一个有效的宝石地图。

游戏概况

Unity2D游戏入门教程(一)宝石迷阵(2)生成宝石地图

我们的宝石矩阵是一个16x8的矩阵,移动相邻两块宝石如果有3块或3块以上连成一条直线,则消除,上面的砖块会掉落。

完善宝石块

添加碰撞体

选中全部宝石块:

Unity2D游戏入门教程(一)宝石迷阵(2)生成宝石地图

添加碰撞体Box Collider 2D,有了这个碰撞体,之后的鼠标点击才能检测到宝石:

Unity2D游戏入门教程(一)宝石迷阵(2)生成宝石地图

创建Block脚本

Scripts文件夹中,右键新建C#脚本,命名为Block.cs:

Unity2D游戏入门教程(一)宝石迷阵(2)生成宝石地图

将脚本添加到宝石预制体上:

Unity2D游戏入门教程(一)宝石迷阵(2)生成宝石地图

生成宝石地图

创建Grid脚本

新建脚本Grid.cs,将脚本拖拽到Main Camera上:

Unity2D游戏入门教程(一)宝石迷阵(2)生成宝石地图

双击打开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用来保存宝石预制体,WidthHeight是我们矩阵的宽高,Map用来保存生成好的宝石预制体的组件Block脚本,MapNum用来保存生成好的宝石对应的数字。现在我们在Unity中为Blocks赋值,BlocksSize设为7,然后将宝石预制体一一拖到对应的Element上:

Unity2D游戏入门教程(一)宝石迷阵(2)生成宝石地图

生成宝石地图

然后我们就可以生成宝石地图了,添加两个函数InitMapNumInitMap

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();
}

最后点击运行,我们得到了如下的地图:

Unity2D游戏入门教程(一)宝石迷阵(2)生成宝石地图

完善宝石地图

上一幅宝石地图明显还有不完善的地方,有的地方是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点相连的情况发生了:

Unity2D游戏入门教程(一)宝石迷阵(2)生成宝石地图

本节教程完毕,下一节教程中,我将讲解如何判断一幅地图是死图。

参考

相关标签: unity 游戏 2d