Files
zeling_v2/Assets/Scripts/World/Puzzle/PuzzleReceiver.cs
2026-05-13 09:19:54 +08:00

65 lines
2.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Assets/Scripts/World/Puzzle/PuzzleReceiver.cs
using BaseGames.World;
using MoreMountains.Feedbacks;
using UnityEngine;
namespace BaseGames.Puzzle
{
/// <summary>
/// 谜题接收器,由 PuzzleWire 驱动。
/// 挂在谜题目标物件上(门/平台等),实现 IActivatable。
/// 子类覆写 OnActivate / OnDeactivate 实现具体行为。
/// </summary>
public class PuzzleReceiver : MonoBehaviour, IActivatable
{
[SerializeField] private bool _startsActivated = false;
[SerializeField] private string _receiverId; // 持久化唯一 ID空串则不持久化
[SerializeField] private MMFeedbacks _activateFeedback;
[SerializeField] private MMFeedbacks _deactivateFeedback;
[Header("持久化SO 注入,非 Instance 单例)")]
[SerializeField] private WorldStateRegistry _worldState;
private bool _isActivated;
public bool IsActivated => _isActivated;
protected virtual void Awake()
{
bool savedState = !string.IsNullOrEmpty(_receiverId)
&& _worldState != null
&& _worldState.HasFlag("receiver_" + _receiverId);
_isActivated = savedState || _startsActivated;
}
protected virtual void Start()
{
if (_isActivated) OnActivate();
}
public void Activate()
{
if (_isActivated) return;
_isActivated = true;
_activateFeedback?.PlayFeedbacks();
OnActivate();
if (!string.IsNullOrEmpty(_receiverId))
_worldState?.SetFlag("receiver_" + _receiverId);
}
public void Deactivate()
{
if (!_isActivated) return;
_isActivated = false;
_deactivateFeedback?.PlayFeedbacks();
OnDeactivate();
if (!string.IsNullOrEmpty(_receiverId))
_worldState?.ClearFlag("receiver_" + _receiverId);
}
protected virtual void OnActivate() { }
protected virtual void OnDeactivate() { }
}
}