介绍阵列

*此内容使用人工智能(Beta)翻译,可能包含错误。若要查看英文页面,请点按 此处

数据结构 是如何存储和组织整个数据集的方式。在 Lua 中,数据结构通过表创建。 可以容纳任何数值。

本文涵盖使用 阵列 ,具体表类输入,创建一个会话角色。

桌子

桌子 是数据类型,可以持有多个值。与其他数据类型不同,桌子不具有固定大小,可以容纳多种不同的值类型。 使用桌子,您可以在玩家的库存中存储物品或创建千上千名玩家的名称列表。

阵列

有多种类型的表。其中一个类型是一个 阵列 ,它存储列在特定顺序中。要创建一个阵数组,请创建一个变量并将其分配为上下文符号 { } 。在下列子集中与上下文符号分开:

local myArray = {"item1", "item2", 10, workspace.Part, myVariable}

创建一个会话角色

要探索阵列,您将使用一个非玩家角色(NPC),当单击时,会显示一条不同的对话框。

此项目将使用预制的 NPC 模型,其中包括部分脚本和提示探测器,但缺少对话。

  1. 下载模板 NPC。

  2. 在 Explorer 中,右击 工作区 > 从文件中插入 并选择下载的文件。

编写对话框阵列

这些步骤使用阵列存储不同的语句,供玩家与 NPC 交互时使用。

  1. Explorer 中,去 NPC > ProximityPrompt > ChatManager。

  2. 在ChatManager,脚本中标记的地方,创建一个 空白阵列 来存储对话选项。


    -- 使用对话框时循环聊天
    local Chat = game:GetService("Chat")
    local prompt = script.Parent
    local npc = prompt.Parent
    local characterParts = npc.CharacterParts
    local head = characterParts.Head
    -- 在此添加阵列
    local dialogueArray = {}
    local function speak()
    local dialogue = "I've got one thing to say!"
    Chat:Chat(head, dialogue)
    end
    prompt.Triggered:Connect(speak)
  3. 在刚刚创建的阵列中,在 {} 之前,输入至少三个和话。


    local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}

使用阵列索引

在列表中的每个值都有一个 index 号。索引是根据值在存储的顺序分配的。第一个值是在索引 1 ,第二个是在索引 2 ,然后继续。

一些编程语言,例如 Java ,在 0 开始索引。

在刚刚创建的阵列中,"Hi" 在索引 1 ,"Goodbye!" 在索引 3 。

索引
1您好
2今天是个很棒的一天!
3再见!

使用特定的索引值

使用索引值将特定对话分配给 NPC。要使用特定索引值,请在数组列名后直接添加索引,例如 dialogueArray[1]

  1. dialogue 变量的默认值为索引 2 。


    local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}
    local function speak()
    local dialogue = dialogueArray[2]
    Chat:Chat(head, dialogue)
    end
  2. 播放测试并单击 NPC。第二个阵列值应该出现在聊天泡泡中。尝试将代码更改以测试表中每个值。

改变对话框线

当玩家与 NPC 互动时,NPC 总是会说相同的话。很无聊。使用变量更新哪个索引值使用。

每当玩家与 NPC 互动时,都会增加变量值 1 来显示下一行对话。

  1. 要跟踪当前索引,请添加一个名为 dialogueIndex 的变量。将变量设置为 1 以在数组列的开始时启动。


    local dialogueArray = {"Hi!", "Do I know you?", "Goodbye!"}
    local dialogueIndex = 1
  2. speak() 中,用 替换 变更 dialogueArray[2] 中的索引号为您创建的变量。


    local function speak()
    local dialogue = dialogueArray[dialogueIndex]
    Chat:Chat(head, dialogue)
    end
  3. 在函数的底部,加入 1 到 dialogueIndex。下次 speak() 调用时,对话框将显示下一条字符串。


    local function speak()
    local dialogue = dialogueArray[dialogueIndex]
    Chat:Chat(head, dialogue)
    dialogueIndex += 1
    end
  4. 测试并单击 NPC 以从数组列中的每个对话框看到所有对话框。

注意,当脚本到达阵数组的终端时,在 错误 窗口中出现。

你将在下一节中修复这个问题,以便对话框从最后一字符串后重新启动。

阵列大小

您可以使用阵列的大小来确定要将所需的索引重置为 1 的时间。找到一个阵列的 大小 通过输入 # ,无需空格,在数组列名称前。

例如:#dialogueArray

检查阵数组的大小与变量的当前值,以便知道变量是否准备好开始从头开始。

重新启动对话

使用阵列大小来检查回到第一个对话框的时间。

  1. 添加一个 if 声明,检查 if dialogueIndex 等同于 #dialogueArray 的总大小。如果是这样,请将 dialogueIndex 设置为 1。


    local function speak()
    local dialogue = dialogueArray[dialogueIndex]
    Chat:Chat(head, dialogue)
    if dialogueIndex == #dialogueArray then
    dialogueIndex = 1
    end
    dialogueIndex += 1
    end
  2. 如果 dialogueIndex 不在最结束,它仍然应该添加 1 到 dialogueIndex 。在另一个声明下移动 dialogueIndex += 1


    local function speak()
    local dialogue = dialogueArray[dialogueIndex]
    Chat:Chat(head, dialogue)
    if dialogueIndex == #dialogueArray then
    dialogueIndex = 1
    else
    dialogueIndex += 1
    end
    end
  3. 播放并确认您可以循环通过并重新启动对话框。

概要

数据结构是如何存储数据的集。 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