2026-07-05 글로벌 프리팹 추가
This commit is contained in:
@@ -86,7 +86,7 @@ private int FindPlayableIndex()
|
||||
{
|
||||
var entry = _dialogs[i];
|
||||
if (entry.Group == null) continue;
|
||||
if (!entry.Repeatable && StoryState.IsDialogCompleted(entry.Group.name)) continue;
|
||||
if (!entry.Repeatable && StoryManager.Instance.IsDialogCompleted(entry.Group.name)) continue;
|
||||
if (entry.Condition != null && !entry.Condition.IsMet(_voice.Character)) continue;
|
||||
return i;
|
||||
}
|
||||
@@ -117,10 +117,11 @@ private async Awaitable PlayEntry(DialogEntry entry)
|
||||
|
||||
// 여기까지 왔으면 자연 종료(끝까지 재생) — 이때만 완료로 기록한다.
|
||||
// (중간에 오브젝트 파괴 등으로 끊기면 예외로 빠져나가 기록되지 않음)
|
||||
bool firstTime = StoryState.MarkDialogCompleted(entry.Group.name);
|
||||
var story = StoryManager.Instance;
|
||||
bool firstTime = story.MarkDialogCompleted(entry.Group.name);
|
||||
if (firstTime && entry.ProgressOnComplete > 0)
|
||||
StoryState.MainProgress += entry.ProgressOnComplete;
|
||||
StoryState.Save();
|
||||
story.MainProgress += entry.ProgressOnComplete;
|
||||
story.Save();
|
||||
|
||||
Debug.Log($"[DialogPlayer] 대화 종료: {entry.Group.name}");
|
||||
}
|
||||
@@ -129,6 +130,8 @@ private async Awaitable PlayEntry(DialogEntry entry)
|
||||
IsPlaying = false;
|
||||
if (DialogHud.Instance != null)
|
||||
DialogHud.Instance.Hide();
|
||||
if (SoundManager.Instance != null)
|
||||
SoundManager.Instance.ClearOverrideBGM(); // 대화가 끝나면 기본 BGM으로 복귀
|
||||
RestoreDefaultAnimations();
|
||||
RestoreRotations();
|
||||
}
|
||||
@@ -195,6 +198,28 @@ private async Awaitable PlayNode(DialogNode node)
|
||||
|
||||
RaiseNodeEvent(node.EventKey); // EventKey 있으면 매칭 이벤트 호출
|
||||
|
||||
// 전용 BGM: 설정돼 있으면 교체, 비어 있으면 기본 BGM으로 복귀
|
||||
if (SoundManager.Instance != null)
|
||||
{
|
||||
if (node.Bgm != null)
|
||||
SoundManager.Instance.PlayOverrideBGM(node.Bgm);
|
||||
else
|
||||
SoundManager.Instance.ClearOverrideBGM();
|
||||
}
|
||||
|
||||
// 전용 VFX: 화자 위치에서 1회 재생
|
||||
if (node.Vfx != null)
|
||||
{
|
||||
var speakerObj = node.Speaker != null ? CharacterVoiceObject.Find(node.Speaker) : null;
|
||||
var anchor = speakerObj != null ? speakerObj.transform : transform;
|
||||
var vfx = Instantiate(node.Vfx, anchor.position, anchor.rotation);
|
||||
|
||||
// 파티클이면 재생 길이만큼, 아니면 5초 뒤 자동 제거
|
||||
var ps = vfx.GetComponentInChildren<ParticleSystem>();
|
||||
float life = ps != null ? ps.main.duration + ps.main.startLifetime.constantMax : 5f;
|
||||
Destroy(vfx, life);
|
||||
}
|
||||
|
||||
// 보이스 재생
|
||||
if (node.Voice != null && node.Speaker != null)
|
||||
{
|
||||
@@ -253,7 +278,7 @@ private void RecordChoice(DialogNode node, int index)
|
||||
code = DialogVariables.Format(code); // {token} 치환 → 동적으로 생성된 코드 반영
|
||||
|
||||
if (!string.IsNullOrEmpty(code))
|
||||
StoryState.RecordChoice(code);
|
||||
StoryManager.Instance.RecordChoice(code);
|
||||
}
|
||||
|
||||
private async Awaitable<int> WaitForChoice(DialogNode node)
|
||||
|
||||
Reference in New Issue
Block a user