โครงสร้างข้อมูล เป็นวิธีที่นักเขียนโปรแกรมจัดเก็บและจัดระเบียบันทึกชุดข้อมูลทั้งหมด ใน Lua โครงสร้างข้อมูลสร้างขึ้นด้วยตาราง ตาราง สามารถรองรับค่าใด ๆ ได้
บทความนี้ใช้ แมทริค พิมพ์
ตาราง
ตาราง เป็นข้อมูลชนิดที่สามารถรองรับมากขึ้นหลายค่า ในขณะที่ข้อมูลชนิดอื่น ๆ ที่เก็บค่าเดียว ตารางไม่มีขนาดตารางที่ติดตั้งไว้และสามารถรองรับผสมของข้อมูลชนิ
รายการ
มีลักษณะที่แตกต่างกันของตาราง หนึ่งประเภทคือ รายการ ซึ่งเก็บรายการของมูลค่าในลำดับที่กำหนด เพื่อสร้างรายการให้สร้างแป้นของตารางและกำหนดค่าด้วยเครื่องหมาย
local myArray = {"item1", "item2", 10, workspace.Part, myVariable}
การสร้างตัวละครที่พูดคุย
เพื่อสำรวจรายการ คุณจะทำงานกับตัวละครที่ไม่สามารถเล่นได้ (NPC) ซึ่งเมื่อคลิกจะแสดงให้เห็นถึงแถวของบรรทัดที่แตกต่างกัน
โครงการนี้จะใช้แม่พิมพ์ NPC สร้างแล้วซึ่งรวมถึงสคริปที่ส่วนหนึ่งและตรวจจับโปรมปต์ แต่ขาดการแสดงความคิดเห็น
ใน Explorer นำ NPC โดยการคลิกขวาที่ พื้นที่ทํางาน > ดาวน์โหลดจากไฟล์ และเลือกไฟล์ที่ดาวน์โหลด
การเขียนรายการสนทนา
ขั้นตอนเหล่านี้ใช้แผงค่าเพื่อเก็บคำต่างๆ ให้ 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!"}
การใช้ดัชนีรายการ
แต่ละค่าใน mat阵ได้รับเลข index ตัว รหัสดัชนีถูกกำหนดให้กับค่าในลำดับที่รหัสถูกเก็บไว้ ค่าแรกอยู่ที่ดัชนี 1 ค่าที่สองอยู่ที่ดัชนี 2 และเป็นต่อไป
ภาษาบางตัวอย่างเช่น Java เริ่มดัชนีที่ 0
ในรายการที่เพิ่งสร้างขึ้น "Hi" อยู่ที่ดัชนีที่ 1 และ "Goodbye!" อยู่ที่ดัชนีที่ 3
ดัชนี | มูลค่า |
---|---|
1 | สวัสดี |
2 | วันนี้เป็นวันที่ดี! |
3 | ลาก่อน! |
ใช้ค่าดัชนีที่กำหนดเฉพาะ
ใช้ค่าดัชนีเพื่อกำหนดชิ้นส่วนบางส่วนของ对话กับ NPC ในการใช้ค่าดัชนีที่เฉพาะเจาะจงให้กับ 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 ให้เพิ่มมูลค่าตัวแปรโดย 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 และตรวจสอบว่า 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 ในประโยคอื่น ตรวจสอบว่า dialogueIndex มี 1 เพิ่มเติมที่ตัวเอง
- เมื่อได้ขนาดของค่าย่อมักจะมีช่องว่างหลังจากเลขที่อยู่ใน # ใน #dialogueArray
ความท้าทายที่อาจเกิดขึ้น
ลองท้าทายหนึ่งในต่างๆ ด้านล่าง
- เขียนสคริปต์ให้นักพูดคุยของ NPC ไปย้อนกลับผ่านแมทริค ดัชนีการพูดคุยควรเริ่มต้นที่แมทริคและลบออกแทนที่จะเพิ่ม
- แทนที่จะแสดงบทสนทนาในลำดับ ให้ NPC แสดงบทสนทนาแบบสุ่มในแต่ละครั้งโดยใช้ Random.new() ตัวอย่างสคริปต่อไปนี้รวมอยู่ด้านล่างเพื่ออ้างอิง
local randomGenerator = Random.new()
-- แสดงการแสดงความคิดเห็นใหม่เมื่อ PNJ คลิก
local function speak()
local randomIndex = randomGenerator:NextInteger(1, #dialogueArray)
local dialogue = dialogueArray[randomIndex]
Chat:Chat(head, dialogue)
end