Единство - как создать дерево диалога?

Это можно сделать просто как:

interface PaginationItemProps extends React.HTMLProps<HTMLDivElement> {
}

const PaginationItem = (props: PaginationItemProps) => {
   return <div>{props.children}</div>;
}

class Pagination extends React.Component<PaginationProps> {
  render() {
    return <div>          
        <PaginationItem>CHILDREN RENDER</PaginationItem>
    </div>
 }
}
1
задан user8048595 13 July 2018 в 23:42
поделиться

2 ответа

Короткий ответ: все узлы знают своих родителей и детей.

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

  • Выполнение выбора диалога (говоря)
  • Наблюдение ответа на диалог (прослушивание)

Также необходимо рассмотреть некоторые важные условия:

  • Пользовательские разговоры
  • Бесконечные прерывания с AI

Из этого плана мы можем построить наше дерево с некоторыми классами. Я поцарапал некоторые примеры, но я их не тестировал. Надеюсь, это передает идею, и вы можете создать собственное решение. Для вас может быть более полезным сделать один класс Node, который просто знает, какой тип он есть. Другим усовершенствованием будет использование интерфейса или какой-либо способ обобщить отношения между родителями и дочерними элементами, которые позволили бы создавать более сложные древовидные структуры.

class ChoiceNode
{
    public ChoiceNode(ResponseNode myParent)
    {
        parent = myParent;
    }

    ResponseNode parent = null;
    List<ResponseNode> children = new List<ResponseNode>;
    bool canSayGoodbye = true;
}

class ResponseNode
{
    public ResponseNode(ChoiceNode myParent, string myMessage)
    {
        parent = myParent;
        parent.children.Add(this);
        response = myMessage;
    }

    ChoiceNode parent;
    ChoiceNode child;
    string response;
}

Теперь мы должны иметь возможность использовать метод для отображения выбора диалога с помощью просто перечисляя ResponseNode.children. Затем, когда мы делаем выбор диалога, мы хотим отобразить ResponseNode.response, а затем перейдем к ResponseNode.child, чтобы найти следующий набор вариантов диалога. Когда parent == null, мы находимся в корневой ветке. Когда child == null, мы показываем некоторый текст завершения.

Надеюсь, это полезно и даст вам некоторые идеи.

1
ответ дан Jehy 17 August 2018 в 12:05
поделиться

Хорошо, я пытался понять логику вашего кода, но есть несколько вещей, которые я не понимаю, может быть, лучше, если я попытаюсь объяснить свое дерево диалога Unity.

Сначала: Нам нужно создать объект Tree. Если вам просто нужно бинарное дерево, вам нужны только древовидные переменные:

public class BinaryTree{
  private string root;
  private BinaryTree left;
  private BinaryTree right
  getters/setters
}

этот объект даже не должен быть компонентом Unity. root - это «диалог» слева - «optionA» справа - «optionB», если вам не нужен несколько ответов, просто сделайте left = right. Если вам нужен способ определить несколько ответов, я предлагаю вам создать такой объект:

public class Tree{
  private Dictionary<string,string> root;
  private List<Tree> next;
  getters/setters
}

root снова является вашим диалогом. Ключ (который идентифицирует ваш ответ) и значение, которое является фактическим диалогом. next - это список деревьев (вы определяете свой ответ, создавая цикл в следующем и проверяя ключ словаря).

Теперь в методе «Начало» вам нужно создать новый объект Tree и установить ваши ближайшие. Пример

Start(){
  BinaryTree bn = new BinaryTree();
  bn.Root = "Is this a question?";
  BinaryTree left = new BinaryTree();
  left.Root = "Nope";
  bn.Left = left;
  BinaryTree right = new BinaryTree();
  right.Root = "Yes it is...";
  bn.Right = right;
}

Почти то же самое для версии дерева:

Start(){
  Tree bn = new Tree();
  bn.Root = new Dictionary<string, string>();
  bn.Root.Add("key1", "Do you need something?");
  bn.Next = new List<Tree>();
  Tree answer1 = new Tree();
  answer1.Root = new Dictionary<string, string>();
  answer1.Root.Add("key2", "Yes");
  bn.Next.Add();
  ... iterate...
}

Конечно, это всего лишь базовый пример. Лучший способ инициализировать это - добавить ваше диалоговое окно в массив и выполнить итерацию. Во всяком случае.

Теперь вы можете (например) создать кнопку. В Start вы можете инициализировать его текстовое значение для своего корня. В методе PointerDown / Clicked вы можете создать массив возможных ключей ответа, и, например, вы можете создать несколько кнопок для нескольких ответов (или просто использовать 2 статических ответа на кнопку с BinaryTree) и изменить текст на основе answer root value (или значение left / right). каждая из кнопок ответа должна в методе PointerDown / Clicked отправить значение ключа (или левый / правый объект) вашего пользовательского выбора (на практике следующее значение, которое будет отображаться в основной кнопке вопроса). Конечно, «кнопка вопроса» после щелчка снова должна отображать следующий ответ (и, возможно, вы можете решить добавить переменную вопроса bool в свой объект ... или, может быть, вы просто можете использовать только левую сторону для вопроса ... или, может быть, вы можете решить, что если в следующем списке есть только одно значение, это вопрос, и он должен просто показать его в текстовом значении главной кнопки).

И если следующий ну, конечно, вы можете закончить разговор.

Существует несколько способов сделать это.

0
ответ дан Mah 17 August 2018 в 12:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: