10. 房间进出逻辑

目标

当我进入房间,然后出去之后,当前房间设置为已访问,同一列的其它房间设置为不可访问,当前房间相连的房间设置为可访问

实现

点击房间广播

因为 RoomPrefab 上面有碰撞体,所以鼠标或手指点击它的时候会触发OnMouseDown方法,然后就会触发LoadRoomEvent广播事件

监听点击房间广播

SceneLoadManager 会监听LoadRoomEvent广播事件,然后调用SceneLoadManager.OnLoadRoomEvent,当它卸载并加载完场景之后,就会触发AfterRoomLoadedEvent

监听房间加载完毕广播

GameManager 会监听房间加载完毕广播,当广播产生的时候就会调用GameManager.UpdateMapLayoutData

在这个方法里,会根据当前房间的列号和行号,从MapLayoutSO中查出当前房间信息,并将它的状态设置为Visited

然后找到当前房间同一列的房间,并将它们的状态设置为Locked

最后找到当前房间相连的房间,并将它们的状态设置为Attainable

因为Map场景每次都需要从文件中读取MapLayoutSO,所以该SO的任何变动都需要写入到文件中

DataManager

为了简单点,我直接用单例来实现DataManager,在 Windows 系统上,数据最终会被保存到C:\Users\hellozjf\AppData\LocalLow\DefaultCompany\DreamOfTheKingdom\save\map.json

using System.IO;
using Newtonsoft.Json;
using UnityEngine;

public class DataManager : MonoBehaviour
{
    // 文件存储路径
    private string jsonFolder;
    private string jsonFileName = "map.json";

    public static DataManager instance = null;
    
    private void Awake() 
    {
        instance = this;

        // 定义地图序列化的路径
        jsonFolder = Application.persistentDataPath + "/save/";
    }

    /// <summary>
    /// 将 mapLayout 序列化成字符串,并写入到文件中
    /// </summary>
    public void SaveToFile(MapLayoutSO mapLayout)
    {
        var filePath = jsonFolder + jsonFileName;
        var jsonData = JsonConvert.SerializeObject(mapLayout);
        if (!File.Exists(filePath))
        {
            Directory.CreateDirectory(jsonFolder);
        }
        File.WriteAllText(filePath, jsonData);
    }

    /// <summary>
    /// 从文件中读取数据,并写入到 mapLayout
    /// </summary>
    public void LoadFromFile(MapLayoutSO mapLayout)
    {
        // 首先把 mapLayout 清空一下
        mapLayout.mapRoomDataList.Clear();
        mapLayout.linePositionList.Clear();

        // 读取 JSON
        var filePath = jsonFolder + jsonFileName;
        if (File.Exists(filePath))
        {
            var stringData = File.ReadAllText(filePath);
            JsonConvert.PopulateObject(stringData, mapLayout);
        }
    }
}

其它

其实里面还有一些小细节,但是太繁琐就不列出来了

项目相关代码

代码仓库:https://gitee.com/nbda1121440/DreamOfTheKingdom.git

标签:20240302_2254

posted @ 2024-03-02 23:20  hellozjf  阅读(47)  评论(0编辑  收藏  举报