대화 상자는 어떻게 작동합니까?


20

즉, 하위 대화가 끝났을 때 어떻게 말과 줄 사이를 이동해야합니까?

C #에 기본 대화 상자 트리의 예가 있으면 게시하십시오.


dialog-tree태그 가 있으면 좋을 것 같습니다 .
user1306322

코드 샘플을 요구하는 것은 일반적으로 호의적으로 보이지 않습니다.
MichaelHouse

공유 할 가치가있는 대화 상자 101 코드 샘플이 있으면 상처를 입을 수 없습니다.
user1306322

문제는이 사이트가 질문에 대한 정답을 얻는 것입니다. 코드 샘플을 수집하기위한 것이 아닙니다.
MichaelHouse

이것이 문장이 "if"로 시작하는 이유입니다. 그러나 내가 요구하는 것은 대화 줄이 코드로 효율적으로 변환 될 수있는 방식으로 서로 연결되는 방법에 대한 설명입니다. 결국 C #으로 작성하겠습니다.
user1306322

답변:


24

"dialogue tree"라는 이름은 약간 오해의 소지가 있습니다. 일반적으로 단순한 트리가 아니라 단순한 지시 된 그래프 입니다. 이러한 그래프의 기본 데이터 구조는 일반적으로 대화에 사용되는 지점을 나타내는 노드에 대한 일종의 "데이터"와 참가자가 말하고 수행하는 것을 나타내는 다른 노드로의 링크로 구성됩니다. 선택적으로 다양한 추가 작업을 수행하기 위해 가시성 또는 스크립트를 제한하는 조건이 있습니다. 일반적으로 노드 중 하나가 기본 시작 노드 (일반적인 레이블 인 "ROOT", "START"및 "GREETING")이며, 유효한 링크가없는 노드는 대화를 종료합니다.

대부분의 경우, 그래프는 메모리 내에서 Node데이터 구조 의 목록으로 표시되며 , 각각은 ID 및 0..n Link데이터 구조 의 목록을 갖습니다 . 이 목록은 NPC의 로컬 또는 글로벌 일 수 있습니다. 두 번째 경우는 정보를 위해 대화 할 수있는 일반 NPC가 많지만 특정 대화는 제공하지 않는 경우에 선호됩니다. 시스템 자체는 NPC의 시작 대화 노드를 찾고 해당 ID를 현재 대화 ID로 기억하며 플레이어가 선택할 수있는 현재 유효한 링크 (또는 유효한 링크가없는 경우 "[대화 종료]")를 제시하고 기다립니다. 입력. 플레이어가 링크를 선택하면 관련 대화 상자가 표시되고 관련 스크립트가 실행됩니다.

링크에 복잡한 규칙과 조건을 사용하는 대신 간단한 "유효한"부울 변수를 사용하여 다른 대화 링크의 스크립트 (시작 노드의 기본 스크립트 포함) 또는 외부에서 변경할 수 있습니다. 메커니즘. 일반적으로이 방법은 간단하지만 대화가 거의없는 게임에만 적합합니다. "이 응답은 언제 가능합니까?" 응답 데이터 자체에서 멀리 떨어져 있습니다.


여기서 설명하는 구조는 노드가 대화 줄을 가질 필요가 없다는 점에서 Byte56과 약간 다릅니다. 링크는 모두 가질 수 있습니다. 가장 기본적인 변형에서 이것은 다음 구조로 변환됩니다.

enter image description here


+1 링크에서 규칙과 조건을 언급 할 때 간단한 방향 그래프만으로는 충분하지 않으며, 필요할 때 상황이 복잡해질 수 있습니다.
Laurent Couvidou

+1 나는 그 구조가 더 좋아. 그러나 첫 번째 패스로는 권장하지 않습니다. 더 간단한 것으로 시작하겠습니다. 촬영하는 것이 더 좋은 목표입니다.
MichaelHouse

+1 매우 자세한 답변입니다. 나중에 나에게 유용 할 수 있습니다.
Marton

이 이미지는 저에게 매우 도움이되었지만 DialogueLine이 링크와 분리 된 이유가 궁금합니다. 각 링크에 자체 응답 텍스트가 없습니까? 그리고 NPC의 텍스트는 어디로 갈까요? 노드에 포함시키는 것이 합리적이지 않습니까?
Kyle Baran

@Danjen이 구조에서, 링크는 다음 대화 선택이 나타날 때까지 다른 문자에서 여러 개의 DialogueLine을 가질 수 있습니다. NPC 텍스트가있는 곳이기도합니다. 선이 반복되면 다른 링크가 DialogueLine을 공유하여 목록 (벡터)에서 다시 정렬하여 부분을 다른 선으로 바꾸거나 삽입 등을 추가 할 수 있습니다.
Martin Sojka

16

대화 상자 트리는 방향 그래프 구조 로 생성됩니다 .

여기에 이미지 설명을 입력하십시오

그래프는 플레이어의 대화 결정에 따라 순회됩니다. 사용자에게 제공되는 대화 상자 옵션은 다른 대화 상자 노드의 경로를 정의하는 가장자리에서옵니다.

직접 그래프는 기본 데이터 구조입니다. 그것들은 쉽게 구현 될 수 있으며 직접 구현하고 싶을 것입니다. 대화 상자 요구에 맞게 그래프를 조정하고 싶을 것입니다.

