สารานุกรมเป็นตารางที่เชื่อมชื่อหรือ กุญแจ กับค่าแทนดัชนี
ตัวอย่าง:
คําสั่งของสารานุกรม Luau
local pet = {Name = "Bobbie",Type = "Dog",}
ใช้สารานุกรมเมื่อต้องการที่จะป้อนชื่อค่า ไม่ใช่แค่รายการพวกมันตามลําดับเหมือนที่อาร์เรย์ทําฝึกซ้อมการใช้สารานุกรมในบทแนะนำนี้โดยการปรับแต่งค่าที่เกี่ยวข้องกับผู้เล่น
คํากำหนดสัญลักษณ์ของสารานุกรม
เช่นเดียวกับอาร์เรย์ สารานุกรมจะถูกกำหนดให้กับตัวแปรด้วยเครื่องหมายเล็บคู่ {} คู่ค่ากุญแจ จะถูกเก็บไว้ในบรรทัดแยกต่อด้วยจุลภาคกุญแจและค่าสามารถเป็นชนิดข้อมูลใดก็ได้รวมถึงตัวอักษร ตัวเลข และชื่อแปร
local playerNames = {player1 = "Zap",player2 = "Kel",}print(playerNames["player1"])
เพื่ออ้างอิงชิ้นส่วนหรือวัตถุอื่นๆ เป็นกุญแจใช้เครื่องหมายเลขเล็กและเครื่องหมายลูกศร
local greenPart = workspace.GreenPartlocal redPart = workspace.RedPartlocal partList = {[greenPart] = true,[redPart] = false,}print(partList[redPart])
สร้างสารานุกรม
การใช้งานประจำวันของสารานุกรมคือการจัดระเบียบข้อมูลผู้เล่นหรือตัวละครขั้นตอนเหล่านี้สำรวจวิธีที่ข้อมูลตัวละครศัตรูทฤษฎีสามารถจัดเก็บและเข้าถึงได้
ในสคริปต์ใหม่ สร้างสารานุกรมที่ชื่อว่า enemy .
local enemy = {}คีย์แรกในสารานุกรมจะติดตามชื่อของศัตรูด้วยตัวแปรที่เรียกว่า Name
local enemy = {Name}กำหนดชื่อศัตรูให้กับกุญแจตามด้วยจุลภาค
local enemy = {Name = "Spike",}เพิ่มคู่คีย์-ค่าที่สองสำหรับจํานวนสุขภาพที่ศัตรูควรมี โปรดจําไว้ว่าคีย์ควรใช้ประเภทข้อมูลเดียวกันเสมอ แต่มูลค่าไม่จําเป็นต้อง
local enemy = {Name = "Spike",Health = 1000,}
ใช้ค่าของสารานุกรม
มีสองวิธีในการเข้าถึงค่าสารานุกรม:
- tableName["keyName"] (สำคัญ, โปรดสังเกตถึงคำอ้างอิง)
- tableName.keyName
local enemy = {Name = "Spike",Health = 1000,}print("The villain " .. enemy["Name"] .. " approaches!")print("The villain " .. enemy.Name .. " approaches!")
สไตล์ที่จะใช้มักจะขึ้นอยู่กับวัตถุประสงค์ของตารางสำหรับตารางที่เก็บคอลเลกชันของค่าเช่นรายชื่อผู้เล่นในเซิร์ฟเวอร์ coders มักจะใช้ tableName["keyName"]สำหรับสารานุกรมที่ใช้อธิบายวัตถุโค้ดเดอร์มีแนวโน้มที่จะใช้ tableName.keyName มากขึ้น
เปลี่ยนค่าของสารานุกรม
การเปลี่ยนค่าของกุญแจเป็นเช่นเดียวกับตัวแปรอื่น ๆ ใช้ตัวประกอบเท่ากัน =
ใต้ตาราง enemy ตั้งชื่อของศัตรูเป็นอย่างอื่น
local enemy = {Name = "Spike",Health = 1000,}enemy.Name = "Rana"print("The enemy's name is " .. enemy.Name)ทดสอบและตรวจสอบหน้าต่างเอาต์พุต
ตัวแปรที่มีอยู่แล้วเป็นกุญแจ
สารานุกรมสามารถโต้ตอบกับตัวแปรที่มีอยู่แล้วในส่วนอื่นๆ ของสคริปต์ได้ตัวอย่างการเขียนโค้ดต่อไปนี้ใช้ตัวแปรเพื่อเพิ่มชื่อผู้เล่นเป็นกุญแจเมื่อพวกเขาเข้าร่วมประสบการณ์แล้วจึงตั้งค่ามูลค่าจุดของพวกเขาเป็น 0
ใน ServerScriptService สร้างสคริปต์ใหม่ที่มีชื่อ PlayerPointsในสคริปต์ รับบริการผู้เล่นและสร้างสารานุกรมว่างเปล่าชื่อ playerPoints
local Players = game:GetService("Players")local playerPoints = {}เขียนฟังก์ชันท้องถิ่นเพื่อตั้งค่าจุดผู้เล่นด้วยพารามิเตอร์สําหรับตัวแปรผู้เล่นใหม่ เชื่อมฟังก์ชันกับอีเวนต์ Players.PlayerAdded
local playerPoints = {}local function setPoints(newPlayer)endPlayers.PlayerAdded:Connect(setPoints)ในฟังก์ชัน เพิ่มตัวแปรเพื่อรับ Name ของผู้เล่น คุณสมบัติในทุกวัตถุ ผู้เล่น และคำสั่งพิมพ์สำหรับการทดสอบ
local function setPoints(newPlayer)local name = newPlayer.Nameprint("hello " .. name)endใส่ name ลงในสารานุกรม playerPoints เป็นคีย์และตั้งค่ามูลค่า, แต้มของผู้เล่นเป็น 0
local function setPoints(newPlayer)local name = newPlayer.Nameprint("hello " .. name)playerPoints[name] = 0endใช้ name เพื่อพิมพ์ชื่อของผู้เล่นและ playerPoints[name] เพื่อพิมพ์ค่าของกุญแจที่ตรงกับตัวแปร
local function setPoints(newPlayer)local name = newPlayer.Nameprint("hello " .. name)playerPoints[name] = 0print(name .. " has " .. playerPoints[name] .. " points.")endดำเนินโครงการและสังเกตผลผลิต
สคริปต์เสร็จสิ้น
local Players = game:GetService("Players")
local playerPoints = {
}
local function setPoints(newPlayer)
local name = newPlayer.Name
print("hello " .. name)
playerPoints[name] = 0
print(name .. " has " .. playerPoints[name] .. " points.")
end
Players.PlayerAdded:Connect(setPoints)
ความท้าทายทางเลือก
ด้านล่างนี้เป็นความท้าทายบางอย่างที่ใช้กับการใช้สารานุกรมในรูปแบบที่แตกต่างกัน ดูว่าคุณสามารถสร้างโค้ดสำหรับเหล่านี้ได้หรือไม่
- สร้างส่วนกับดักที่สร้างความเสียหายเมื่อเวลาผ่านไปให้กับผู้เล่น เมื่อผู้เล่นสัมผัสกับกับดักแล้ว ทำความเสียหายให้กับพวกเขา รอ จากนั้นอนุญาตให้พวกเขาได้รับความเสียหายอีก
- สร้างฟังก์ชันที่ตรวจสอบว่าผู้เล่นสองคนใดมีแต้มมากที่สุดโดยการเข้าถึงสารานุกรม
- สร้างรหัสลับโดยสร้างระบบการแลกเปลี่ยนสตริงหนึ่งเพื่อสร้างรหัส "ลับ"ตัวอย่างเช่น ตัวอักษร "A" สามารถสลับกับ "G" หรือคำว่า "แอปเปิล" สามารถสลับกับ "สีส้ม" ได้
สารานุกรมและคู่()
pairs() เป็นฟังก์ชันที่มักใช้เพื่อเรียกซ้ำผ่าน สารานุกรม ตัวอย่างเห็นได้ด้านล่าง
local myDictionary = {["Blue Player"] = "Ana",["Gold Player"] = "Binh",["Red Player"] = "Cate",}for key, value in pairs(myDictionary) doprint(key .. " is " .. value)end
pairs() สามารถใช้เพื่อทำงานกับคีย์ ค่า หรือทั้งสองอย่างขององค์ประกอบสารานุกรมในลูป for ด้านล่างตัวแรกคือตัวแปรที่สำคัญตัวแปรที่สองคือค่าสารานุกรมที่คุณต้องการทำงานร่วมกับถูกส่งไปยัง pairs()
local inventory = {["Gold Bricks"] = 43,Carrots = 3,Torches = 2,}print("You have:")for itemName, itemValue in pairs(inventory) doprint(itemValue, itemName)end
เมื่อดำเนินการแล้วรหัสจะพิมพ์สิ่งต่อไปนี้:
You have:43 Gold Bricks3 Carrots2 Torches
บทสรุป
สารานุกรมเป็นตารางที่ใช้คู่คีย์-ค่าแทนค่าที่จัดเรียงแล้วสารานุกรมและอาร์เรย์เริ่มต้นคล้ายกันโดยการกำหนดเครื่องหมายเล็บคลาสให้กับตัวแปรให้รายการแยกออกจากกันด้วยจุลภาคที่แยก
คีย์ทั้งหมดภายในสารานุกรมควรใช้ประเภทข้อมูลเดียวกัน แต่ค่าสามารถผสมประเภทข้อมูลได้โดยไม่มีปัญหา
วิธีที่สามารถเข้าถึงสารานุกรมได้สามารถสื่อถึงวัตถุประสงค์ได้สารานุกรมของคุณสมบัติของศัตรูอาจจะถูกเข้าถึงด้วยตัวเลข dot ในขณะที่รายการชื่ออาจใช้ tableName[keyName]
เมื่อใช้เครื่องหมายการอ้างอิง โปรดระวัง; ชื่อกุญแจที่สร้างขึ้นภายในตารางต้องได้รับการปฏิบัติเป็นสตริง: tableName["keyName"]อย่างไรก็ตาม เมื่ออ้างถึงวัตถุเช่นชิ้นส่วน จะไม่จำเป็นต้องใช้การอ้างอิง: tableName[keyName]
สคริปต์จํานวนมากต้องผ่านสารานุกรมหรืออาร์เรย์ แต่คุณอาจไม่รู้เสมอเกี่ยวกับจุดเริ่มต้นและจุดสิ้นสุดของโครงสร้างข้อมูลเหล่านี้ตัวอย่างเช่น สารานุกรมของผู้เล่นอาจมีการเปลี่ยนแปลง หรือผู้เล่นอาจมีคลังสินค้าที่มีขนาดแตกต่างกัน
ในสถานการณ์เหล่านี้ คุณสามารถใช้ pairs() และ ipairs() ในลูป for เพื่อผ่านแต่ละองค์ประกอบโดยไม่มีจุดเริ่มต้นและจุดสิ้นสุดที่รู้จักคุณยังสามารถใช้การหมุนรอบทั่วไปผ่านคีย์วาร์ด in เพื่อหมุนผ่านองค์ประกอบโดยไม่จำเป็นต้องใช้ pairs() หรือ ipairs()