Cấu trúc dữ liệu là cách mà lập trình viên lưu trữ và tổ chức toàn bộ tập dữ liệu. Trong Luau, cấu trúc dữ liệu được tạo ra bằng các bảng. Bảng có thể chứa bất kỳ số lượng giá trị nào.
Bài viết này đề cập đến việc sử dụng mảng, một loại bảng cụ thể, để tạo ra một nhân vật biết nói.

Bảng
Bảng là các kiểu dữ liệu có thể chứa nhiều giá trị. Khác với các kiểu dữ liệu khác chỉ lưu trữ một giá trị duy nhất, bảng không có kích thước cố định và có thể chứa một hỗn hợp các loại giá trị khác nhau. Với bảng, bạn có thể lưu trữ các vật phẩm trong kho của người chơi hoặc tạo danh sách hàng ngàn tên người chơi.
Mảng
Có nhiều loại bảng khác nhau. Một loại là mảng, lưu trữ danh sách các giá trị theo một thứ tự cụ thể. Để tạo một mảng, hãy tạo một biến và gán cho nó dấu ngoặc nhọn { }. Phân tách các giá trị trong dấu ngoặc bằng dấu phẩy như bên dưới:
local myArray = {"item1", "item2", 10, workspace.Part, myVariable}
Tạo một nhân vật biết nói
Để khám phá mảng, bạn sẽ làm việc với một nhân vật không thể chơi (NPC) mà khi được nhấp vào, sẽ hiển thị một dòng đối thoại khác nhau.
Dự án này sẽ sử dụng một mô hình NPC đã được tạo sẵn, bao gồm một kịch bản một phần và Bộ phát hiện lời mời nhưng thiếu đối thoại.
Trong Explorer, nhập NPC bằng cách nhấp chuột phải vào Workspace ⟩ Chèn từ tệp và chọn tệp đã tải xuống.
Lập trình một mảng đối thoại
Các bước này sử dụng một mảng để lưu trữ các cụm từ khác nhau mà NPC sẽ nói khi người chơi tương tác với nó.
Trong Explorer, đi đến NPC ⟩ ProximityPrompt ⟩ ChatManager.
Trong ChatManager, nơi được đánh dấu trong kịch bản, tạo một mảng rỗng để lưu trữ các tùy chọn đối thoại.
-- Vòng lặp qua các đối thoại khi lời mời được sử dụnglocal Chat = game:GetService("Chat")local prompt = script.Parentlocal npc = prompt.Parentlocal characterParts = npc.CharacterPartslocal head = characterParts.Head-- Thêm mảng ở đâylocal dialogueArray = {}local function speak()local dialogue = "Tôi có một điều muốn nói!"Chat:Chat(head, dialogue)endprompt.Triggered:Connect(speak)Trong dấu ngoặc {} của mảng vừa tạo, gõ ít nhất ba chuỗi đối thoại, phân tách bằng dấu phẩy.
local dialogueArray = {"Chào!", "Tôi có biết bạn không?", "Tạm biệt!"}
Sử dụng chỉ số mảng
Mỗi giá trị trong mảng được gán một số chỉ số. Các chỉ số được gán cho các giá trị theo thứ tự mà các giá trị được lưu trữ. Giá trị đầu tiên ở chỉ số 1, giá trị thứ hai ở chỉ số 2, và cứ như vậy.
Một số ngôn ngữ lập trình, như Java, bắt đầu chỉ số từ 0.
Trong mảng vừa tạo, "Chào" ở chỉ số 1, và "Tạm biệt!" ở chỉ số 3.
| Chỉ số | Giá trị |
|---|---|
| 1 | Chào |
| 2 | Hôm nay là một ngày tuyệt vời! |
| 3 | Tạm biệt! |
Sử dụng giá trị chỉ số cụ thể
Sử dụng các giá trị chỉ số để gán các đoạn đối thoại cụ thể cho NPC. Để sử dụng một giá trị tại một chỉ số cụ thể, thêm chỉ số trong dấu ngoặc ngay sau tên của mảng, như dialogueArray[1].
Thay thế giá trị chuỗi mặc định của biến dialogue bằng chỉ số 2.
local dialogueArray = {"Chào!", "Tôi có biết bạn không?", "Tạm biệt!"}local function speak()local dialogue = dialogueArray[2]Chat:Chat(head, dialogue)endChơi thử và nhấp vào NPC. Giá trị mảng thứ hai nên xuất hiện trong bong bóng trò chuyện. Hãy thử thay đổi mã để kiểm tra từng giá trị trong bảng.

