前言
如果你玩过三国志这种类型的战旗游戏或者模拟城市、部落冲突、海岛奇兵这种模拟经营类的游戏,那么你对网格地图一定不会陌生。在这些游戏中,所有地图场景中的物体都是基于整齐的网格来记录位置等信息。如下图:
如果你还是感知不到什么是网格地图。俄罗斯方块或者贪吃蛇你一定不会陌生,物体的存在是依托于规整的网格地图而存在的。
还是一如既往,本篇文章为零基础小白文,如果你是小萌新,并且对网格地图感兴趣的话,可以学习本片文章,然后尝试创建自己的游戏吧!
本文章的最终显示效果为:
1,创建组建出网格的基本单元
我们知道网格是由一个个格子组成的,所以第一步需要先创建出一个基本的模板:
创建一个脚本命名为Grid
,并定义一些我们需要修改的属性,由于本案例我想要创建一个有障碍物的地图,用来作为A*寻路的地图。所以需要下面的信息:
- 模板宽度
- 模板高度
- 模板颜色
- 模板是否为障碍(由颜色标识)
- 模板点击事件(模板颜色转换)
编写模板脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class Grid : MonoBehaviour
{
public float gridWidght;
public float girdHeight;
public bool isHinder;
public Color color;
public Action OnClick;
//当网格地图比较大时,每帧更新模板颜色比较消耗性能,可以修改为通过事件触发
void Update()
{
gameObject.GetComponent<MeshRenderer>().material.color=color;
}
//委托绑定模板点击事件
private void OnMouseDown()
{
OnClick?.Invoke();
}
}
编写好脚本后,创建模板预制体,本案例就使用一个简单的方块来作为演示案例,为了保证可以区分每一个方格,大小缩放到0.9
,这样两个方格之间就会有空隙来分割不同的网格块。
创建好方格后,将Grid
脚本挂在到物体上,并设置相关的初始参数,具体如图:
2,编辑网格创建脚本
接下来我们就需要封装一个网格创建的脚本,创建一个脚本命名为GridMeshCreate
,然后编写该脚本,为了实现创建网格地图的功能,我们需要获取到一些基本信息:
- 创建网格的宽度:
x
轴Grid
预制体的个数 - 创建网格的高度:
y
轴Grid
预制体的个数 - 创建网格中
Grid
的位置:通过一个初始点,然后通过Grid
的长宽计算
完成上面的信息的定义后,我们就可以编写脚本来实现网格创建的功能了,但是在此之前我们要思考一个问题,我们的创建的每一个Grid
的会完全一摸一样吗。答案肯定是不会。比如说,在一些模拟经营的游戏中,一个物体可能会对周围的环境造成一些影响,为了标识其影响范围,就需要通过不同颜色的网格来表示,如图所示:
在上面的图片中可以看出,我们需要对于不同区块的网格进行不同的信息展示,这就需要我们在网格创建时传入对应的处理逻辑。具体的代码结构为:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class GridMeshCreate : MonoBehaviour
{
[Serializable]
public class MeshRange
{
public int widght;
public int height;
}
//网格的宽高范围
public MeshRange meshRange;
//生成网格起始点
public Vector3 startPos;
//网格生成的父物体
public Transform parentTran;
//模板预制体
public GameObject gridPre;
private Grid[,] m_grids;
public Grid[,] MeshGridData
{
get
{
return m_grids;
}
}
//注册模板事件
public Action<Grid> gridEvent;
/// <summary>
/// 基于挂载组件的初始数据创建网格
/// </summary>
public void CreateMesh(