# NodeBasedDialogueSystem **Repository Path**: zxjun2002/node-based-dialogue-system ## Basic Information - **Project Name**: NodeBasedDialogueSystem - **Description**: https://github.com/merpheus-dev/NodeBasedDialogueSystem基于该对话系统进行魔改修复 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2025-01-21 - **Last Updated**: 2025-10-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # NodeBasedDialogueSystem #### 介绍 https://github.com/merpheus-dev/NodeBasedDialogueSystem 基于该对话系统进行魔改修复,一些save问题还有删除问题 #### 软件架构 1.节点:用于配置选项和描述 2.CommentBlock:CommentBlock可以将节点统一管理,并且提供统一的注释和标题 示例 ``` using System; using System.Collections; using System.Collections.Generic; using System.Linq; using TMPro; using UnityEngine; using UnityEngine.UI; using Subtegral.DialogueSystem.DataContainers; namespace Subtegral.DialogueSystem.Runtime { public class DialogueParser : MonoBehaviour { // 引用的对话容器,包含对话节点和链接信息。 [SerializeField] private DialogueContainer dialogue; // 用于显示对话内容的 TextMeshPro UI 元素。 [SerializeField] private TextMeshProUGUI dialogueText; // 用于显示 CommentBlock 标题的 TextMeshPro UI 元素。 [SerializeField] private TextMeshProUGUI titleText; // 用于生成选项按钮的预制体。 [SerializeField] private Button choicePrefab; // 选项按钮的容器,按钮会作为其子对象生成。 [SerializeField] private Transform buttonContainer; private void Start() { // 获取对话的入口节点(Entrypoint),即对话的开始点。 var narrativeData = dialogue.NodeLinks.First(); // 找到第一个链接,通常是入口节点。 // 进入指定节点的对话内容。 ProceedToNarrative(narrativeData.TargetNodeGUID); } /// /// 处理对话逻辑,更新对话内容并生成对应的选项按钮。 /// /// 当前对话节点的唯一标识符 (GUID)。 private void ProceedToNarrative(string narrativeDataGUID) { // 查找目标节点的对话文本。 var text = dialogue.DialogueNodeData.Find(x => x.NodeGUID == narrativeDataGUID).DialogueText; // 更新标题,如果当前节点属于某个 CommentBlock。 UpdateTitle(narrativeDataGUID); // 查找从当前节点出发的所有连接(即选项)。 var choices = dialogue.NodeLinks.Where(x => x.BaseNodeGUID == narrativeDataGUID); // 更新对话文本(并替换其中的动态属性)。 dialogueText.text = ProcessProperties(text); // 清除现有的按钮,防止之前的选项残留。 var buttons = buttonContainer.GetComponentsInChildren