# 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