즉, 하위 대화가 끝났을 때 어떻게 말과 줄 사이를 이동해야합니까?
C #에 기본 대화 상자 트리의 예가 있으면 게시하십시오.
즉, 하위 대화가 끝났을 때 어떻게 말과 줄 사이를 이동해야합니까?
C #에 기본 대화 상자 트리의 예가 있으면 게시하십시오.
답변:
"dialogue tree"라는 이름은 약간 오해의 소지가 있습니다. 일반적으로 단순한 트리가 아니라 단순한 지시 된 그래프 입니다. 이러한 그래프의 기본 데이터 구조는 일반적으로 대화에 사용되는 지점을 나타내는 노드에 대한 일종의 "데이터"와 참가자가 말하고 수행하는 것을 나타내는 다른 노드로의 링크로 구성됩니다. 선택적으로 다양한 추가 작업을 수행하기 위해 가시성 또는 스크립트를 제한하는 조건이 있습니다. 일반적으로 노드 중 하나가 기본 시작 노드 (일반적인 레이블 인 "ROOT", "START"및 "GREETING")이며, 유효한 링크가없는 노드는 대화를 종료합니다.
대부분의 경우, 그래프는 메모리 내에서 Node
데이터 구조 의 목록으로 표시되며 , 각각은 ID 및 0..n Link
데이터 구조 의 목록을 갖습니다 . 이 목록은 NPC의 로컬 또는 글로벌 일 수 있습니다. 두 번째 경우는 정보를 위해 대화 할 수있는 일반 NPC가 많지만 특정 대화는 제공하지 않는 경우에 선호됩니다. 시스템 자체는 NPC의 시작 대화 노드를 찾고 해당 ID를 현재 대화 ID로 기억하며 플레이어가 선택할 수있는 현재 유효한 링크 (또는 유효한 링크가없는 경우 "[대화 종료]")를 제시하고 기다립니다. 입력. 플레이어가 링크를 선택하면 관련 대화 상자가 표시되고 관련 스크립트가 실행됩니다.
링크에 복잡한 규칙과 조건을 사용하는 대신 간단한 "유효한"부울 변수를 사용하여 다른 대화 링크의 스크립트 (시작 노드의 기본 스크립트 포함) 또는 외부에서 변경할 수 있습니다. 메커니즘. 일반적으로이 방법은 간단하지만 대화가 거의없는 게임에만 적합합니다. "이 응답은 언제 가능합니까?" 응답 데이터 자체에서 멀리 떨어져 있습니다.
여기서 설명하는 구조는 노드가 대화 줄을 가질 필요가 없다는 점에서 Byte56과 약간 다릅니다. 링크는 모두 가질 수 있습니다. 가장 기본적인 변형에서 이것은 다음 구조로 변환됩니다.
대화 상자 트리는 방향 그래프 구조 로 생성됩니다 .
그래프는 플레이어의 대화 결정에 따라 순회됩니다. 사용자에게 제공되는 대화 상자 옵션은 다른 대화 상자 노드의 경로를 정의하는 가장자리에서옵니다.
직접 그래프는 기본 데이터 구조입니다. 그것들은 쉽게 구현 될 수 있으며 직접 구현하고 싶을 것입니다. 대화 상자 요구에 맞게 그래프를 조정하고 싶을 것입니다.
일부 노드는 표시하기 위해 특별한 조건을 충족해야 할 수도 있습니다. 예를 들어, 플레이어는 X 이상의 스피치 기술이 필요합니다. 또는 플레이어는 대화의 한 지점으로 진행하기 전에 미션 Z를 완료해야합니다. 또는 NPC가 그들과 논의하기 전에 4 번 질문을해야합니다. 이러한 기능은 게임에 맞게 사용자 정의됩니다. 그러나 노드 및 에지 순회를 구현할 때는 언급 할 가치가 있습니다. 물론 가장 간단한 형태로 시작하여 구축하는 것이 가장 좋습니다.
간단한 대화 상자 시스템을 만들었습니다. http://iki.fi/sol/d3/ "engine"그 자체는 현재 일반 c이지만, 에디터가 생성 한 데이터는 모든 언어에서 사용하기가 매우 간단하다. 이 도구는 XML, JSON 및 사용자 정의 이진 형식을 출력합니다.
주요 개념은 매우 간단합니다.
대화 상자의 각 노드 (위의 아날로그와 같이 "카드"라고 함)는 질문 텍스트와 0 개 이상의 답변으로 구성됩니다. 각 답변은 다른 카드로 연결됩니다.
태그가 설정되어 있거나 태그가 설정되지 않은 경우에만 특정 답변이 사용자에게 표시되는 태그 시스템도 있습니다. 카드를 입력하면 지정된 태그가 설정 (또는 설정 해제)됩니다.
이것은 게임에서 모든 종류의 대화 상자에 대해 필요한 모든 것입니다. "질문 텍스트"는 일반 텍스트 일 수도 있고, 애니메이션을 구동하거나 그 밖의 것을 만들 수있는 스크립트 일 수도 있습니다.
TreeSharp 및 비헤이비어 트리를 사용하여 대화 시스템을 모델링 할 수 있습니다. TreeSharp는 간단한 동작 트리 구현을 제공하는 라이브러리입니다. 와우에 대한 IA 봇은 이것으로 완료되므로 성숙합니다 ... :)
내 구현에는 답변 중에서 선택할 수있는 노드가 있으며 각 답변은 대화 또는 작업 또는 일련의 작업 또는 다른 대화 상자로 갈 수있는 노드 또는 원하는 것을 결합 할 수 있습니다 ...
나는 brainiac 편집기를 사용하여 시각적으로 만들었습니다 ... 그러나 결국에는 treesharp를 기반으로 C # 코드를 생성합니다 ...
방향성 그래프 일 수 있습니다.
노드를 객체로 모델링하고 그래프 노드의 모든 나가는 화살표도 별도의 객체로 모델링됩니다. 노드에는 나가는 화살표 목록이 있으며 각 "화살표"개체에는 표시 할 텍스트와 대상에 대한 참조가 있습니다. 확실하지는 않지만 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();
}
나는 최근에 Node를 사용하여 이와 같은 것을 개발해야했고 대화 노드의 지시 된 그래프를 나타내는 매우 기본적인 텍스트 파일 구조를 선택했습니다.
다음에서 결과 코드와 텍스트 형식을 볼 수 있습니다.
https://github.com/scottbw/dialoguejs
조건이나 이벤트 트리거를 지원하지 않지만 (아직) 많은 게임 개발자를 위해 시작하기에 충분히 간단합니다.
(GPL의 코드 자체, btw)
dialog-tree
태그 가 있으면 좋을 것 같습니다 .