首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高效的基于树的对话系统?

高效的基于树的对话系统?
EN

Stack Overflow用户
提问于 2017-02-04 12:49:41
回答 1查看 3.8K关注 0票数 1

我正在开发一个简单的基于树的对话系统。这是一个基本的点击游戏来推进故事,有不同的选择,引导玩家走向不同的故事路径。

我所做的是,我创建了大量的gameObject,称为Convo。每个Convo包含文本(组件)和用于确定屏幕上哪个字符的子元素,以及在这些子控件中显示其拐点的标记(例如。(悲伤、快乐等)例如

  • A-0-1 (短信:“约翰:嘿,怎么回事?”)(如果这是最后一次会议,用标记“选择”)
    • 约翰(标签为"Idle")
    • 简(贴着“激怒”的标签)

故事路径图

有两个变量: CurrentDialogue(string)和DialogueTracking(int)。

在每次点击时,我会检查当前会议是否有标签“选择”。如果没有,我使用CurrentDialogue(string)查找具有确切名称的游戏对象并显示它的文本。然后把DialogueTracking增加一倍,

然后我用DialogueTracking将CurrentDialogue(字符串)从A-0-1修改为A-0-2等等,当有标签“选择”(如A-0-4)时,DialogueTracking(int)被重置为1,所以在玩家选择一个选项之后,是A-1-1而不是A-1-5。

问题是,在经历了大量的交谈和故事之后,我意识到我的新手犯了一个错误。代码会变成大o‘if/path,(比较哪种选择会选择哪条路径)

我对编程和统一非常陌生,如果有人能在帮助我学习如何创建这个干净高效的系统方面指导我正确的方向,那就太棒了!

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-04 13:25:05

我建议让DialogueManager Component保存您所有的对话,并且每个对话都应该包含其他对话的引用。然后,在显示对话之后,您可以检查它是否有多个子项目,或者只有一个(或一个都没有),并显示一些对话框/弹出以从这些键中进行选择。

在代码示例中,如下所示:

代码语言:javascript
复制
[Serializable]
public class Dialogue
{
    [SerializeField]
    Dictionary<string, Dialogue> _dialogues;

    [SerializeField]
    string _dialogueText;

    public Dialogue(string text)
    {
        _dialogues = new Dictionary<string, Dialogue>();
        _dialogueText = text;
    }

    public string GetText() { return _dialogueText; }      

    public bool HasManyPaths() { return _dialogues.Count > 1; }

    public string[] GetKeys() { return _dialogues.Keys; }

    public Dialogue GetDialogue(string key) { return _dialogues[key]; }
}

现在,您应该在Unity检查器中填充它,并使DialogueManager Component来管理您的Dialogue

代码语言:javascript
复制
public class DialogueManager
    : Component
{
    [SerializeField]
    Dialogue _currentDialogue;

    public void InitializeDialogue() 
    {
        string text = _currentDialogue.GetText();
        // display the text
        if ( _currentDialogue.HasManyPaths() )
        {
            string[] keys = _currentDialogue.GetKeys();
            // display keys;
            string selected_key = // user input here
            _currentDialogue = _currentDialogue.GetDialogue(selected_key);
        }
        else
        {
            string key = _currentDialogue.GetKeys()[0];
            _currentDialogue = _currentDialogue.GetDialogue(key);
        }
    }
}

使用此方法,您可以简单地在Unity中进行对话,并使用以下内容添加MonoBehaviour脚本:

代码语言:javascript
复制
public void Start()
{
    GetComponent<DialogueManager>().InitializeDialogue();
}

制作对话树的简单示例如下:

代码语言:javascript
复制
{ currentDialogue [ "hello! choose 1 or 2" ]
    1.{ dialogue [ "you've chosen 1" ]
        . { dialogue [ "this ends dialogue" ] }
    }
    2. { dialogue [ "you've chosen 2" ]
        . { dialogue [ "now choose another number between 3 and 4" ]
            3. { dialogue [ "you've chosen 3" ] }
            4. { dialogue [ "you've chosen 4" ] }
         }
     }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42040581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档