수정 사항
This commit is contained in:
55
Assets/02_Scripts/Story/SceneScreen.cs
Normal file
55
Assets/02_Scripts/Story/SceneScreen.cs
Normal file
@@ -0,0 +1,55 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user