Files
StoryGame_Unity/Assets/02_Scripts/Story/SceneScreen.cs
2026-08-09 13:58:32 +09:00

56 lines
2.1 KiB
C#

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