To znaczy, co jest związane z czym i jak poruszać się między liniami mowy po zakończeniu pod-rozmowy?
Jeśli masz jakieś przykłady podstawowego drzewa dialogowego w C #, opublikuj je.
To znaczy, co jest związane z czym i jak poruszać się między liniami mowy po zakończeniu pod-rozmowy?
Jeśli masz jakieś przykłady podstawowego drzewa dialogowego w C #, opublikuj je.
Odpowiedzi:
Nazwa „drzewo dialogu” jest nieco myląca - zwykle są to proste wykresy skierowane , a nie tylko drzewa . Podstawowa struktura danych takich wykresów zwykle składa się z pewnego rodzaju „danych” dla węzłów, które reprezentują punkty, w których jesteśmy w rozmowie, i łączy ich z innymi węzłami, które reprezentują to, co mówią i robią uczestnicy i opcjonalnie mają warunki, aby ograniczyć ich widoczność lub skrypty do wykonywania różnych dodatkowych działań. Zwykle jeden z węzłów jest domyślnym węzłem początkowym (typowe etykiety to „ROOT”, „START” i „POWITANIE”), a węzły, które nie prowadzą od nich prawidłowe łącza, kończą rozmowę.
W większości przypadków wykres jest reprezentowany w pamięci jako lista Node
struktur danych, z których każda ma co najmniej identyfikator i listę Link
struktur danych 0..n . Lista może być lokalna dla NPC lub globalna; Drugi przypadek jest preferowany, jeśli masz dużo ogólnych NPC, z którymi można porozmawiać w celu uzyskania informacji, ale nie oferują oni żadnych konkretnych rozmów na własną rękę. Sam system znajduje początkowy węzeł konwersacji dla NPC, zapamiętuje swój identyfikator jako bieżący identyfikator konwersacji, przedstawia aktualnie ważne linki do wyboru przez gracza (lub „[zakończ rozmowę]”, jeśli nie ma prawidłowych linków) i czeka na Wejście. Gdy gracz wybierze łącze, zostaną wyświetlone powiązane linie dialogowe i uruchomione zostaną powiązane skrypty.
Zamiast mieć skomplikowane reguły i warunki dotyczące linków, możesz zamiast tego poradzić sobie z prostą „prawidłową” zmienną logiczną, którą można następnie zmienić ze skryptów innych linków konwersacji (w tym domyślnej z węzła początkowego) lub z zewnątrz mechanizmy Ogólnie rzecz biorąc, takie podejście jest prostsze, ale nadaje się tylko do gier z bardzo małą liczbą takich rozmów, ponieważ przesuwa logikę „Kiedy ta odpowiedź jest możliwa?” z dala od samych danych odpowiedzi.
Zauważ, że struktura, którą tu opisuję, różni się nieco od Byte56, ponieważ węzły nie muszą mieć żadnych linii dialogowych; linki mogą mieć je wszystkie. W najbardziej podstawowym wariancie przekłada się to na następującą strukturę.
Drzewa dialogowe są tworzone z ukierunkowaną strukturą grafu .
Wykres jest przesuwany w oparciu o decyzje dialogowe podejmowane przez gracza. Opcje dialogowe udostępnione użytkownikowi pochodzą z krawędzi, które definiują ścieżki do innych węzłów okna dialogowego.
Grafy kierunkowe są podstawową strukturą danych. Można je łatwo wdrożyć i prawdopodobnie będziesz chciał je wdrożyć samodzielnie. Ponieważ będziesz chciał dostosować wykres do swoich potrzeb w oknie dialogowym.
Niektóre z węzłów mogą wymagać spełnienia specjalnych warunków w celu wyświetlenia. Na przykład gracz wymagałby umiejętności mówienia powyżej X. Lub gracz musi ukończyć misję Z, zanim będzie mógł przejść jedną gałąź dialogu. Lub muszą zapytać o coś 4 razy, zanim NPC je przedyskutuje. Te funkcje będą dostosowane do twojej gry. Warto jednak wspomnieć o implementacji przejścia przez węzeł i krawędź. Oczywiście zawsze najlepiej jest zacząć od najprostszej formy i stamtąd rozbudowywać.
Zbudowałem prosty system dialogowy: http://iki.fi/sol/d3/ sam silnik jest obecnie zwykły c, ale dane wytworzone przez edytor są dość proste w użyciu w dowolnym języku. Narzędzie generuje XML, JSON i niestandardowy format binarny.
Główna koncepcja jest dość prosta:
Każdy węzeł (który nazywam „kartą”, jak w powyższym analogu) okna dialogowego składa się z tekstu pytania i zera lub więcej odpowiedzi. Każda z odpowiedzi prowadzi do innej karty.
Istnieje również system tagów, w którym pewne odpowiedzi są wyświetlane użytkownikowi tylko wtedy, gdy tag jest ustawiony (lub tag nie jest ustawiony). Wprowadzanie zestawów kart (lub odblokowań) określonych znaczników.
To prawie wszystko, co trzeba zrobić w przypadku każdego rodzaju dialogu w grze. „Tekst pytania” może być zwykłym tekstem lub skryptem do animacji lub czymkolwiek innym.
Za pomocą TreeSharp i drzew zachowań można modelować system dialogowy. TreeSharp to biblioteka, która zapewnia prostą implementację drzewa zachowań. Roboty IA dla wow są z tym zrobione, więc są dojrzałe ... :)
Moja implementacja ma węzły, które pozwalają wybierać między odpowiedziami, a do każdej odpowiedzi można dołączyć dialog lub akcję, sekwencję akcji lub węzeł, który pozwala przejść do innego okna dialogowego ... lub czego chcesz ...
Użyłem edytora mózgu, aby zrobić to wizualnie ... ale na koniec produkuje kod c # na podstawie ostrza drzewa ...
Chcesz skierowany (prawdopodobnie cykliczny) wykres.
Modelujesz węzły jako obiekty, a wszystkie strzałki wychodzące w węźle wykresu są również modelowane jako osobne obiekty. Węzeł ma listę wychodzących strzał, a każdy obiekt „strzałkowy” ma tekst do wyświetlenia i odniesienie do miejsca docelowego. Nie jestem pewien, ale myślę, że w C # obiekty są zawsze przywoływane, więc najpierw tworzysz obiekty, a następnie, gdy tworzysz obiekty strzałek, podłącz ten sam obiekt do pola docelowego dwóch strzałek. (W C ++ użyłbyś referencji lub typu wskaźnika, Węzeł i lub Węzeł *)
Aby załadować takie rzeczy z dysku, zwykle nadaje się każdemu węzłowi unikalny numer identyfikacyjny, a następnie ładuje wszystkie węzły do tablicy, w której indeks jest tym unikalnym numerem. Następnie strzałki są serializowane przez zapisanie numeru, a nie rzeczywistego obiektu.
Podczas ładowania strzałki używasz tablicy i identyfikatora, aby uzyskać odwołanie do węzła, na który wskazuje. Jeśli wypiszesz obiekt dwukrotnie, otrzymasz dwa osobne obiekty, które wyglądają identycznie, co prawdopodobnie nie jest tym, czego chciałeś.
Przetwarzanie drzewa dialogowego staje się bardzo proste. Po prostu umieścisz węzeł główny w currentNode
zmiennej, jakoś wyświetlisz całą rzecz, a następnie, gdy zostanie dokonany wybór, ustaw rootNode
miejsce docelowe strzałki. W pseudokodzie:
Node& currentNode = dialogTree.node[0];
while( currentNode != END_CONVERSATION_PSEUDO_NODE )
{
stage.displayNode( currentNode );
currentNode = stage.waitForUserToChoose();
}
Niedawno musiałem opracować coś takiego za pomocą Węzła i zdecydowałem się na bardzo podstawową strukturę pliku tekstowego, która reprezentowałaby ukierunkowany wykres węzłów konwersacji.
Wynikowy kod i format tekstowy możesz zobaczyć na:
https://github.com/scottbw/dialoguejs
Nie obsługuje warunków ani wyzwalaczy zdarzeń (jeszcze), ale prawdopodobnie jest wystarczająco prosty, aby zacząć od wielu twórców gier.
(Sam kod w GPL, btw)
dialog-tree
tag.