我正在开发一个简单的基于树的对话系统。这是一个基本的点击游戏来推进故事,有不同的选择,引导玩家走向不同的故事路径。
我所做的是,我创建了大量的gameObject,称为Convo。每个Convo包含文本(组件)和用于确定屏幕上哪个字符的子元素,以及在这些子控件中显示其拐点的标记(例如。(悲伤、快乐等)例如
有两个变量: 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,(比较哪种选择会选择哪条路径)
我对编程和统一非常陌生,如果有人能在帮助我学习如何创建这个干净高效的系统方面指导我正确的方向,那就太棒了!
谢谢!
发布于 2017-02-04 13:25:05
我建议让DialogueManager Component保存您所有的对话,并且每个对话都应该包含其他对话的引用。然后,在显示对话之后,您可以检查它是否有多个子项目,或者只有一个(或一个都没有),并显示一些对话框/弹出以从这些键中进行选择。
在代码示例中,如下所示:
[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:
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脚本:
public void Start()
{
GetComponent<DialogueManager>().InitializeDialogue();
}制作对话树的简单示例如下:
{ 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" ] }
}
}
}https://stackoverflow.com/questions/42040581
复制相似问题