Projext/Assets/00001.Scripts/SceneLoader.cs
2026-02-25 19:39:20 +09:00

163 lines
5.0 KiB
C#

using UnityEngine;
using UnityEngine.SceneManagement;
using System.Collections;
using TMPro;
// ==========================================
// ✨ [중요] 이 위치에 있어야 에러가 나지 않습니다.
// ==========================================
[System.Serializable]
public struct TipLayoutSettings
{
public string label;
[Header("TipBar (배경 막대) 설정")]
public Vector3 barPosition;
public float barWidth;
public float barHeight;
[Header("TipText (텍스트 영역) 설정")]
public Vector3 textPosition;
public float textWidth;
public float textHeight;
}
public class SceneLoader : MonoBehaviour
{
public static SceneLoader Instance;
[Header("로딩 UI 연결 (자식 오브젝트 권장)")]
public GameObject loadingCanvas;
public CanvasGroup mainGroup;
[Header("로딩 시 나타날 요소들")]
public TextMeshProUGUI tipText;
public GameObject loadingTextObject;
public GameObject tipBarObject;
public RectTransform tipBarBackgroundRect;
[Header("설정")]
public string[] tips;
public float fadeDuration = 0.8f;
[Header("줄 수에 따른 수동 레이아웃")]
public TipLayoutSettings[] manualLayouts; // 이제 여기서 에러가 나지 않습니다.
private RectTransform _tipBarRect;
private RectTransform _tipTextRect;
private bool _isFading = false;
private void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
return;
}
if (loadingCanvas != null) loadingCanvas.SetActive(false);
if (tipText != null) _tipTextRect = tipText.GetComponent<RectTransform>();
_tipBarRect = tipBarBackgroundRect != null ? tipBarBackgroundRect : tipBarObject?.GetComponent<RectTransform>();
if (mainGroup != null) mainGroup.alpha = 0f;
}
private void OnEnable() { SceneManager.sceneLoaded += OnSceneLoaded; }
private void OnDisable() { SceneManager.sceneLoaded -= OnSceneLoaded; }
private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
if (loadingCanvas != null && loadingCanvas.activeSelf)
{
StopAllCoroutines();
StartCoroutine(FadeOutAfterLoad());
}
}
public void LoadSceneWithFade(string sceneName)
{
if (_isFading) return;
StartCoroutine(LoadProcess(sceneName));
}
private IEnumerator LoadProcess(string sceneName)
{
_isFading = true;
SetupTipText();
yield return null;
ApplyManualLayout();
if (loadingCanvas != null) loadingCanvas.SetActive(true);
yield return StartCoroutine(Fade(1f, mainGroup));
AsyncOperation op = SceneManager.LoadSceneAsync(sceneName);
op.allowSceneActivation = false;
float timer = 0f;
while (timer < 2.0f || op.progress < 0.9f)
{
timer += Time.deltaTime;
yield return null;
}
op.allowSceneActivation = true;
}
private IEnumerator FadeOutAfterLoad()
{
yield return StartCoroutine(Fade(0f, mainGroup));
if (loadingCanvas != null) loadingCanvas.SetActive(false);
_isFading = false;
}
private void SetupTipText()
{
if (tipText == null) return;
if (tips != null && tips.Length > 0)
tipText.text = $"<color=#FFD700>Tip!</color> : {tips[Random.Range(0, tips.Length)]}";
else
tipText.text = "";
}
private void ApplyManualLayout()
{
if (tipText == null || _tipBarRect == null || _tipTextRect == null) return;
if (string.IsNullOrWhiteSpace(tipText.text))
{
if (tipBarObject != null) tipBarObject.SetActive(false);
return;
}
if (tipBarObject != null) tipBarObject.SetActive(true);
tipText.ForceMeshUpdate(true);
int lineCount = tipText.textInfo.lineCount;
int layoutIndex = Mathf.Clamp(lineCount - 1, 0, manualLayouts.Length - 1);
if (manualLayouts.Length > 0)
{
TipLayoutSettings settings = manualLayouts[layoutIndex];
_tipBarRect.anchoredPosition = settings.barPosition;
_tipBarRect.sizeDelta = new Vector2(settings.barWidth, settings.barHeight);
_tipTextRect.anchoredPosition = settings.textPosition;
_tipTextRect.sizeDelta = new Vector2(settings.textWidth, settings.textHeight);
}
}
private IEnumerator Fade(float targetAlpha, CanvasGroup canvasGroup)
{
if (canvasGroup == null) yield break;
float speed = 1f / Mathf.Max(0.01f, fadeDuration);
while (canvasGroup != null && !Mathf.Approximately(canvasGroup.alpha, targetAlpha))
{
canvasGroup.alpha = Mathf.MoveTowards(canvasGroup.alpha, targetAlpha, speed * Time.unscaledDeltaTime);
yield return null;
}
if (canvasGroup != null) canvasGroup.alpha = targetAlpha;
}
}