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 sẽ đề 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à kiểu dữ liệu có thể chứa nhiều giá trị. Không giống như các kiểu dữ liệu khác chỉ lưu trữ một giá trị, bảng không có kích thước cố định và có thể chứa một hỗn hợp các kiểu giá trị khác nhau. Với bảng, bạn có thể lưu trữ các mục trong kho của người chơi hoặc tạo danh sách hàng nghì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, mà lưu trữ danh sách các giá trị theo một trật tự cụ thể. Để tạo một mảng, bạn 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ị bên trong dấu ngoặc bằng dấu phẩy như dưới đây:
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, hiển thị một dòng đối thoại khác.
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 phần và Detector Prompt 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
Những bước này sử dụng một mảng để lưu trữ các cụm từ khác nhau cho NPC để nói khi người chơi tương tác với nó.
Trong Explorer, đến NPC ⟩ ProximityPrompt ⟩ ChatManager.
Trong ChatManager, nơi được đánh dấu trong kịch bản, tạo một mảng trống để lưu trữ các tùy chọn đối thoại.
-- Luân phiên qua các đối thoại chat khi prompt đượ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 chỉ 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 = {"Xin chào!", "Tôi có biết bạn không?", "Tạm biệt!"}
Sử dụng chỉ mục mảng
Mỗi giá trị trong mảng được gán một số chỉ mục. Các chỉ mục được gán cho các giá trị theo thứ tự lưu trữ. Giá trị đầu tiên ở chỉ mục 1, giá trị thứ hai ở chỉ mục 2, và cứ thế.
Một số ngôn ngữ lập trình, như Java, bắt đầu chỉ mục từ 0.
Trong mảng vừa tạo, "Xin chào!" ở chỉ mục 1, và "Tạm biệt!" ở chỉ mục 3.
| Chỉ mục | Giá trị |
|---|---|
| 1 | Xin chào |
| 2 | Hôm nay thật tuyệt vời! |
| 3 | Tạm biệt! |
Sử dụng các giá trị chỉ mục cụ thể
Sử dụng các giá trị chỉ mục để 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ỉ mục cụ thể, thêm chỉ mục 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ỉ mục 2.
local dialogueArray = {"Xin 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ử nghiệm và nhấp vào NPC. Giá trị mảng thứ hai nên xuất hiện trong bong bóng chat. 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ỉ mục nào cần sử dụng.
Bất cứ khi nào một người chơi tương tác với NPC, tăng giá trị biến thêm 1 để hiển thị dòng đối thoại tiếp theo.
Để theo dõi chỉ mục hiện tại, thêm một biến mới có tên là dialogueIndex. Đặt biến thành 1 để bắt đầu từ đầu mảng.
local dialogueArray = {"Xin chào!", "Tôi có biết bạn không?", "Tạm biệt!"}local dialogueIndex = 1Trong speak(), thay thế số chỉ mục 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, cộng 1 cho dialogueIndex. Lần sau khi 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ử nghiệm và nhấp vào NPC để xem từng chuỗi đối thoại từ mảng.
Hãy chú ý có một lỗi trong cửa sổ Output một 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 nên đặt lại chỉ mục 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 là thời điểm 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 là thời điểm luân phiên trở lại phần đối thoại đầu tiên.
Thêm một câu lệnh if và kiểm tra nếu dialogueIndex bằng #dialogueArray, tổng kích thước của mảng này. Nếu đúng, 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 cộng 1 cho 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 thử nghiệm và xác nhận rằng bạn có thể luân phiên 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ấ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 có thứ tự. Mỗi giá trị trong mảng được gán một số chỉ mục, bắt đầu từ chỉ mục 1.
Kịch bản này đã sử dụng một mảng để tạo 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).
Kịch bản hoàn chỉnh
-- Luân phiên qua các đối thoại chat khi prompt đượ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 = {"Xin 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ộng thêm 1 cho chính nó.
- Khi lấy kích thước của mảng, đảm bảo không có khoảng trắng sau ký hiệ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 sao cho đối thoại của NPC đi ngược qua mảng. Chỉ mục đối thoại nên bắt đầu từ độ dài mảng và trừ 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 dưới đây để tham khảo
local randomGenerator = Random.new()
-- Hiển thị một đối thoại mới bất cứ khi nào NPC được nhấp vào
local function speak()
local randomIndex = randomGenerator:NextInteger(1, #dialogueArray)
local dialogue = dialogueArray[randomIndex]
Chat:Chat(head, dialogue)
end