using System; using UnityEngine; namespace EndingSystem { public class EndingWinConditionService : MonoBehaviour { public static EndingWinConditionService Instance { get; private set; } [Header("Win Condition")] [SerializeField] private bool canTriggerEnding = false; [Header("Lifetime")] [SerializeField] private bool dontDestroyOnLoad = true; public event Action CanTriggerEndingChanged; public bool CanTriggerEnding => canTriggerEnding; private void Awake() { if (Instance != null && Instance != this) { Destroy(gameObject); return; } Instance = this; if (dontDestroyOnLoad) { DontDestroyOnLoad(gameObject); } } public void SetCanTriggerEnding(bool value) { if (canTriggerEnding == value) { return; } canTriggerEnding = value; CanTriggerEndingChanged?.Invoke(canTriggerEnding); } public void UnlockEnding() { SetCanTriggerEnding(true); } public void DebugUnlockEnding() { EnsureInstance().UnlockEnding(); } public void LockEnding() { SetCanTriggerEnding(false); } public void DebugLockEnding() { EnsureInstance().LockEnding(); } public static EndingWinConditionService EnsureInstance() { if (Instance != null) { return Instance; } EndingWinConditionService existing = FindObjectOfType(true); if (existing != null) { Instance = existing; return Instance; } var go = new GameObject("EndingWinConditionService"); var service = go.AddComponent(); Instance = service; return service; } } }