数据结构 是如何存储和组织整个数据集的方式。在 Lua 中,数据结构通过表创建。 表 可以容纳任何数值。
本文涵盖使用 阵列 ,具体表类输入,创建一个会话角色。
桌子
桌子 是数据类型,可以持有多个值。与其他数据类型不同,桌子不具有固定大小,可以容纳多种不同的值类型。 使用桌子,您可以在玩家的库存中存储物品或创建千上千名玩家的名称列表。
阵列
有多种类型的表。其中一个类型是一个 阵列 ,它存储列在特定顺序中。要创建一个阵数组,请创建一个变量并将其分配为上下文符号 { } 。在下列子集中与上下文符号分开:
local myArray = {"item1", "item2", 10, workspace.Part, myVariable}
创建一个会话角色
要探索阵列,您将使用一个非玩家角色(NPC),当单击时,会显示一条不同的对话框。
此项目将使用预制的 NPC 模型,其中包括部分脚本和提示探测器,但缺少对话。
在 Explorer 中,右击 工作区 > 从文件中插入 并选择下载的文件。
编写对话框阵列
这些步骤使用阵列存储不同的语句,供玩家与 NPC 交互时使用。
在 Explorer 中,去 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 = "I've got one thing to say!"Chat:Chat(head, dialogue)endprompt.Triggered:Connect(speak)在刚刚创建的阵列中,在 {} 之前,输入至少三个和话。
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}
使用阵列索引
在列表中的每个值都有一个 index 号。索引是根据值在存储的顺序分配的。第一个值是在索引 1 ,第二个是在索引 2 ,然后继续。
一些编程语言,例如 Java ,在 0 开始索引。
在刚刚创建的阵列中,"Hi" 在索引 1 ,"Goodbye!" 在索引 3 。
索引 | 值 |
---|---|
1 | 您好 |
2 | 今天是个很棒的一天! |
3 | 再见! |
使用特定的索引值
使用索引值将特定对话分配给 NPC。要使用特定索引值,请在数组列名后直接添加索引,例如 dialogueArray[1] 。
将 dialogue 变量的默认值为索引 2 。
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}local function speak()local dialogue = dialogueArray[2]Chat:Chat(head, dialogue)end播放测试并单击 NPC。第二个阵列值应该出现在聊天泡泡中。尝试将代码更改以测试表中每个值。
改变对话框线
当玩家与 NPC 互动时,NPC 总是会说相同的话。很无聊。使用变量更新哪个索引值使用。
每当玩家与 NPC 互动时,都会增加变量值 1 来显示下一行对话。
要跟踪当前索引,请添加一个名为 dialogueIndex 的变量。将变量设置为 1 以在数组列的开始时启动。
local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}local dialogueIndex = 1在 speak() 中,用 替换 变更 dialogueArray[2] 中的索引号为您创建的变量。
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)end在函数的底部,加入 1 到 dialogueIndex。下次 speak() 调用时,对话框将显示下一条字符串。
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)dialogueIndex += 1end测试并单击 NPC 以从数组列中的每个对话框看到所有对话框。
注意,当脚本到达阵数组的终端时,在 错误 窗口中出现。
你将在下一节中修复这个问题,以便对话框从最后一字符串后重新启动。
阵列大小
您可以使用阵列的大小来确定要将所需的索引重置为 1 的时间。找到一个阵列的 大小 通过输入 # ,无需空格,在数组列名称前。
例如:#dialogueArray
检查阵数组的大小与变量的当前值,以便知道变量是否准备好开始从头开始。
重新启动对话
使用阵列大小来检查回到第一个对话框的时间。
添加一个 if 声明,检查 if dialogueIndex 等同于 #dialogueArray 的总大小。如果是这样,请将 dialogueIndex 设置为 1。
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)if dialogueIndex == #dialogueArray thendialogueIndex = 1enddialogueIndex += 1end如果 dialogueIndex 不在最结束,它仍然应该添加 1 到 dialogueIndex 。在另一个声明下移动 dialogueIndex += 1 。
local function speak()local dialogue = dialogueArray[dialogueIndex]Chat:Chat(head, dialogue)if dialogueIndex == #dialogueArray thendialogueIndex = 1elsedialogueIndex += 1endend播放并确认您可以循环通过并重新启动对话框。
概要
数据结构是如何存储数据的集。 Lua 使用表来创建数据结构。 阵列是一个类型的表,可以容纳顺序列表的信息。 每个值在阵列中的索引号都由 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 = {"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)
排查提示
如果角色不通过对话框阵列,请尝试以下问题排解。
- 检查 if 声明, dialogueIndex 已将 1 设置为 1。在其他声明中,检查 dialogueIndex 的 1 增加了 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