# Dialog Graph Tool `Communication/Dialog` 시스템(`DialogGroup` / `DialogNode` / `DialogChoice`)을 **노드 그래프로 저작**하기 위한 에디터 전용 도구입니다. Unity GraphToolkit(`Unity.GraphToolkit.Editor`) 기반 — Unity 6000.4부터 **에디터 내장 모듈**입니다. ## 동작 개요 - `.dlg` 그래프 에셋을 노드로 편집 → 저장하면 `DialogGraphImporter`가 기존 런타임 타입(`DialogGroup` + 여러 `DialogNode`)으로 자동 변환합니다. - 변환 결과: **메인 에셋 = `DialogGroup`**, 서브에셋 = 각 `DialogNode`. - `DialogPlayer`는 **수정 없이** 임포트된 `.dlg`(=DialogGroup)를 그대로 사용합니다. ## 사용법 1. Project 창에서 우클릭 → `Create > Communication > Dialog Graph` 로 `.dlg` 생성. 2. 더블클릭해 그래프 에디터를 엽니다. 3. 노드 추가: - **Dialog Start Node** : 진입점. 출력 화살표를 첫 대사 노드에 연결. (그래프당 1개) - **Dialog Line Node** : 대사 1줄. Speaker/TalkText/Gesture/Expression/Voice/BGM 입력. 진행은 항상 플레이어 입력으로 넘어갑니다. - `Choice Count = 0` → 선형. `Out` 출력을 다음 노드로 연결(= `DialogNode.Next`). - `Choice Count = N` → 가변 N지선다. `Choice Question` + 선택지마다 `Choice i Text`(텍스트) 와 `Choice i →`(분기 출력) 생성. 각 분기 출력을 목적지 노드에 연결(= `DialogNode.Choices[i].DestinationNode`). 4. 저장(임포트)되면 `.dlg` 에셋이 `DialogGroup`이 됩니다. 이를 `StoryDatabase`의 비트(장소·캐릭터·조건)에 등록하면 끝 — 해당 장소에서 그 캐릭터에게 말을 걸면 조건에 따라 재생됩니다. ## 구성 파일 (모두 Editor 전용) - `DialogGraph.cs` — 그래프 타입/생성 메뉴/검증 - `DialogGraphNode.cs` — 공통 베이스(실행 포트 헬퍼) - `DialogStartNode.cs` — 진입 노드 - `DialogLineNode.cs` — 대사 + 가변 N지선다 노드 - `DialogAffectionNode.cs`— 호감도 조건식만 검사해 True/False로 즉시 라우팅하는 노드 - `DialogText.cs` — TalkText 멀티라인 입력용 래퍼 타입 - `DialogTextDrawer.cs` — DialogText를 여러 줄 TextField로 그리는 CustomPropertyDrawer - `DialogShortText.cs` — 한 줄 텍스트 포트용 래퍼 타입 (이름 오버라이드 등) - `DialogShortTextDrawer.cs` — DialogShortText를 한 줄 TextField로 그리는 CustomPropertyDrawer - `DialogGraphImporter.cs`— .dlg → DialogGroup/DialogNode 변환 ## TalkText 멀티라인 - TalkText 포트는 `string`이 아니라 `DialogText` 타입을 쓴다. - GraphToolkit은 `[CustomPropertyDrawer]`가 있는 타입을 Unity PropertyField로 렌더하므로, `DialogTextDrawer`가 노드의 TalkText 칸을 여러 줄(멀티라인)로 만든다. - 임포터는 `DialogText.Value`만 꺼내 `DialogNode.TalkText`(string)에 넣는다 — 런타임은 영향 없음. - 높이를 더 키우려면 `DialogTextDrawer`의 `minHeight` 값을 조정. ## 메모 - GraphToolkit API는 여전히 experimental이라 바뀔 수 있습니다. 단, **버전을 결정하는 것은 `Packages/manifest.json`의 핀이 아니라 에디터 버전**입니다 — Unity 6000.4부터 GraphToolkit이 에디터 내장 모듈(`UnityEditor.GraphToolkitModule`)이 되었고, `com.unity.graphtoolkit` 패키지는 코드가 없는 shim(`"type": "shim"`)일 뿐입니다. 즉 manifest가 그대로여도 **에디터를 올리면 API가 바뀔 수 있으므로**, 에디터 업그레이드 후엔 이 폴더가 컴파일되는지와 `Assets/07_Data/DialogGraph/*.dlg`가 정상 임포트되는지를 확인할 것. (패키지 버전을 내려도 API는 고정되지 않습니다 — shim엔 코드가 없음) - 분기 출력이 비어 있으면 해당 선택지의 `DestinationNode`는 null이 되어 대화가 종료됩니다. - 여러 경로에서 같은 노드로 연결하면(루프 포함) 하나의 `DialogNode`로 합쳐집니다.