using UnityEngine; // 배경보다 앞, 캐릭터보다 뒤에 뜨는 장면 그림 한 장. // 설명용 컷인이나 증인의 증언 장면처럼 "지금 이야기하는 그 장면"을 보여주는 자리다. // // 왜 UXML이 아니라 월드 SpriteRenderer인가: // UXML 패널은 카메라가 그린 화면 **전체 위에** 합성되므로 월드 오브젝트 사이에 끼울 수 없다. // "배경보다 앞, 캐릭터보다 뒤"는 정렬 레이어로만 표현되고, 그건 월드에서만 가능하다. // (FrontSprite·SideSprite가 UXML인 건 그것들이 최상단 오버레이라서다 — 성격이 다르다) // // 캐릭터보다 앞에 보여야 하는 장면이면 캐릭터를 Pose = 숨김으로 내리면 된다. // // 배치: 장소 프리팹이 아니라 **씬**에 둔다. 장소가 아니라 대화가 띄우는 것이라, // 장소 프리팹에 넣으면 장소마다 복제해야 한다 (캐릭터 슬롯과 같은 이유). // Sorting Layer는 Background와 Character 사이로 잡을 것. [RequireComponent(typeof(SpriteRenderer))] public class SceneScreen : MonoBehaviour { public static SceneScreen Instance { get; private set; } private SpriteRenderer _renderer; // 지금 떠 있는 그림 (없으면 null) public Sprite Current => _renderer != null && _renderer.enabled ? _renderer.sprite : null; private void Awake() { if (Instance != null && Instance != this) { Destroy(gameObject); return; } Instance = this; _renderer = GetComponent(); Hide(); // 대사가 부르기 전까지는 비어 있다 } private void OnDestroy() { if (Instance == this) Instance = null; } // null을 넘기면 Hide()와 같다 — 덕분에 호출하는 쪽이 분기 없이 노드 값을 그대로 넘길 수 있다. public void Show(Sprite sprite) { if (_renderer == null) return; if (sprite == null) { Hide(); return; } _renderer.sprite = sprite; _renderer.enabled = true; } public void Hide() { if (_renderer != null) _renderer.enabled = false; } }