수정사항

This commit is contained in:
2026-08-06 20:49:36 +09:00
parent 6d6d452922
commit 60c1488716
36 changed files with 1451 additions and 76 deletions

View File

@@ -10,7 +10,7 @@ namespace DinoLove.Dialog.GraphTool.Editor
// .dlg 그래프 에셋을 기존 런타임 타입(DialogGroup / DialogNode / DialogChoice)으로 변환한다.
// 생성된 DialogNode들은 서브에셋으로, DialogGroup이 메인 에셋으로 등록된다.
// 따라서 DialogPlayer는 수정 없이 임포트된 .dlg 에셋(= DialogGroup)을 그대로 사용한다.
[ScriptedImporter(21, DialogGraph.AssetExtension)] // 버전 올리면 기존 .dlg 에셋이 재임포트됨
[ScriptedImporter(24, DialogGraph.AssetExtension)] // 버전 올리면 기존 .dlg 에셋이 재임포트됨
internal class DialogGraphImporter : ScriptedImporter
{
public override void OnImportAsset(AssetImportContext ctx)
@@ -127,9 +127,10 @@ 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.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));
dn.SideSprite = GetInputPortValue<Sprite>(gn.GetInputPortByName(DialogLineNode.PORT_SIDE_SPRITE));
dn.ClearSprite = GetInputPortValue<SpriteClear>(gn.GetInputPortByName(DialogLineNode.PORT_CLEAR_SPRITE));
dn.Voice = GetInputPortValue<VoiceClip>(gn.GetInputPortByName(DialogLineNode.PORT_VOICE));
dn.Bgm = GetInputPortValue<AudioClip>(gn.GetInputPortByName(DialogLineNode.PORT_BGM));
dn.Sfx = GetInputPortValue<AudioClip>(gn.GetInputPortByName(DialogLineNode.PORT_SFX));

View File

@@ -19,9 +19,10 @@ 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_POSE = "Pose";
public const string PORT_POSE_TARGET = "PoseTarget";
public const string PORT_FRONT_SPRITE = "FrontSprite";
public const string PORT_SIDE_SPRITE = "SideSprite";
public const string PORT_CLEAR_SPRITE = "ClearSprite";
public const string PORT_VOICE = "Voice";
public const string PORT_BGM = "Bgm";
public const string PORT_SFX = "Sfx";
@@ -72,16 +73,28 @@ protected override void OnDefinePorts(IPortDefinitionContext context)
context.AddInputPort<GestureData>(PORT_GESTURE).WithDisplayName("Gesture").Build();
context.AddInputPort<ExpressionData>(PORT_EXPRESSION).WithDisplayName("Expression").Build();
// 화면에 세우는 그림 — Gesture/Expression(Animator)과 달리 2D 스프라이트를 직접 갈아끼운다
// 포즈 — 캐릭터 그림 갈아끼우기. 어떤 그림이 뜨는지는 캐릭터 프리팹의 CharacterPoses가 정한다.
//
// Pose를 Target보다 먼저 두는 것은 읽는 순서 때문이다. "변경 없음 → (대상 없음)"은
// 위에서부터 읽으면 자연스럽지만, 순서가 반대면 빈 Target이 덜 채운 항목처럼 보인다.
// enum의 0번이 Keep이라, 이 포트를 건드리지 않으면 자동으로 "변경 없음"이 된다.
context.AddInputPort<Pose>(PORT_POSE).WithDisplayName("Pose")
.WithTooltip("이 대사부터 바꿀 포즈. '변경 없음'이 기본이라 인물이 서 있는 동안 " +
"매 대사에 다시 꽂을 필요가 없고, '숨김'을 고르면 화면에서 내린다").Build();
// 대상이 Speaker와 별개인 것이 중요하다: 말하는 사람과 화면에 비치는 사람이 다를 수 있다.
context.AddInputPort<CharacterData>(PORT_POSE_TARGET).WithDisplayName("Pose Target")
.WithTooltip("위 Pose를 적용할 대상. 화자와 다를 수 있다 — 나루호도가 말하는 동안 " +
"화면의 마요이가 표정을 바꾸는 식. " +
"Pose가 '변경 없음'이면 비워두면 되고, 포즈를 골랐는데 비어 있으면 " +
"아무 일도 일어나지 않는다").Build();
context.AddInputPort<Sprite>(PORT_FRONT_SPRITE).WithDisplayName("Front Sprite")
.WithTooltip("이 대사 동안 화면 앞쪽(가운데 아래)에 세울 그림. 인물이 보통이지만 물건·서류도 된다. " +
"비우면 변경 없음 — BGM과 같은 규칙이라 인물이 서 있는 동안 매 대사에 다시 꽂을 필요가 없다").Build();
.WithTooltip("이 대사에만 번쩍 뜨는 그림 — '이의있음!' '받아랏!' 같은 연출. " +
"다음 대사로 넘어가면 자동으로 사라진다 (SFX와 같은 1회성)").Build();
context.AddInputPort<Sprite>(PORT_SIDE_SPRITE).WithDisplayName("Side Sprite")
.WithTooltip("이 대사 동안 화면 옆(왼쪽)에 놓을 그림. 제시한 물건을 놓고 설명할 때 쓴다. " +
"비우면 변경 없음").Build();
context.AddInputPort<SpriteClear>(PORT_CLEAR_SPRITE).WithDisplayName("Clear Sprite")
.WithTooltip("이미 떠 있던 그림을 이 대사에서 걷어낸다. 그림 지정이 '비우면 변경 없음'이라 " +
"지울 때만 쓴다. 같은 노드에서 새 그림도 지정했다면 새 그림이 이긴다").Build();
"비우면 사라진다 — 여러 대사에 걸쳐 보이려면 그 대사마다 같은 그림을 지정할 것").Build();
context.AddInputPort<VoiceClip>(PORT_VOICE).WithDisplayName("Voice").Build();
context.AddInputPort<AudioClip>(PORT_BGM).WithDisplayName("BGM")