데이터 구조 는 코더가 전체 데이터 집합을 저장하고 구성하는 방법입니다. Lua에서 데이터 구조는 테이블로 만들어집니다. 테이블 은 모든 값을 포함할 수 있습니다.
이 문서에서는 배열 , 특정 테이블 입력사용하여 대화 캐릭터를 생성하는 방법에 대해 설명합니다.
테이블
테이블은 단일 값을 저장하는 다른 데이터 형식과는 달리 여러 값을 저장할 수 있는 데이터 형식입니다. 단일 값을 저장하는 다른 데이터 형식은 고정 크기가 없으며 다른 값 형식의 혼합을 저장할 수 있습니다. 테이블을 사용하여 플레이어의 인벤토리에 아이템을 저장하거나 수천 개의 플
배열
다른 종류의 테이블이 있습니다. 하나는 배열 이며, 값 목록을 특정 순서로 저장합니다. 배열을 생성하려면 변수를 만들고 커리 브라켓 { } 을 할당합니다. 아래와 같은 쉼표로 구분된 값 내에 별도 값을 생성하세요.
local myArray = {"item1", "item2", 10, workspace.Part, myVariable}
말하는 캐릭터 생성
배열을 탐색하려면 클릭할 때 다른 대화 행을 표시하는 비플레이 캐릭터(NPC)와 작업합니다.
이 프로젝트는 대화 상자가 없지만 부분 스크립트 및 프롬프트 감지기를 포함하는 미리 만든 NPC 모델을 사용합니다.
In Explorer, import the NPC by right-clicking on 작업 공간 > 파일에서 다운로드 and select the downloaded file.
대화 상자 배열 코딩
이 단계는 플레이어가 상호 작용할 때 NPC가 말할 다양한 문구를 저장하기 위해 배열을 사용합니다.
In the 탐색기 , go to NPC > ProximityPrompt > ChatManager.
In ChatManager, where marked in the script, create an empty array to store dialogue options.
-- 대화 상자에 사용할 때 채팅 대화를 순환합니다.local Chat = game:GetService("Chat")local prompt = script.Parentlocal npc = prompt.Parentlocal characterParts = npc.CharacterPartslocal head = characterParts.Head-- 여기에 배열 추가local dialogueArray = {}local function speak()local dialogue = "I've got one thing to say!"Chat:Chat(head, dialogue)endprompt.Triggered:Connect(speak)방금 생성된 배열의 {} 안에 있는 공백 내에서 최소 3개의 대화 문자열을 별도의 쉼표로 구분합니다.
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}
배열 인덱스 사용
배열의 각 값에는 index 번호가 할당됩니다. 인덱스는 값이 저장된 순서대로 지정됩니다. 첫 번째 값은 인덱스 1에, 두 번째는 인덱스 2에, 그리고 그 밖에 순서대로입니다.
일부 코딩 언어, 예를 들어 자바, 인덱스를 0부터 시작합니다.
방금 생성된 배열에서 안녕 은 인덱스 1에 있고, 굿바이 은 인덱스 3에 있습니다.
인덱스 | 값 |
---|---|
1 | 안녕 |
2 | 오늘은 멋진 날입니다! |
3 | 잘 가요! |
특정 인덱스 값 사용
대화 상자에 특정 대화 조각을 할당하려면 인덱스 값을 사용하십시오. 특정 인덱스에 대해 값을 사용하려면 배열 이름 뒤에 인덱스를 직접 추가하십시오. 예를 들어 dialogueArray[1].
대화 상자의 기본 문자열 값을 인덱스 2로 변경합니다.
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}local function speak()local dialogue = dialogueArray[2]Chat:Chat(head, dialogue)endNPC를 플레이테스트하고 클릭하십시오. 두 번째 배열 값이 채팅 버블에 표시되어야 합니다. 테이블의 각 값을 테스트하려면 코드를 변경하십시오.
대화 상자 줄 변경
플레이어가 NPC와 상호 작용할 때 NPC는 항상 동일한 줄을 말합니다. 지루하죠. 대신 변수를 사용하여 사용할 인덱스 값을 업데이트하십시오.
플레이어가 NPC와 상호 작용할 때마다 변수 값을 1 증가시켜 다음 대화 상자를 표시합니다.
현재 인덱스를 추적하려면 새 변수를 추가하십시오. dialogueIndex 이름의 변수를 1로 설정하여 배열의 시작 부분에서 시작합니다.
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}local dialogueIndex = 1In speak() , 대화 상자 배열[2]에 있는 인덱스 번호를 변수를 만든 변수로 교체합니다.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)end함수 하단에 1을 추가하세요. 다음에 dialogueIndex 이 호출될 때 대화 상자에 다음 문자열이 표시됩니다.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)dialogueIndex += 1end플레이테스트 및 NPC를 클릭하여 배열에서 각 대화 문자열을 확인하십시오.
스크립트가 배열의 끝에 도달하면 오류 가 출력 창에 있음을 알아보세요.
다음 섹션에서 대화 상자가 마지막 문자열표시한 후 대화를 다시 시작하도록 대화 상자를 수정합니다.
배열 크기
원하는 인덱스를 1로 다시 설정할 때의 배열 크기를 알려면 배열의 크기를 찾을 수 있습니다. 배열의 이름 앞에 있는 크기를 찾으십시오.
예: #dialogueArray
배열의 크기를 변수의 현재 값과 비교하여 배열이 시작될 때가 되었는지 알아보십시오.
대화 재시작
배열 크기를 사용하여 첫 번째 대화 항목으로 돌아가는 시간을 확인할 수 있습니다.
이 문을 추가하고 if 문이 dialogueIndex 와 일치하는지 확인하십시오. 이 배열의 총 크기는 #dialogueArray 입니다. 그렇다면 dialogueIndex 를 1로 설정합니다.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)if dialogueIndex == #dialogueArray thendialogueIndex = 1enddialogueIndex += 1end대화 상자 인덱스가 종료없으면 여전히 대화 상자 인덱스에 1을 추가해야 합니다. 다른 문장 아래에 있는 dialogueIndex에 이동합니다.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)if dialogueIndex == #dialogueArray thendialogueIndex = 1elsedialogueIndex += 1endend대화 상자를 재사용하여 대화를 다시 시작하도록 플레이하고 확인하십시오.
요약
데이터 구조는 데이터 집합을 저장하는 방법입니다. Lua에서는 테이블을 사용하여 데이터 구조를 만듭니다. 배열은 순서대로 정렬된 정보의 집합을 나타내는 형식의 테이블입니다. 각 값 내의 배열에는 인덱스 번호가 할당되며, 인덱스는 1부터 시작합니다.
이 스크립트는 플레이 불 가능한 캐릭터(NPC)에 대한 대화 목록을 만들기 위해 배열을 사용했습니다.
완료된 스크립트
-- 대화 상자에 사용할 때 채팅 대화를 순환합니다.
local Chat = game:GetService("Chat")
local prompt = script.Parent
local npc = prompt.Parent
local characterParts = npc.CharacterParts
local head = characterParts.Head
-- 여기에 배열 추가
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}
local dialogueIndex = 1
local function speak()
local dialogue = dialogueArray[dialogueIndex]
Chat:Chat(head, dialogue)
if dialogueIndex == #dialogueArray then
dialogueIndex = 1
else
dialogueIndex += 1
end
end
prompt.Triggered:Connect(speak)
문제 해결 팁
캐릭터가 대화 배열을 통과하지 않으면 다음 문제 해결 팁을 시도하십시오.
- 다른 문에서 문이 1로 설정되었는지 확인하십시오. 여기에서 문이 1을 더하면 문이 1로 설정됩니다.
- 배열의 크기를 가져올 때 #dialogueArray 의 뒤에 공백이 없는지 확인하세요.
선택적 도전
아래의 옵션 도전 중 하나를 시도해 보세요.
- 스크립트를 코드하여 NPC의 대화가 배열을 통해 뒤로 가도록 합니다. 대화 인덱스는 배열에서 시작하고 각 번에 대신 추가하는 대신 하나씩 뺄셈해야 합니다.
- 대화 순서대로 표시하는 대신 NPC가 각 번 Random.new() 를 사용하여 랜덤 대화 라인을 표시합니다. 아래에 샘플 스크립트가 포함되어 있습니다.
local randomGenerator = Random.new()
-- NPC를 클릭할 때마다 새로운 대화 상자를 표시합니다.
local function speak()
local randomIndex = randomGenerator:NextInteger(1, #dialogueArray)
local dialogue = dialogueArray[randomIndex]
Chat:Chat(head, dialogue)
end