데이터 구조는 코더가 전체 데이터 세트를 저장하고 구성하는 방법입니다. Luau에서는 데이터 구조가 테이블로 생성됩니다. 테이블은 임의의 수의 값을 보유할 수 있습니다.
이 문서에서는 배열이라는 특정 테이블 유형을 사용하여 대화하는 캐릭터를 만드는 방법을 다룹니다.

테이블
테이블은 여러 값을 보유할 수 있는 데이터 유형입니다. 단일 값을 저장하는 다른 데이터 유형과 달리, 테이블은 고정 크기가 없으며 다양한 값 유형을 혼합하여 보유할 수 있습니다. 테이블을 사용하면 플레이어의 인벤토리에 아이템을 저장하거나 수천 개의 플레이어 이름 목록을 만들 수 있습니다.
배열
테이블에는 여러 유형이 있습니다. 그 중 하나는 배열로, 특정 순서로 값 목록을 저장합니다. 배열을 만들려면 변수를 생성하고 중괄호 { }를 할당합니다. 중괄호 내의 값을 쉼표로 구분합니다:
local myArray = {"item1", "item2", 10, workspace.Part, myVariable}
대화하는 캐릭터 만들기
배열을 탐색하기 위해 클릭 시 다른 대화 내용을 보여주는 비플레이어 캐릭터(NPC)와 작업할 것입니다.
이 프로젝트는 미리 만들어진 NPC 모델을 사용하며, 여기에는 부분 스크립트와 프롬프트 감지기가 포함되어 있지만 대화 내용은 없습니다.
탐색기에서 Workspace를 마우스 오른쪽 버튼으로 클릭하고 파일에서 삽입을 선택한 후 다운로드한 파일을 선택하여 NPC를 가져옵니다.
대화 배열 코딩하기
이 단계에서는 NPC가 플레이어와 상호작용할 때 말할 다양한 문구를 저장하기 위해 배열을 사용합니다.
탐색기에서 NPC ⟩ ProximityPrompt ⟩ ChatManager로 이동합니다.
ChatManager에서 스크립트에 표시된 곳에 대화 옵션을 저장할 빈 배열을 생성합니다.
-- 프롬프트가 사용될 때 채팅 대화를 순환합니다.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 = "말할 것이 하나 있어요!"Chat:Chat(head, dialogue)endprompt.Triggered:Connect(speak)방금 생성한 배열의 중괄호 {} 내에 쉼표로 구분된 최소 세 개의 대화 문자열을 입력합니다.
local dialogueArray = {"안녕하세요!", "저를 아시나요?", "안녕히 가세요!"}
배열 인덱스 사용하기
배열의 각 값에는 인덱스 번호가 할당됩니다. 인덱스는 값이 저장된 순서에 따라 값에 할당됩니다. 첫 번째 값은 인덱스 1에, 두 번째는 인덱스 2에, 그리고 그 다음은 계속해서 할당됩니다.
Java와 같은 일부 코딩 언어는 인덱스를 0에서 시작합니다.
방금 생성한 배열에서 "안녕하세요!"는 인덱스 1에, "안녕히 가세요!"는 인덱스 3에 있습니다.
| 인덱스 | 값 |
|---|---|
| 1 | 안녕하세요! |
| 2 | 오늘은 좋은 날이에요! |
| 3 | 안녕히 가세요! |
특정 인덱스 값 사용하기
인덱스 값을 사용하여 NPC에 특정 대화 내용을 할당합니다. 특정 인덱스의 값을 사용하려면 배열 이름 뒤에 인덱스를 대괄호로 추가합니다. 예: dialogueArray[1].
dialogue 변수의 기본 문자열 값을 인덱스 2로 교체합니다.
local dialogueArray = {"안녕하세요!", "저를 아시나요?", "안녕히 가세요!"}local function speak()local dialogue = dialogueArray[2]Chat:Chat(head, dialogue)end플레이 테스트를 하고 NPC를 클릭합니다. 두 번째 배열 값이 채팅 풍선에 나타나야 합니다. 코드를 변경하여 테이블의 각 값을 테스트해 보세요.

대화 내용 변경하기
플레이어가 NPC와 상호작용할 때 NPC는 항상 같은 대사를 말합니다. 그건 지루합니다. 대신 변수를 사용하여 사용할 인덱스 값을 업데이트합니다.
플레이어가 NPC와 상호작용할 때마다 변수 값을 1씩 증가시켜 다음 대화 내용을 표시합니다.
현재 인덱스를 추적하기 위해 dialogueIndex라는 새 변수를 추가합니다. 변수를 1로 설정하여 배열의 시작에서 시작합니다.
local dialogueArray = {"안녕하세요!", "저를 아시나요?", "안녕히 가세요!"}local dialogueIndex = 1speak()에서 dialogueArray[2]의 인덱스 번호를 방금 생성한 변수로 교체합니다.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)end함수의 맨 아래에 dialogueIndex에 1을 추가합니다. 다음에 speak()가 호출될 때 대화 내용이 다음 문자열로 표시됩니다.
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 += 1enddialogueIndex가 끝에 있지 않다면 여전히 dialogueIndex에 1을 추가해야 합니다. dialogueIndex += 1을 else 문 아래로 이동합니다.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)dialogueIndex = if dialogueIndex == #dialogueArray then 1 else dialogueIndex + 1end플레이하고 대화를 순환하고 재시작할 수 있는지 확인합니다.
요약
데이터 구조는 데이터 세트를 저장하는 방법입니다. Luau는 테이블을 사용하여 데이터 구조를 생성합니다. 배열은 정보를 정렬된 목록으로 보유할 수 있는 테이블의 한 유형입니다. 배열 내의 각 값은 인덱스 번호가 할당되며, 인덱스 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 = {"안녕하세요!", "저를 아시나요?", "안녕히 가세요!"}
local dialogueIndex = 1
local function speak()
local dialogue = dialogueArray[dialogueIndex]
Chat:Chat(head, dialogue)
dialogueIndex = if dialogueIndex == #dialogueArray then 1 else dialogueIndex + 1
end
prompt.Triggered:Connect(speak)문제 해결 팁
캐릭터가 대화 배열을 통과하지 않는 경우 다음 문제 해결 팁을 시도해 보세요.
- dialogueIndex가 1로 다시 설정되는 if 문을 확인합니다. else 문에서 dialogueIndex에 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