10. 房间进出逻辑
1.02. 创建房间的 Prefab2.03. 设计地图配置表3.04. 生成地图上的房间4.07. 泛型事件框架5.08. 场景加载6.09. 保存地图场景
7.10. 房间进出逻辑
8.11. 制作卡牌 Prefab9.12. 创建卡牌数据类10.13. 对象池11.14. 制作卡牌库实现抽卡12.15. 创建卡牌布局13.16. 抽卡动画14.17. 实现卡牌扇形布局15.18. 实现鼠标事件16.19. 卡牌拖拽17.20. 攻击牌的拖拽指针18.21. 实现洗牌逻辑19.22. 导入Spine人物素材20.23. 人物基类代码21.24. 执行卡牌效果22.25. 制作血条的 UI Document23.26. 绑定血条数据24.27. 创建USS血条样式25.28. 制作 Gameplay Panel26.29. 绑定 Gameplay Panel 数据27.30. 回合转换28.31. 出牌能量判断29.32. 防御牌及 UI30.33. 回血的苹果牌及特效31.34. 增加力量牌及 UI32.35. 更多卡牌33.36. 人物动画34.37. 敌人意图 AI 逻辑35.38. 敌人的动画执行逻辑36.39. 对战胜负逻辑37.40. 制作胜利和抽卡面板38.41. 抽卡面板的实际逻辑39.42. GameOver 及 Menu 面板40.43. 实现休息房间的逻辑41.44. Boss 制作和整体流程42.45. 淡入淡出及打包游戏目标
当我进入房间,然后出去之后,当前房间设置为已访问,同一列的其它房间设置为不可访问,当前房间相连的房间设置为可访问
实现
点击房间广播
因为 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);
}
}
}
其它
其实里面还有一些小细节,但是太繁琐就不列出来了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?