수정 사항

This commit is contained in:
2026-08-09 13:58:32 +09:00
parent 8a4a001fe0
commit 120233faac
28 changed files with 3471 additions and 73 deletions

View File

@@ -42,6 +42,11 @@ public class DialogNode : ScriptableObject
public TypewriterStyle Typewriter;
[Header("Stage")]
[Tooltip("이 대사 동안 배경 앞·캐릭터 뒤에 띄울 장면 그림 (설명용 컷인, 증언 장면 등). " +
"비우면 사라진다 — 여러 대사에 걸쳐 보이려면 그 대사마다 같은 그림을 지정할 것. " +
"캐릭터보다 앞에 보여야 하면 Pose를 '숨김'으로 내리면 된다")]
public Sprite SceneScreen;
[Tooltip("이 대사부터 바꿀 포즈. '변경 없음'이 기본이라 인물이 서 있는 동안 매 대사에 " +
"다시 꽂을 필요가 없고, '숨김'을 고르면 화면에서 내린다. " +
"대화가 끝나면 대화 전 포즈로 되돌아간다")]

View File

@@ -294,7 +294,8 @@ private async Awaitable PlayBeat(StoryBeat beat)
if (SoundManager.Instance != null && !keepBgmOnEnd)
SoundManager.Instance.ClearOverrideBGM();
// 앞/옆 그림은 대화 전용 오버레이라 대화가 끝나면 무조건 걷는다
// 장면 그림과 앞/옆 그림은 대화 전용이라 대화가 끝나면 무조건 걷는다
if (SceneScreen.Instance != null) SceneScreen.Instance.Hide();
if (FrontSprite.Instance != null) FrontSprite.Instance.Hide();
if (SideSprite.Instance != null) SideSprite.Instance.Hide();
@@ -393,13 +394,15 @@ private async Awaitable<bool> PlayNode(DialogNode node)
return false;
}
// 노드가 지정한 무대 연출(포즈 + 앞/옆 그림)을 반영한다. 의 수명 규칙이 각각 다르다:
// 노드가 지정한 무대 연출을 반영한다. 의 수명 규칙이 각각 다르다:
// Pose — 지속. '변경 없음'이 기본이라 인물이 서 있는 동안 다시 꽂을 필요가 없다
// SceneScreen — 지정한 대사에서만. 비우면 사라진다 (배경 앞·캐릭터 뒤 장면 그림)
// FrontSprite — 1회성. 지정 안 한 노드에선 사라진다 ("이의있음!" 같은 번쩍 연출)
// SideSprite — 지정한 대사에서만. 비우면 사라진다
// 뒤의 둘은 Show(null)이 곧 Hide라 그대로 넘기면 두 경우가 한 줄로 처리된다.
// Pose 말고 셋은 Show(null)이 곧 Hide라, 노드 값을 그대로 넘기면 두 경우가 한 줄로 처리된다.
private void ApplyStageVisuals(DialogNode node)
{
if (SceneScreen.Instance != null) SceneScreen.Instance.Show(node.SceneScreen);
if (FrontSprite.Instance != null) FrontSprite.Instance.Show(node.FrontSprite);
if (SideSprite.Instance != null) SideSprite.Instance.Show(node.SideSprite);

View File

@@ -10,7 +10,7 @@ namespace DinoLove.Dialog.GraphTool.Editor
// .dlg 그래프 에셋을 기존 런타임 타입(DialogGroup / DialogNode / DialogChoice)으로 변환한다.
// 생성된 DialogNode들은 서브에셋으로, DialogGroup이 메인 에셋으로 등록된다.
// 따라서 DialogPlayer는 수정 없이 임포트된 .dlg 에셋(= DialogGroup)을 그대로 사용한다.
[ScriptedImporter(24, DialogGraph.AssetExtension)] // 버전 올리면 기존 .dlg 에셋이 재임포트됨
[ScriptedImporter(25, DialogGraph.AssetExtension)] // 버전 올리면 기존 .dlg 에셋이 재임포트됨
internal class DialogGraphImporter : ScriptedImporter
{
public override void OnImportAsset(AssetImportContext ctx)
@@ -127,6 +127,7 @@ public override void OnImportAsset(AssetImportContext ctx)
dn.TalkText = GetInputPortValue<DialogText>(gn.GetInputPortByName(DialogLineNode.PORT_TALK)).Value;
dn.Gesture = GetInputPortValue<GestureData>(gn.GetInputPortByName(DialogLineNode.PORT_GESTURE));
dn.Expression = GetInputPortValue<ExpressionData>(gn.GetInputPortByName(DialogLineNode.PORT_EXPRESSION));
dn.SceneScreen = GetInputPortValue<Sprite>(gn.GetInputPortByName(DialogLineNode.PORT_SCENE_SCREEN));
dn.Pose = GetInputPortValue<Pose>(gn.GetInputPortByName(DialogLineNode.PORT_POSE));
dn.PoseTarget = GetInputPortValue<CharacterData>(gn.GetInputPortByName(DialogLineNode.PORT_POSE_TARGET));
dn.FrontSprite = GetInputPortValue<Sprite>(gn.GetInputPortByName(DialogLineNode.PORT_FRONT_SPRITE));

View File

@@ -19,6 +19,7 @@ internal class DialogLineNode : DialogGraphNode
public const string PORT_TALK = "TalkText";
public const string PORT_GESTURE = "Gesture";
public const string PORT_EXPRESSION = "Expression";
public const string PORT_SCENE_SCREEN = "SceneScreen";
public const string PORT_POSE = "Pose";
public const string PORT_POSE_TARGET = "PoseTarget";
public const string PORT_FRONT_SPRITE = "FrontSprite";
@@ -73,6 +74,13 @@ protected override void OnDefinePorts(IPortDefinitionContext context)
context.AddInputPort<GestureData>(PORT_GESTURE).WithDisplayName("Gesture").Build();
context.AddInputPort<ExpressionData>(PORT_EXPRESSION).WithDisplayName("Expression").Build();
// 무대 연출은 화면 앞뒤 순서대로 늘어놓는다: 장면 그림 → 캐릭터 포즈 → 오버레이.
// 그래프에서 위에서 아래로 읽으면 곧 뒤에서 앞 순서가 되도록.
context.AddInputPort<Sprite>(PORT_SCENE_SCREEN).WithDisplayName("Scene Screen")
.WithTooltip("배경 앞·캐릭터 뒤에 띄울 장면 그림 (설명용 컷인, 증언 장면 등). " +
"비우면 사라진다 — 여러 대사에 걸쳐 보이려면 그 대사마다 같은 그림을 지정할 것. " +
"캐릭터보다 앞에 보여야 하면 Pose를 '숨김'으로").Build();
// 포즈 — 캐릭터 그림 갈아끼우기. 어떤 그림이 뜨는지는 캐릭터 프리팹의 CharacterPoses가 정한다.
//
// Pose를 Target보다 먼저 두는 것은 읽는 순서 때문이다. "변경 없음 → (대상 없음)"은