Система диалога сама по себе является очень широкой темой.Тем не менее, я не думаю, что вы сможете осуществить это с помощью всего лишь списка строк.Если вы говорите о предоставлении игроку выбора на выбор, вам нужно будет создать несколько пользовательских классов.
Во-первых, вам понадобится класс для определения параметров вашего персонажа.Это будет очень простой класс.Он будет содержать строковый ответ и целое число, которое будет представлять узел назначения.
public class DialogueOption {
public string Text;
public int DestinationNodeID;
}
Далее вам понадобится класс DialogueNode.Подумайте об этом, что NPC говорит персонажу, а затем он также содержит список, как вы уже догадались, параметров диалога.Другая вещь, которая у него будет - это NodeID.Это целое число, которое дает нам место для отправки из наших опций.Это будет выглядеть примерно так:
public class DialogueNode {
public int NodeID = -1; //I use -1 as a way to exit a conversation.
//NodeId should be a positive number
public string Text;
public List<DialogueOption> Options;
}
Наконец, вам нужно создать свой класс Dialogue, который является самым простым из них, просто список DialogueNodes и выглядит примерно так:
public class Dialogue {
public List<DialogueNode> Nodes = new List<DialogueNode>();
}
Вы можете использовать его там, где у вашего персонажа есть только один сценарий диалога, но я сделал это по-разному, где у каждого персонажа был свой класс DialogueList, который в основном представляет собой список диалогов, а также содержит имя персонажа, которое ямог отображать, и в зависимости от ситуации, я мог выбрать, какой диалог я хотел, чтобы мой персонаж имел с игроком в то время.
public class DialogueList
{
public string name;
public List<Dialogue> dialogues = new List<Dialogue>();
}
Это также имеет дополнительное преимущество, заключающееся в том, что его легко конвертировать в словарь, используя имяв качестве ключа, возвращающего список диалогов, если вы хотите настроить его в этом направлении.
А где-то еще в вашем проекте вам понадобится класс DialogueManager, который будет контролировать все.Обычно я делаю это синглтоном, просто чтобы легко звонить из любого места.Я не буду показывать вам все это, но я покажу вам отображаемую часть, остальное - просто установка текста и включение и выключение объектов.
public void RunDialogue(string name, Dialogue dia)
{
nameText.text = name;
StartCoroutine(run(dia));
}
IEnumerator run(Dialogue dia)
{
DialoguePanel.SetActive(true);
//start the convo
int node_id = 0;
//if the node is equal to -1 end the conversation
while (node_id != -1 )
{
//display the current node
DisplayNode(dia.Nodes[node_id]);
//reset the selected option
selected_option = -2;
//wait here until a selection is made by button click
while (selected_option == -2)
{
yield return new WaitForSeconds(0.25f);
}
//get the new id since it has changed
node_id = selected_option;
}
//the user exited the conversation
EndDialogue(node_id);
}
К моим кнопкам в основном был прикреплен этот простой методих в их событии OnClick, которое я установил под методом DisplayNode.По сути, я беру свои кнопки и даю им этот метод, а их параметр равен 1010
public void SetSelectedOption(int x)
{
selected_option = x;
}
.