Files

102 lines
2.6 KiB
Markdown
Raw Permalink Normal View History

2026-05-03 14:06:26 +08:00
保存地图场景,顾名思义,他的本质就是保存,将我们的房间数据保存到另一个物体当中,并且我们可以从这个物体中读取数据.
我们已经使用过了scriptableobject,知道他是一种数据容器,可以储存和保存数据,因此考虑使用SO文件来储存地图数据.
我们需要保存的地图数据只有2个,第一个是房间,第二是连线.地图当中有非常非常多的房间和连线,所以我们肯定会使用列表来储存,但是没有一种类型可以支持我们储存这些数据,因此我们需要创建一个自定义的类来储存房间和连线.
我们先考虑一下储存房间需要哪些信息,他的行和列,他的X.Y坐标,以及他的roomData数据和RoomState.那我们的连线呢?只需要保存他的起始坐标和终止坐标就可以了.虽然我们的游戏是2D的,但是连线的位置坐标却是3D的,vector3类型的无法被序列化,我们需要创建一个可以帮助v3序列化的工具类.
```
using UnityEngine;
[System.Serializable]
public class serializeVector3
{
    public float x, y, z;
    public serializeVector3(Vector3 vector3)
    {
        x = vector3.x;
        y = vector3.y;
        z = vector3.z;
    }
    public Vector3 ToVector3()
    {
        return new Vector3(x, y, z);
    }
    public Vector2 ToVector2Int()
    {
        return new Vector2((int)x, (int)y);
    }
}
```
这个类可以帮助我们序列化vector3.
在想好了上述内容之后,我们创建MapLayout,他的代码如下
```
public class MapLayoutSO : ScriptableObject
{
    //创建两个列表,一个储存房间信息,一个储存连线信息
    public List<MapRoomData> roomDataList = new List<MapRoomData>();
    public List<MapLineData> lineDataList = new List<MapLineData>();
}
[System.Serializable]
public class MapRoomData
{
    //我们要保存的房间的信息
    public float PosX, PosY;
    public int column, line;
    public RoomDataSO roomData;
    public RoomState roomState;
    public List<Vector2Int> linkTo;
}
[System.Serializable]
public class MapLineData
{
    //连线我们只需要知道他的起始坐标和结束坐标但是这些内容是vector3类型的
    // vector3类型的无法被序列化,我们需要创建一个可以帮助v3序列化的工具类
    public serializeVector3 startPos, endPos;
}
```
那么后面我们需要做的,是从rooms这个列表当中,循环读取,将他的内容储存到我们的SO文件当中.
同时在创建地图的时候增加一层判断,如过我们的SO文件当中有数据,那么读取SO文件的数据,而不是从新创建地图.