56 lines
2.1 KiB
C#
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;
|
|
}
|
|
}
|