保存地图场景,顾名思义,他的本质就是保存,将我们的房间数据保存到另一个物体当中,并且我们可以从这个物体中读取数据. 我们已经使用过了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 roomDataList = new List();     public List lineDataList = new List(); } [System.Serializable] public class MapRoomData {     //我们要保存的房间的信息     public float PosX, PosY;     public int column, line;     public RoomDataSO roomData;     public RoomState roomState;     public List linkTo; } [System.Serializable] public class MapLineData {     //连线我们只需要知道他的起始坐标和结束坐标但是这些内容是vector3类型的     // vector3类型的无法被序列化,我们需要创建一个可以帮助v3序列化的工具类     public serializeVector3 startPos, endPos; } ``` 那么后面我们需要做的,是从rooms这个列表当中,循环读取,将他的内容储存到我们的SO文件当中. 同时在创建地图的时候增加一层判断,如过我们的SO文件当中有数据,那么读取SO文件的数据,而不是从新创建地图.