Unity学习笔记--实现一个简单的2D地图编辑器

效果图

效果图

步骤一

首先我们新建一个3D的项目(3D和2D都行)。

步骤二

在Assets文件夹下面新建一个Picture文件夹存放我们的图片。
我把我工程的素材发出来。

墙

地面

地面
之后把素材拖入到Picture文件夹下面。

步骤三

在Hierarchy窗口下创建一个Sprite,把我们的图片托上去。之后在Assets文件夹下面新建一个文件夹叫做Prefab,把我们的游戏物体拖进去。
在这里插入图片描述
现在我们的Prefab文件夹下面应该有两个预制体了,一个地面一个墙。

步骤四

在Assets文件夹下新建一个Script文件夹,在Script文件夹下面新建一个脚本,名字什么的都行,我的叫做ATest

脚本内容如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ATest : MonoBehaviour
{
    
    
    [SerializeField] private GameObject groundPrefab;
    [SerializeField] private GameObject wallPrefab;
    private int[,] _map;

    public int Length;
    public int Width;
    private float offset;

    private void Awake()
    {
    
    
    	//之所以是64,因为我的素材大小是64*64
    	//如果你们的素材是128*128,那么此处改成128就行了
        offset = 64 / groundPrefab.GetComponent<SpriteRenderer>().sprite.pixelsPerUnit;
        
        _map = new int[Length, Width];
    }
    private void Start()
    {
    
    
        InitialMap();
    }
    //初始化地图
    private void InitialMap()
    {
    
    
        _map[1, 1] = -1;
        _map[1, 2] = -1;

        for (int i = 0; i < Length; ++i)
        {
    
    
            for (int j = 0; j < Width; ++j)
            {
    
    
                GameObject go = null;
                Vector3 position = new Vector3((i - (Length >> 1) + 1) * offset, (j - (Width >> 1) + 1) * offset);
                switch (_map[i, j])
                {
    
    
                    case -1:
                        go = Instantiate(wallPrefab, position, Quaternion.identity);
                        break;
                    case 0:
                        go = Instantiate(groundPrefab, position, Quaternion.identity);
                        break;
                }
            }
        }
    }
}

将预制体拖入到对应变量上。

到此为止,我们运行游戏,可以看到如下效果
效果图
最基本的地图生成好了,那么我们该怎么编辑地图呢,难道手动改二维数组的值吗,这样的话有点麻烦,我们想只用鼠标点击来编辑地图。

步骤五

在Script文件夹下新建一个脚本,代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ATest1 : MonoBehaviour
{
    
    
    [SerializeField] private GameObject wallPrefab;
    
    // Update is called once per frame
    void Update()
    {
    
    
        // 获取屏幕到3D空间的坐标
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        // 检测触碰到3D空间的射线
        if (Physics.Raycast(ray, out RaycastHit hit))
        {
    
    
            if (Input.GetMouseButtonDown(0))
            {
    
    
                if (hit.transform.CompareTag("Wall")) Destroy(hit.transform.gameObject);
                else
                    Instantiate(wallPrefab).transform.position
                            = new Vector3(hit.transform.position.x
                            , hit.transform.position.y, -1);
            }
        }
    }
}

把墙的预制体添加一个Tag:Wall。将预制体拖到变量上(此处是墙的预制体)

之后把墙和地面的预制体加上BoxCollider(注意一定不能是BoxCollider2D),因为需要检测碰撞,也就是点击的位置。
在这里插入图片描述
之后运行Unity就可以看到我们是可以编辑地图的了。

猜你喜欢

转载自blog.csdn.net/qq_52855744/article/details/118857852#comments_21911677