Files
Obsidian_Unity/项目学习/王国之梦制作/9.保存地图场景.md
T
2026-05-03 14:06:26 +08:00

102 lines
2.6 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
保存地图场景,顾名思义,他的本质就是保存,将我们的房间数据保存到另一个物体当中,并且我们可以从这个物体中读取数据.
我们已经使用过了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文件的数据,而不是从新创建地图.