43. 实现休息房间的逻辑
本节目标
实现休息房间可以回一次血,实现宝箱房间可以获得卡牌
实现办法
休息房间回血
添加一个 RestRoomPanel,给它挂上 UI 和 脚本


代码实现如下
using System;
using UnityEngine;
using UnityEngine.UIElements;
public class RestRoomPanel : MonoBehaviour
{
private VisualElement rootElement;
private Button restButton;
private Button backToMapButton;
public Effect restEffect;
public ObjectEventSO loadMapEvent;
private CharacterBase player;
private void OnEnable()
{
rootElement = GetComponent<UIDocument>().rootVisualElement;
restButton = rootElement.Q<Button>("RestButton");
backToMapButton = rootElement.Q<Button>("BackToMapButton");
player = FindAnyObjectByType<Player>(FindObjectsInactive.Include);
restButton.clicked += OnRestButtonClicked;
backToMapButton.clicked += OnBackToMapButtonClicked;
}
private void OnBackToMapButtonClicked()
{
loadMapEvent.RaiseEvent(null, this);
}
private void OnRestButtonClicked()
{
restEffect.Execute(player, null);
restButton.SetEnabled(false);
}
}
当点击休息一下之后,会执行 restEffect,然后禁用休息按钮
当点击返回地图之后,会广播loadMapEvent事件
其中 restEffect 是一个给自己回 20 点血的卡牌效果

loadMapEvent 事件会被SceneLoadManager监听到,并且调用SceneLoadManager.LoadMenu方法,这个方法会卸载当前场景,并回到 map 场景

宝箱房间获取宝物

修改 Treasure 场景,在它下面添加TreasureChest对象,编辑碰撞体,添加Treasure Button组件
当碰撞体被点击之后,就会触发gameWinEvent事件

gameWinEvent 事件会被 UIManager 监听到


这个方法触发的时候,会隐藏 gameplayPanel,然后显示 gameWinPanel

需要注意一下,GameWinPanel需要将原来Awake里面的代码移动到OnEnable里面去,否则按钮点击事件可能不会触发


浙公网安备 33010602011771号