타이핑 연출

This commit is contained in:
2026-07-30 11:28:35 +09:00
parent 28f014152c
commit 073567c652
14 changed files with 343 additions and 19 deletions

View File

@@ -288,9 +288,9 @@ private void CaptureInitialAnimState(Animator anim)
// 반환: true = 대기 도중 히든 제스처가 발동됨(→ HiddenBranch로 분기), false = 평범하게 진행
private async Awaitable<bool> PlayNode(DialogNode node)
{
// DialogHud에 대사 표시 (이름은 노드 오버라이드 우선)
// DialogHud에 대사 표시 (이름은 노드 오버라이드 우선, 타이핑 연출도 노드 지정이 우선)
if (DialogHud.Instance != null)
DialogHud.Instance.Show(node.Speaker, node.TalkText, node.SpeakerNameOverride);
DialogHud.Instance.Show(node.Speaker, node.TalkText, node.SpeakerNameOverride, node.Typewriter);
// 호감도 증감 — 화자 기준, 화자가 비어 있으면 대화 주인 NPC
if (node.Affection != 0)
@@ -467,7 +467,12 @@ private async Awaitable<bool> WaitAdvanceOrDivert()
while (true)
{
if (HiddenBranchResolver.Fired) return true; // 히든 발동 → 히든 분기
if (advance) return false; // 진행 입력 → 평범하게 진행
if (advance)
{
advance = false;
// 타이핑 중이었으면 이 입력은 "전체 표시"에 쓰고 계속 기다린다
if (!TrySkipReveal()) return false; // 이미 다 나옴 → 평범하게 진행
}
if (timeLeft >= 0f)
{
timeLeft -= Time.deltaTime;
@@ -486,7 +491,17 @@ private async Awaitable<bool> WaitAdvanceOrDivert()
}
}
// 대화 진행 입력(OnDialogNext) 한 번을 대기
// 대사가 아직 드러나는 중이면 전체 표시로 건너뛰고 true.
// 이미 다 나와 있으면 false — 그 입력은 다음 노드로 넘어가는 데 쓰인다.
private static bool TrySkipReveal()
{
var hud = DialogHud.Instance;
if (hud == null || !hud.IsRevealing) return false;
hud.SkipReveal();
return true;
}
// 대화 진행 입력(OnDialogNext) 한 번을 대기 (타이핑 중이면 첫 입력은 전체 표시에 쓰인다)
private async Awaitable WaitForAdvanceInput()
{
var im = InputManager.Instance;
@@ -502,8 +517,16 @@ private async Awaitable WaitForAdvanceInput()
im.OnDialogNext_Event += Handler;
try
{
while (!pressed)
while (true)
{
if (pressed)
{
pressed = false;
// 타이핑 중이었으면 이 입력은 "전체 표시"에 쓰고 계속 기다린다
if (!TrySkipReveal()) break; // 이미 다 나옴 → 다음 노드로
}
await Awaitable.NextFrameAsync(destroyCancellationToken);
}
}
catch (OperationCanceledException)
{