目标
当我进入房间,然后出去之后,当前房间设置为已访问,同一列的其它房间设置为不可访问,当前房间相连的房间设置为可访问
实现
点击房间广播
因为 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
标签:10,逻辑,filePath,mapLayout,房间,广播,jsonFolder,进出,public From: https://www.cnblogs.com/hellozjf/p/18049452