Cấu trúc dữ liệu là cách các nhà lập trình lưu trữ và tổ chức các bộ dữ liệu toàn bộ. Ở Lua, cấu trúc dữ liệu được tạo với các hàng. Hàng có thể chứa bất kỳ số giá trị nào.
Bài viết này xem xét sử dụng ma trận , một loại table nhất đá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 trữ một giá trị duy nhất, bảng không có kích thước cố định và có thể chứa hỗn hợp các loại dữ liệu khác nhau. Với bảng, bạn có thể lưu các mục trong kho
Ma trận
Có nhiều loại khác nhau của bảng. Một loại là một ma trận , which stores lists of values in a specific order. Để tạo một ma trận, tạo một biến và giao cho nó các dấu chấm câu like sau:
local myArray = {"item1", "item2", 10, workspace.Part, myVariable}
Tạo một nhân vật nói chuyện
Để khám phá mảng, bạn sẽ làm việc với một nhân vật không chơi (NPC) mà, khi được nhấp chuột, hiển thị một dòng thoại khác.
Dự án này sẽ sử dụng một mô hình NPC trước đó, bao gồm một script phần và Nhận xét người dùng nhưng thiếu hành động thoại.
Trong Explorer, nhập NPC bằng cách nhấp chuột phải vào Workspace > Import From File và chọn tập tin đã tải.
Mã hóa một Cấu hình đối thoại
Các bước này sử dụng một mat阵 để 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 Trình duyệt , hãy đến NPC > ProximityPrompt > ChatManager.
Trong ChatManager, nơi được xác định trong script, tạo một empty array để lưu các lựa chọn trò chuyện.
-- Làm cho mấy vòng trò chuyện khi sử dụng hộp thoạilocal 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 những khoảng trống {} của hàng đã tạo, hãy viết ít nhất ba dòng thoại, được phân cách bởi các dấu chấm câu.
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}
Sử dụng chỉ số阵
Mỗi giá trị trong mảng được gán một index số. Các chỉ mục được gán cho giá trị trong thứ tự mà giá trị được lưu. Giá trị đầu tiên ở índice 1, giá trị thứ hai ở índice 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 danh sách mới tạo, "Hi" ở thứ hạng thứ nhất, và "Goodbye!" ở thứ hạng thứ ba.
Chỉ mục | Giá Trị |
---|---|
1 | Xin 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 giá trị chỉ mục để giao dịch các thành phần cụ thể của hội thoại cho NPC. Để sử dụng giá trị ở một chỉ mục cụ thể, hãy thêm chỉ mục trong dấu ngoặc trực tiếp sau tên của bảng đã định, như dialogueArray[1] .
Thay thế giá trị chuỗi mặc định của biến dialogue với giá trị chuỗi chỉ số 2.
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}local function speak()local dialogue = dialogueArray[2]Chat:Chat(head, dialogue)endChơi thử và nhấp vào NPC. Giá trị hệ số thứ hai nên xuất hiện trong bong bóng trò chuyện. Cố gắng thay đổi mã để kiểm tra mỗi giá trị trong bảng.
Đổi dòng thoại
Khi người chơi tương tác với NPC, NPC sẽ luôn luôn nói cùng một dòng. Điều này rất buồn cười. Thay vào đó, hãy sử dụng biến để cập nhật giá trị chỉ số nào để 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 1 để hiển thị dòng thoại tiếp theo.
Để theo dõi chỉ mục hiện tại, hãy thêm một biến mới có tên là dialogueIndex . Đặt biến này để 1 để bắt đầu ở đầu của dải.
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}local dialogueIndex = 1Trong speak() , thay thế số thứ tự trong dialogueArray[2] với biến bạn vừa tạo.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)endỞ dưới cùng của chức năng, thêm 1 đến dialogueIndex . Lần tiếp theo khi gọi speak() , hộ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 mỗi dòng thoại từ danh sách.
Ghi chú có một lỗi trong Cửa sổ Ra mắt khi script đạt đến cuối của mảng.
Bạn sẽ sửa lỗi điều này ở một mục tiếp theo, để hội thoại khởi động lại từ đầu sau khi hiển thị chuỗicuối cùng.
Kích thước mat阵
Bạn có thể sử dụng kích thước của mảng để biết khi nào đặt lại mảng mong muốn thành 1. Tìm kích thước mảng bằng cách nhập # , không có dấu chấm câu, trước tên mảng.
Ví dụ: #dialogueArray
Kiểm tra kích thước mat阵 so với giá trị biến hiện tại để biết khi nào là thời gian để bắt đầu lại ở đầu.
Khởi động lại Hội thoại
Sử dụng kích thước mat阵 để kiểm tra khi nào thì đã đến lúc kiểm tra lại vào câu trò chuyện đầu tiên.
Thêm một if statement và kiểm tra xem dialogueIndex đồng bộ với #dialogueArray , kích thước tổng thể của hệ thống này. Nếu vậy, thiết lập dialogueIndex để 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 đến dialogueIndex . Di chuyển dialogueIndex += 1 dưới một câu khác.
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)if dialogueIndex == #dialogueArray thendialogueIndex = 1elsedialogueIndex += 1endendChơi và xác nhận rằng bạn có thể tái tạo cuộc hội thoại.
Tổng kết
Cấu trúc dữ liệu là cách lưu trữ các bộ dữ liệu. Lua sử dụng bảng để tạo các cấu trúc dữ liệu. Các mảng là một loại bảng có thể lưu trữ các danh sách trình tự của thông tin. Mỗi giá trị trong mảng đều được gán một số chỉ mục, bắt đầu từ chỉ mục thứ nhất.
Cuộn sách này sử dụng một table để tạo một danh sách các dòng thoại có thể cho một nhân vật không chơi (NPC).
Tập lệnh đã hoàn thành
-- Làm cho mấy vòng trò chuyện khi sử dụng hộp thoại
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)
if dialogueIndex == #dialogueArray then
dialogueIndex = 1
else
dialogueIndex += 1
end
end
prompt.Triggered:Connect(speak)
Mẹo dịch vụ
Nếu nhân vật đó không đi qua danh sách thoại, hãy thử các mẹo hỗ trợ khác.
- Kiểm tra if statement that dialogueIndex đã được thiết lại lại 1. Trong else statement, kiểm tra rằng dialogueIndex đã có 1 được thêm vào nó.
- Khi nhận kích thước của hàng đợi, hãy đảm bảo không có không gian sau dấu # trong #dialogueArray .
Thử thách Ops
Hãy thử một trong những thử thách opzional dưới đây.
- Lập trình nội dung để đối thoại NPC đi qua mảng. Đối thoạiIndex nên bắt đầu tại mảng và trừ khi mỗi lần thay vì thêm.
- Thay vì hiển thị hội thoại theo trình tự, có NPC hiển thị một dòng hội thoại ngẫu nhiên mỗi lần sử dụng Random.new() . Một mẫu script ví dụ được bao gồm dưới đây để tham khảo
local randomGenerator = Random.new()
-- Hiển thị một cuộc đố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