대사 분기를 사용하면 플레이어의 게임 내 행동 또는 반응에 따라 대사를 업데이트하는 동적 NPC 대사 스크립트를 만들 수 있습니다. 대사 분기 시스템은 NPC 개체, 대사 명령어, 리소스 장면 파일이라는 3가지 요소로 구성됩니다.
요구 사항
튜토리얼을 시작하기 전에 아래 사항을 완료하시길 추천합니다.
장면 파일
장면 파일은 행동 팩 루트 디렉터리의 dialogue 폴더(%localappdata%\Packages\Microsoft.MinecraftUWP_8wekyb3d8bbwe\LocalState\games\com.mojang\development_behavior_packs\<your behavior pack folder>)에 있는 json 파일로, 대사 분기에 필요한 모든 정보가 포함되어 있습니다. 장면 파일은 필요한 만큼 생성할 수 있습니다. 월드의 각 NPC에 대한 장면 파일을 만들거나, 내러티브의 각 챕터에 대한 장면 파일을 만들거나, 월드 전체를 위한 장면 파일 하나를 만들어도 됩니다. 폴더 구성에 상관없이 대사 분기 기능은 dialogue 폴더에 있는 모든 파일을 읽기 때문입니다.
속성
첫 번째 속성은 이 json 파일을 유효한 장면 파일로 정의하는 헤더입니다.
예시:
{
"format_version": "1.17",
"minecraft:npc_dialogue": {}
}
이것은 json 파일이므로 괄호를 추가해야 합니다. 추가해야 하는 다음 속성은 "장면" 속성으로, 모든 대사 분기가 진행되는 곳입니다.
{
"format_version": "1.17",
"minecraft:npc_dialogue": {
"scenes": []
}
}
헤더와 장면 파일이 마련되었으니, 이제 NPC 대사 분기용 개별 장면을 만들 수 있습니다. 모든 신규 NPC 대사 인스턴스에는 새 장면이 필요합니다. 새 장면은 장면 파일에서 장면 태그를 만들어 정의합니다. 게임에서 장면 태그를 사용하여 장면 파일에 공급하는 텍스트를 호출합니다. NPC 버튼과 명령어를 게임 내 NPC 편집기를 사용하여 설정했을 때처럼 행동하게 설정할 수도 있습니다.
NPC 장면 구조를 살펴보겠습니다.
{
"scene_tag": "ducky_intro",
"npc_name": "Ducky",
"text": "Hello. My name is Ducky. Take this gold!",
"on_open_commands": [
"/clear @p"
],
"on_close_commands": [
"/say Enjoy the gold! "
],
"buttons": [
{
"name": "Take Gold",
"commands": [
"/give @initiator gold_ingot"
]
}
]
}
장면 속성
scene_tag: 게임에서 이 장면을 호출하는 데 사용하는 이름입니다. 이것은 필수 속성입니다.
npc_name: NPC 대사 상자의 이름을 추가하거나 변경하는 곳입니다. NPC 이름을 동적으로 변경할 때 사용할 수 있는 선택적 속성입니다.
Text: NPC가 게임에서 이 장면에 대해 표시할 대사를 입력하는 곳입니다. 대사 텍스트를 바로 입력하거나, 언어 파일을 사용한다면 원시 텍스트를 사용해도 됩니다. 이것은 선택적 속성이지만, 이 속성이 없으며 NPC 대사 상자에 아무것도 표시되지 않습니다.
on_open_commands: NPC 대사 상자가 열리면 발화되는 명령어를 정의하는 곳입니다. 선택적 속성입니다.
on_close_commands: NPC 대사 상자가 닫히면 실행되는 명령어를 정의하는 곳입니다. 선택적 속성입니다.
Buttons: NPC의 버튼을 만드는 곳입니다. 하위 집합에는 "name”과 "commands” 속성이 포함됩니다. "name” 속성을 사용하면 NPC의 버튼에 표시되는 텍스트를 설정할 수 있습니다. 두 번째 속성인 "commands”를 사용하면 버튼을 눌렀을 때 게임에서 실행되는 명령어를 추가할 수 있습니다. 선택적 속성으로, NPC 버튼에 필요합니다.
Rawtext
위에 나오는 모든 장면 속성은 원시 텍스트를 지원합니다.
{
"scene_tag": "ducky_intro",
"npc_name": { "rawtext": [ { "translate": "character.name", "with": ["\n"] } ] },
"text": { "rawtext": [ { "translate": "ducky.intro.text", "with": ["\n"] } ] },
"on_open_commands": ["/clear @p"],
"on_close_commands": ["/say Enjoy the gold! "],
"buttons": [
{
"name": { "rawtext": [ { "translate": "dialogue.button.name" } ] },
"commands": [
"/give @initiator gold_ingot"
]
}
]
}
대사 명령어
대사 명령어는 NPC가 장면 파일을 열거나 읽을 수 있게 합니다. 명령어에는 두 가지 모드가 있으며, 각 모드는 고유한 목적과 구문을 가집니다.
대사 열기
대사 열기는 타겟팅한 플레이어에게 NPC 대사 상자를 강제로 여는 용도로 사용합니다. 이 기능의 이전 이름은 원격 발화였습니다. NPC를 클릭했을 때의 환경을 시뮬레이션하기 때문입니다. 이 명령어는 모든 NPC에서 사용할 수 있으며 행동 팩이 필요하지 않습니다. 단 NPC가 대사에 장면 파일을 사용해야 할 때는 예외입니다(대사 열기를 사용할 때는 장면 파일이 필수가 아닙니다).
대사 열기의 구문은 다음과 같습니다.
/dialogue open <npc: target> <player: target> [sceneName:string]
/dialogue: 최초 명령어입니다.
open: 명령어 변형입니다.
<npc: target>: 타겟팅한 NPC입니다.
<player: target>: 타겟팅한 플레이어입니다. 이 플레이어는 NPC 대사 상자를 보게 됩니다.
[sceneName:string]: 장면 파일에 포함된 대사를 사용하고 싶을 때 사용하는 이름입니다. 문자열은 유효한 장면 태그 이름이어야 하며, 그렇지 않으면 작업이 실패하게 됩니다. 이것은 선택적 매개 변수입니다.
참고
sceneName을 지정하지 않으면 NPC의 마지막 대사가 무조건 표시됩니다.
실제 사용법
대사 열기는 주로 두 가지 방식으로 사용합니다.
첫 번째는 플레이어가 NPC와 직접적으로 상호작용하지 않으면서 NPC 대사 상자를 시작하는 방법으로, NPC를 플레이어가 NPC를 클릭하지 않아도 되는 "팝업" 창으로 사용합니다. 이 경우 NPC는 월드에 있는 플레이어에게 반드시 표시하지 않아도 되며(하지만 NPC는 불러온 청크에 존재하고, 대사를 수신하는 플레이어의 똑딱 범위 안에 있어야 합니다.) 지하나 다른 접근 불가능한 위치에 존재할 수 있습니다.
대사 열기를 사용하는 두 번째 방법은 장면 파일을 이용해 대사 분기 트리를 만드는 것입니다. NPC 장면 파일에서 대사 열기 명령어를 사용하면, NPC는 닫기 명령어가나 버튼 명령어를 사용하여 플레이어의 다음 대사 상자를 자동으로 열 수 있습니다. 이것은 모든 대사 트리 분기 변경의 기본 토대입니다.
대사 변경
대사 변경은 NPC가 특별히 지정한 장면 파일에 있는 대사를 사용하게 하는 용도로 사용합니다. 이 명령어가 올바르게 작동하려면 대사 폴더와 장면 파일이 포함된 행동 팩을 사용해야 합니다. 이 명령어는 타겟팅한 NPC가 장면 태그 이름을 기준으로 지정된 위치에서 대사를 끌어오게 합니다. 플레이어가 NPC와의 접촉을 시작하기 전에 명령어를 실행해야 합니다.
대사 열기의 구문은 다음과 같습니다.
/dialogue change <npc: target> <sceneName:string> [player: target]
/dialogue: 최초 명령어입니다.
change: 명령어 변형입니다.
<npc: target>: 타겟팅한 NPC입니다.
<sceneName:string>: 장면 파일에 포함된 대사를 사용하고 싶을 때 사용하는 이름입니다. 문자열은 유효한 장면 태그 이름이어야 하며, 그렇지 않으면 작업이 실패하게 됩니다.
[player: target]: 타겟팅한 플레이어입니다(대사 상자를 보게 되는 플레이어이기도 합니다). "/dialogue change” 명령어에서 이 플레이어를 누락하면 모든 플레이어의 NPC 대사가 업데이트됩니다.
실제 사용법
대사 변경은 주로 명령어를 이용해 NPC의 대사를 변경하는 용도로 사용합니다. 명령어는 월드에서 플레이어가 트리거한 명령어 블록에서 얻거나, 다른 NPC가 발화하거나, 타겟팅한 NPC가 직접 실행합니다.
특정 지역 입장, 다른 NPC와의 대화나 특정 작업 수행 같은, 월드에서의 플레이어 행동을 기준으로 NPC 대사를 변경해야 할 수도 있습니다. 평가할 수 있는 행동은 대사 명령어를 실행하고 NPC의 대사를 변경하는 용도로 사용할 수 있습니다.
대사 변경은 대사 열기처럼 NPC 대사 상자를 표시하지는 않으며, 플레이어가 NPC와의 다음 상호작용에서 보게 되는 장면 파일 대사를 NPC에게 지시하는 역할을 합니다.
타겟팅
타겟팅은 NPC 대사 분기 시스템의 필수 요소입니다. 명령어를 수신하는 NPC와 대사를 보는 플레이어를 결정합니다. 각 플레이어가 여러분이 원하는 대사를 보게 하고 멀티플레이어 시나리오에서도 대사가 표시되게 하는 용도로 사용하기도 합니다.
NPC 타겟팅
/dialogue 명령어를 사용하려면 NPC를 타겟팅해야 합니다. 대사를 표시하는 NPC 역할을 하며, 대사 초상화에 있는 NPC의 이미지를 사용합니다.
대사를 트리거하는 NPC가 반드시 월드 안에 존재해야 합니다.
플레이어 타겟팅
/dialogue 명령어를 사용하면 플레이어도 타겟팅해야 할 때가 생깁니다. 플레이어를 타겟팅하려면 @a(모든 플레이어) 또는 @p(가장 가까운 플레이어) 같은 플레이어 선택기를 사용해야 합니다. 이러한 선택기는 싱글 플레이 환경에서는 대체로 잘 작동하지만, 플레이어별로 장면을 변경하고 싶다면 @initiator(NPC와 상호작용하는 플레이어)라는 특수 타겟 유형을 사용해야 합니다.
예시:
"buttons": [
{
"name": { "rawtext": [ { "translate": "dialogue.button.name" } ] },
"commands": [
"/give @initiator gold_ingot"
]
}
]
이 타겟 선택기를 NPC에 사용하면 NPC는 각 플레이어에 맞게 자신의 대사를 업데이트하게 됩니다. 따라서 멀티 플레이에서 NPC는 각 플레이어의 대사 상태를 기억하고 그에 맞는 고유한 대사를 전송할 수 있습니다. 이 기능은 플레이어가 NPC 대사를 변경하면 다른 플레이어가 완전한 대사 분기를 이용하지 못하게 될 때 유용합니다. 또는 각 플레이어가 NPC로부터 아이템 하나만 받게 하여 동일한 플레이어가 NPC에게 추가 아이템을 반환하지 못하게 하거나 다른 플레이어가 아이템을 수집하지 못하게 하는 용도로도 사용할 수 있습니다.
전체 예시:
{
"format_version": "1.17",
"minecraft:npc_dialogue": {
"scenes": [
{
"scene_tag": "ducky_intro",
"npc_name": { "rawtext": [ { "translate": "character.name", "with": ["\n"] } ] },
"text": { "rawtext": [ { "translate": "ducky.intro.text", "with": ["\n"] } ] },
"on_open_commands": ["/clear @p"],
"on_close_commands": ["/say Enjoy the gold! "],
"buttons": [
{
"name": { "rawtext": [ { "translate": "dialogue.button.name" } ] },
"commands": [
"/give @initiator gold_ingot"
]
}
]
}
]
}
}
장면을 트리거하는 명령어:
/dialogue open @e[tag=ducky] @p ducky_intro