資料結構 是儲存和組織整個資料集的方式。在 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 時重設所需的索引。找到陣列的大小 size ,在陣列的名稱前,無論是空格。
例如:#dialogueArray
與變量的當前值對陣的大小進行測試,以確定開始時是否需要從頭開始。
正在重新啟動對話框
使用陣列尺寸來檢查時間是否到達回到第一個對話框的時間。
添加 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)
排障提示
如果角色沒有通過對話框陣列,請嘗試以下的疑難排解提示。
- 在 else 條碼中,檢查 dialogueIndex 是否設為 1。在其他條碼中,檢查 dialogueIndex 是否添加了 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