PJ/Assets/scripts/dotfs_scripts/MANAGER_RoomTransition.cs

96 lines
No EOL
2.4 KiB
C#
Executable file

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<CinemachineConfiner2D>();
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();
}
}
}