Как я могу создать диалоговую систему - PullRequest
0 голосов
/ 31 мая 2018
using System.Collections;
using UnityEngine;
using TMPro;

public class NPCscript : Interactable {
    public GameObject dialougeObj;
    public TMP_Text dialouge;
    public int Size;
    public string dialougeSt;

    public override void Interact () {
        base.Interact ();
        dialougeObj.SetActive (true);
        NPCInteraction();
    }

    void OnTriggerExit(Collider other) {
        dialougeObj.SetActive(false);
    }
    void NPCInteraction(){
        dialouge.SetText(dialougeSt);
    }
}

Скажите, пожалуйста, как мне получить массив или список, в котором я могу использовать свою переменную размера и циклически повторять ее, пока не будут сказаны все диалоги.

Я пытался, но мой не работает.ПОМОГИТЕ!

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Система диалога сама по себе является очень широкой темой.Тем не менее, я не думаю, что вы сможете осуществить это с помощью всего лишь списка строк.Если вы говорите о предоставлении игроку выбора на выбор, вам нужно будет создать несколько пользовательских классов.

Во-первых, вам понадобится класс для определения параметров вашего персонажа.Это будет очень простой класс.Он будет содержать строковый ответ и целое число, которое будет представлять узел назначения.

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;
}
.
0 голосов
/ 31 мая 2018

Хм, если вы запрашиваете систему диалога, ее очень легко создать в Unity с помощью UGUI.

1.) Создайте холст с plane и text Я думаю, что подойдет

*scale the plane ofcourse to your satisfaction and put it infront of the camera 
*and about the text you must put it infront of the plane like the plane is on the back
*and the text is infront of the plane.

2.) Теперь настройте свою иерархию следующим образом:

Canvas
   Dialogue //Empty GameObject
      Plane
      Text

Я сделаю ее всплывающей всякий раз, когда вы сталкиваетесь с NPC чем-то подобным

[SerializeField] GameObject dialogueObject; //here drag the canvas
[SerializeField] GameObject text; //we will get its component for changing the text later on
void Start(){
   text = GetComponent<Text>().text = "Sample Dialogue";
   dialogueObject.setActive(false);
}

void OnCollisionEnter(collision collide){
    if(collide.gameObject.name == "NPC"){
        dialogue.setActive(true);
    }
}

Просто как тот .Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...