using UnityEngine; using Unity.Cinemachine; using System.Collections; public class MANAGER_DATA_RoomTransition : MonoBehaviour { public static MANAGER_DATA_RoomTransition Instance; [Header("Настройки камеры")] public CinemachineCamera virtualCamera; private CinemachineConfiner2D _confiner; [Header("Настройки перехода")] public CanvasGroup fadeOverlay; public float fadeDuration = 0.5f; private void Awake() { if (Instance == null) { Instance = this; DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); } } private void Start() { if (virtualCamera != null) { _confiner = virtualCamera.GetComponent(); if (_confiner == null) { } } } public void Travel(GameObject player, Vector3 destination, Collider2D newBounds) { StartCoroutine(TransitionRoutine(player, destination, newBounds)); } private IEnumerator TransitionRoutine(GameObject player, Vector3 destination, Collider2D newBounds) { yield return StartCoroutine(Fade(1)); Vector3 oldPosition = player.transform.position; Vector3 warpDelta = destination - oldPosition; virtualCamera.enabled = false; player.transform.position = destination; UpdateCameraBounds(newBounds); virtualCamera.OnTargetObjectWarped(player.transform, warpDelta); virtualCamera.transform.position = destination; virtualCamera.enabled = true; yield return new WaitForEndOfFrame(); yield return new WaitForFixedUpdate(); yield return StartCoroutine(Fade(0)); } private IEnumerator Fade(float targetAlpha) { if (fadeOverlay == null) yield break; float startAlpha = fadeOverlay.alpha; float time = 0; while (time < fadeDuration) { time += Time.deltaTime; fadeOverlay.alpha = Mathf.Lerp(startAlpha, targetAlpha, time / fadeDuration); yield return null; } fadeOverlay.alpha = targetAlpha; } public void UpdateCameraBounds(Collider2D newBounds) { if (_confiner != null) { _confiner.BoundingShape2D = newBounds; _confiner.InvalidateCache(); } } }