일부 노드는 표시하기 위해 특별한 조건을 충족해야 할 수도 있습니다. 예를 들어, 플레이어는 X 이상의 스피치 기술이 필요합니다. 또는 플레이어는 대화의 한 지점으로 진행하기 전에 미션 Z를 완료해야합니다. 또는 NPC가 그들과 논의하기 전에 4 번 질문을해야합니다. 이러한 기능은 게임에 맞게 사용자 정의됩니다. 그러나 노드 및 에지 순회를 구현할 때는 언급 할 가치가 있습니다. 물론 가장 간단한 형태로 시작하여 구축하는 것이 가장 좋습니다.


이 그림에서 "Newton-trouble"과 같은 경우에는 어떻게해야하는지 알 수 없습니다. 코드에서 해당 행의 순서를 반복하지 않고 설정하는 방법과 같습니다.
user1306322

종종 대화 반복 수 있다는 것을 알게 될 것 입니다. 일반적으로 어떤 방식으로 표시되어 있으므로 사용자가 이미 대화 상자 경로를 선택했음을 알 수 있습니다. 이전에 선택한 경우를 나타내는 플래그를 가장자리에 넣을 수 있습니다. 따라서 사용자가 다시 선택하거나 (새로 고침) 표시하지 않는 것은 사용자의 책임입니다.
MichaelHouse

1
일반적으로 코드 줄 순서가 아니라 데이터 구조의 참조를 통해 수행됩니다.
Kylotan

7

간단한 대화 상자 시스템을 만들었습니다. http://iki.fi/sol/d3/ "engine"그 자체는 현재 일반 c이지만, 에디터가 생성 한 데이터는 모든 언어에서 사용하기가 매우 간단하다. 이 도구는 XML, JSON 및 사용자 정의 이진 형식을 출력합니다.

주요 개념은 매우 간단합니다.

당신은 모두 구불 구불 한 작은 통로의 미로에 있습니다.

대화 상자의 각 노드 (위의 아날로그와 같이 "카드"라고 함)는 질문 텍스트와 0 개 이상의 답변으로 구성됩니다. 각 답변은 다른 카드로 연결됩니다.

태그가 설정되어 있거나 태그가 설정되지 않은 경우에만 특정 답변이 사용자에게 표시되는 태그 시스템도 있습니다. 카드를 입력하면 지정된 태그가 설정 (또는 설정 해제)됩니다.

이것은 게임에서 모든 종류의 대화 상자에 대해 필요한 모든 것입니다. "질문 텍스트"는 일반 텍스트 일 ​​수도 있고, 애니메이션을 구동하거나 그 밖의 것을 만들 수있는 스크립트 일 수도 있습니다.


4

TreeSharp 및 비헤이비어 트리를 사용하여 대화 시스템을 모델링 할 수 있습니다. TreeSharp는 간단한 동작 트리 구현을 제공하는 라이브러리입니다. 와우에 대한 IA 봇은 이것으로 완료되므로 성숙합니다 ... :)

내 구현에는 답변 중에서 선택할 수있는 노드가 있으며 각 답변은 대화 또는 작업 또는 일련의 작업 또는 다른 대화 상자로 갈 수있는 노드 또는 원하는 것을 결합 할 수 있습니다 ...

나는 brainiac 편집기를 사용하여 시각적으로 만들었습니다 ... 그러나 결국에는 treesharp를 기반으로 C # 코드를 생성합니다 ...

http://www.youtube.com/watch?v=6uGg6bUYyUU


2

방향성 그래프 일 수 있습니다.

노드를 객체로 모델링하고 그래프 노드의 모든 나가는 화살표도 별도의 객체로 모델링됩니다. 노드에는 나가는 화살표 목록이 있으며 각 "화살표"개체에는 표시 할 텍스트와 대상에 대한 참조가 있습니다. 확실하지는 않지만 C # 객체는 항상 참조되므로 객체를 먼저 만든 다음 화살표 객체를 만들 때 동일한 객체를 두 개의 화살표 대상 필드에 연결하십시오. (C ++에서는 참조 또는 포인터 유형 인 Node & 또는 Node *를 사용합니다)

디스크에서 이와 같은 것을로드하는 경우 일반적으로 각 노드에 고유 ID 번호를 부여한 다음 색인이 해당 고유 번호 인 배열에 모든 노드를로드합니다. 그런 다음 실제 개체가 아닌 숫자를 쓰면 화살표가 직렬화됩니다.

화살표를로드 할 때 배열과 ID를 사용하여 가리키는 노드에 대한 참조를 가져옵니다. 객체를 두 번 쓰면 동일하게 보이는 두 개의 별도 객체가 생길 것입니다.

대화 상자 트리를 처리하는 것은 매우 간단합니다. 루트 노드를 currentNode변수 에 넣고 어떻게 든 모든 것을 표시 한 다음 선택할 때 rootNode화살표의 대상으로 설정 하십시오. 의사 코드에서 :

Node&    currentNode = dialogTree.node[0];
while( currentNode != END_CONVERSATION_PSEUDO_NODE )
{
    stage.displayNode( currentNode );
    currentNode = stage.waitForUserToChoose();
}

1

나는 최근에 Node를 사용하여 이와 같은 것을 개발해야했고 대화 노드의 지시 된 그래프를 나타내는 매우 기본적인 텍스트 파일 구조를 선택했습니다.

다음에서 결과 코드와 텍스트 형식을 볼 수 있습니다.

https://github.com/scottbw/dialoguejs

조건이나 이벤트 트리거를 지원하지 않지만 (아직) 많은 게임 개발자를 위해 시작하기에 충분히 간단합니다.

(GPL의 코드 자체, btw)


질문은 C #을 요구합니다.
세스 바틴

D' oh-죄송합니다.
Scott Wilson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.