Cấu trúc dữ liệu là cách các lập trình viên lưu trữ và tổ chức toàn bộ bộ dữ liệu.Trong Luau, cấu trúc dữ liệu được tạo với 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 bao gồm sử dụng mảng , một loại bảng cụ đánh máy, để tạo một nhân vật nói chuyện.

Bảng
Bảng là các loại dữ liệu có thể chứa nhiều giá trị.Không giống như các loại dữ liệu khác lưu một giá trị duy nhất, các bảng không có kích 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 các bảng, bạn có thể lưu vật phẩm trong kho đồ của người chơi hoặc tạo một 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ột array , lưu danh sách các giá trị theo một trật tự cụ thể.Để tạo một mảng, tạo một biến và gán nó cho dấu ngoặc kép { } .Tách các giá trị trong dấu ngoặc với dấu phẩy như dưới đây:
local myArray = {"item1", "item2", 10, workspace.Part, myVariable}
Tạo một nhân vật nói chuyện
Để khám phá các 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 nhấp vào, sẽ hiển thị một dòng thoại khác.
Dự án này sẽ sử dụng mô hình NPC đã được thiết lập trước, bao gồm một kịch bản một phần và Trình phát hiện lời nó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 > Nhập từ tập tin và chọn tập tin đã tải xuống.
Mã một mảng cuộc trò chuyện
Các bước này sử dụng một array để lưu 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 , đi đến NPC > ProximityPrompt > ChatManager.
Trong ChatManager, nơi được đánh dấu trong kịch bản, tạo một array trống để lưu lựa chọn cuộc trò chuyện.
-- Vòng lặp qua cuộc trò chuyện trong khi yêu cầu đượ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 = "I've got one thing to say!"Chat:Chat(head, dialogue)endprompt.Triggered:Connect(speak)Trong dấu ngoặc {} của mảng vừa tạo, hãy nhập ít nhất ba chuỗi cuộc trò chuyện, tách bởi dấu phẩy.
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}
Sử dụng chỉ mục mảng
Mỗi giá trị trong mảng được gán một số index .Các chỉ mục được gán cho các giá trị theo thứ tự lưu trữ các giá trị.Giá trị đầu tiên là ở index 1, giá trị thứ hai ở index 2, và như vậy.
Một số ngôn ngữ lập trình, như Java, bắt đầu chỉ mục tại 0.
Trong mảng vừa tạo, "Hi" ở tại index 1, và "Goodbye!" ở tại index 3.
Mục lục | Giá trị |
---|---|
1 | Hi |
2 | Hôm nay là một ngày tuyệt vời! |
3 | Tạm biệt! |
Sử dụng các giá trị chỉ mục cụ thể
Sử dụng giá trị chỉ mục để gán các mảnh đố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 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 = {"Hi!", "Do I know you?", "Goodbye!"}local function speak()local dialogue = dialogueArray[2]Chat:Chat(head, dialogue)endThử nghiệm 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 mỗi giá trị trong bảng.
Thay đổi 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.Thật chán nản.Thay vào đó, sử dụng một biến để cập nhật giá trị chỉ mục nào sẽ sử dụng.
Mỗi khi một người chơi tương tác với NPC, tăng giá trị biến bằng 1 để hiển thị dòng trò chuyện 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 ở đầu của mảng.
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}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Ở phía dưới của chức năng, thêm 1 đến dialogueIndex . Lần tiếp theo speak() được gọi, hộp thoại sẽ hiển thị chuỗitiếp theo.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)dialogueIndex += 1endThử nghiệm và nhấp vào NPC để xem mỗi chuỗi diálogo từ mảng.
Lưu ý có một lỗi trong cửa sổ Thành phẩm một khi kịch bản đạt đến cuối mảng.
Bạn sẽ sửa lỗi này trong phần tiếp theo để cuộc hộ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 phải đặt lại chỉ mục mong muốn thành 1.Tìm kích thước của một array bằng cách gõ , không có khoảng trống, trước tên của một array.
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 gian bắt đầu lại từ đầu.
Khởi động lại cuộc trò chuyện
Sử dụng kích thước của mảng để kiểm tra khi nào là thời gian để quay lại mảnh đối thoại đầu tiên.
Thêm một câu lệnh if và kiểm tra xem if dialogueIndex bằng #dialogueArray , tổng kích thước của mảng này. Nếu có, then set dialogueIndex to 1.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)if dialogueIndex == #dialogueArray thendialogueIndex = 1enddialogueIndex += 1endNếu dialogueIndex không ở kết thúc, 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 bạn có thể chuyển qua và khởi động lại cuộc đối thoại.
Tổng quát
Cấu trúc dữ liệu là cách các bộ dữ liệu được lưu trữ.Luau sử dụng bảng để tạo cấu trúc dữ liệu.Các mảng là một loại bảng có thể giữ danh sách được sắp xếp của thông tin.Mỗi giá trị trong mảng được gán số索引, bắt đầu với索引 1.
Tập lệnh này sử dụng một array để tạo một danh sách các dòng thoại có thể cho một Nhân vật không thể chơi (NPC).
Hoàn thành kịch bản
-- Vòng lặp qua cuộc trò chuyện trong khi yêu cầu đượ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 = {"Hi!", "Do I know you?", "Goodbye!"}
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 array của cuộc đối thoại, hãy thử các lời khuyên khắc phục sự cố sau.
- Kiểm tra if tuyên bố rằng dialogueIndex được đặt lại thành 1. Trong tuyên bố else, kiểm tra xem dialogueIndex có 1 được thêm vào chính nó.
- Khi nhận kích thước của mảng, hãy đảm bảo không có khoảng trống sau # trong #dialogueArray.
Thử thách tùy chọn
Thử một trong những thử thách tùy chọn dưới đây.
- Mã hóa kịch bản để cuộc đối thoại của NPC lùi lại qua mảng. dialogueIndex nên bắt đầu tại mảng và trừ mỗi lần thay vì thêm.
- Thay vì hiển thị cuộc trò chuyện theo thứ tự, NPC có thể hiển thị một dòng cuộc trò chuyện ngẫu nhiên mỗi lần 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 cuộc thoại mới mỗi khi NPC được nhấp vào
local function speak()
local randomIndex = randomGenerator:NextInteger(1, #dialogueArray)
local dialogue = dialogueArray[randomIndex]
Chat:Chat(head, dialogue)
end