celinedrules

Checkpoint

Jan 30th, 2026
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.15 KB | Source Code | 0 0
  1. using System;
  2. using Sirenix.OdinInspector;
  3. using UltimateRpg.Audio;
  4. using UltimateRpg.Core.Interfaces;
  5. using UltimateRpg.Managers;
  6. using UltimateRpg.SaveSystem;
  7. using UnityEditor;
  8. using UnityEngine;
  9.  
  10. namespace UltimateRpg.Interactables
  11. {
  12. public class Checkpoint : MonoBehaviour, ISavable
  13. {
  14. private static readonly int Active = Animator.StringToHash("Active");
  15.  
  16. [SerializeField, ReadOnly] private string savedId;
  17. [SerializeField, HideInInspector] private int lastKnownInstanceId;
  18. [SerializeField] private string checkpointDisplayName;
  19.  
  20. private Player.Player _player;
  21. private Checkpoint[] _allCheckpoints;
  22. private Animator _animator;
  23. private bool _canActivate = true;
  24. private AudioSource _audioSource;
  25.  
  26. public string SavedId => savedId;
  27.  
  28. #if UNITY_EDITOR
  29. private void OnValidate()
  30. {
  31. int currentInstanceId = GetInstanceID();
  32.  
  33. if (string.IsNullOrEmpty(savedId) || (lastKnownInstanceId != currentInstanceId && lastKnownInstanceId != 0))
  34. {
  35. savedId = Guid.NewGuid().ToString();
  36. EditorUtility.SetDirty(this);
  37. }
  38.  
  39. lastKnownInstanceId = currentInstanceId;
  40. }
  41. #endif
  42.  
  43. private void Awake()
  44. {
  45. _player = GameManager.Instance.Player;
  46. _animator = GetComponentInChildren<Animator>();
  47. _allCheckpoints = FindObjectsByType<Checkpoint>(FindObjectsSortMode.None);
  48. _audioSource = GetComponentInChildren<AudioSource>();
  49. }
  50.  
  51. private void Activate(bool activate)
  52. {
  53. _animator.SetBool(Active, activate);
  54.  
  55. if(isActiveAndEnabled)
  56. FusionAudioManager.Instance.PlayAudio(EnvironmentAudioId.Checkpoint, _audioSource);
  57. else
  58. FusionAudioManager.Instance.StopAudio(EnvironmentAudioId.Checkpoint, _audioSource);
  59. }
  60.  
  61. private void OnTriggerEnter2D(Collider2D other)
  62. {
  63. if (!other.CompareTag("Player"))
  64. return;
  65.  
  66. if(!_canActivate)
  67. return;
  68.  
  69. foreach (Checkpoint checkpoint in _allCheckpoints)
  70. checkpoint.Activate(false);
  71.  
  72. GameManager.Instance.SetLastCheckpoint(transform.position);
  73. SaveManager.Instance.GameData.savedCheckpoint = transform.position;
  74. Activate(true);
  75. _canActivate = false;
  76. }
  77.  
  78. public void SaveData(ref GameData gameData)
  79. {
  80. gameData.activatedCheckpoints[savedId] = !_canActivate;
  81. }
  82.  
  83. public void LoadData(GameData gameData)
  84. {
  85. if (gameData.activatedCheckpoints.TryGetValue(savedId, out bool wasActivated))
  86. _canActivate = !wasActivated;
  87.  
  88. bool isCurrentCheckpoint = gameData.savedCheckpoint == (Vector2)transform.position;
  89. Activate(isCurrentCheckpoint);
  90.  
  91. if (isCurrentCheckpoint)
  92. _player.TeleportPlayer(transform.position);
  93. }
  94. }
  95. }
Advertisement
Add Comment
Please, Sign In to add comment