Thay đổi các dòng đối thoại
Khi người chơi tương tác với NPC, NPC sẽ luôn nói cùng một dòng. Điều đó thật nhàm chán. Thay vào đó, hãy sử dụng một biến để cập nhật giá trị chỉ số nào sẽ được sử dụng.
Mỗi khi một người chơi tương tác với NPC, hãy tăng giá trị biến lên 1 để hiển thị dòng đối thoại tiếp theo.
Để theo dõi chỉ số hiện tại, thêm một biến mới có tên là dialogueIndex. Đặt biến này thành 1 để bắt đầu từ đầu mảng.
local dialogueArray = {"Chào!", "Tôi có biết bạn không?", "Tạm biệt!"}local dialogueIndex = 1Trong speak(), thay thế số chỉ số trong dialogueArray[2] bằng biến mà bạn vừa tạo.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)endỞ cuối hàm, thêm 1 vào dialogueIndex. Lần tiếp theo speak() được gọi, đối thoại sẽ hiển thị chuỗi tiếp theo.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)dialogueIndex += 1endChơi thử và nhấp vào NPC để xem từng chuỗi đối thoại từ mảng.
Lưu ý rằng có một lỗi trong cửa sổ Output khi kịch bản đến cuối mảng.
Bạn sẽ sửa lỗi này trong phần tiếp theo để đối thoại khởi động lại từ đầu sau khi hiển thị chuỗi cuối cùng.
Kích thước mảng
Bạn có thể sử dụng kích thước của mảng để biết khi nào cần đặt lại chỉ số mong muốn về 1. Tìm kích thước của một mảng bằng cách gõ #, không có khoảng trắng, trước tên của mảng.
Ví dụ: #dialogueArray
Kiểm tra kích thước của mảng so với giá trị hiện tại của biến để biết khi nào đã đến lúc bắt đầu lại từ đầu.
Khởi động lại đối thoại
Sử dụng kích thước mảng để kiểm tra khi nào đã đến lúc quay lại phần đối thoại đầu tiên.
Thêm một câu lệnh if và kiểm tra xem dialogueIndex có bằng #dialogueArray, tổng kích thước của mảng này hay không. Nếu có, hãy đặt dialogueIndex về 1.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)if dialogueIndex == #dialogueArray thendialogueIndex = 1enddialogueIndex += 1endNếu dialogueIndex không ở cuối, nó vẫn nên thêm 1 vào dialogueIndex. Di chuyển dialogueIndex += 1 dưới một câu lệnh else.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)dialogueIndex = if dialogueIndex == #dialogueArray then 1 else dialogueIndex + 1endChơi và xác nhận rằng bạn có thể vòng qua và khởi động lại đối thoại.
Tóm tắt
Cấu trúc dữ liệu là cách mà các tập dữ liệu được lưu trữ. Luau sử dụng bảng để tạo ra các cấu trúc dữ liệu. Mảng là một loại bảng có thể chứa các danh sách thông tin theo thứ tự. Mỗi giá trị trong mảng được gán một số chỉ số, bắt đầu từ chỉ số 1.
Kịch bản này đã sử dụng một mảng để tạo ra một danh sách các dòng đối thoại có thể cho một Nhân vật Không thể chơi (NPC).
-- Vòng lặp qua các đối thoại khi lời mời được sử dụng
local Chat = game:GetService("Chat")
local prompt = script.Parent
local npc = prompt.Parent
local characterParts = npc.CharacterParts
local head = characterParts.Head
-- Thêm mảng ở đây
local dialogueArray = {"Chào!", "Tôi có biết bạn không?", "Tạm biệt!"}
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)Mẹo khắc phục sự cố
Nếu nhân vật không đi qua mảng đối thoại, hãy thử các mẹo khắc phục sự cố sau.
- Kiểm tra câu lệnh if mà dialogueIndex được đặt lại về 1. Trong câu lệnh else, kiểm tra rằng dialogueIndex đã được cộng thêm 1.
- Khi lấy kích thước của mảng, hãy đảm bảo không có khoảng trắng sau dấu # trong #dialogueArray.
Thử thách tùy chọn
Hãy thử một trong những thử thách tùy chọn bên dưới.
- Lập trình kịch bản để đối thoại của NPC đi ngược lại qua mảng. Chỉ số đối thoại nên bắt đầu từ độ dài của mảng và trừ đi mỗi lần thay vì cộng.
- Thay vì hiển thị đối thoại theo thứ tự, hãy để NPC hiển thị một dòng đối thoại ngẫu nhiên mỗi lần bằng cách sử dụng Random.new(). Một kịch bản mẫu được bao gồm bên dưới để tham khảo
local randomGenerator = Random.new()
-- Hiển thị một đối thoại mới mỗi khi NPC được nhấp
local function speak()
local randomIndex = randomGenerator:NextInteger(1, #dialogueArray)
local dialogue = dialogueArray[randomIndex]
Chat:Chat(head, dialogue)
end