เป็นวิธีที่ดีที่สุดในการใช้ระบบต้นไม้โต้ตอบในเกมของฉันได้อย่างไร ฉันต้องการ NPC เพื่อให้ผู้เล่นตอบชุดต่าง ๆ ซึ่งบางอย่างอาจปรากฏเฉพาะเมื่อผู้เล่นมีรายการหรือเหตุการณ์ก่อนหน้านี้เกิดขึ้น
เป็นวิธีที่ดีที่สุดในการใช้ระบบต้นไม้โต้ตอบในเกมของฉันได้อย่างไร ฉันต้องการ NPC เพื่อให้ผู้เล่นตอบชุดต่าง ๆ ซึ่งบางอย่างอาจปรากฏเฉพาะเมื่อผู้เล่นมีรายการหรือเหตุการณ์ก่อนหน้านี้เกิดขึ้น
คำตอบ:
ต้นไม้กล่องโต้ตอบควรทำได้โดยใช้ XML คุณจัดเก็บเงื่อนไขสำหรับการตอบสนองและการตอบสนองในต้นไม้ซ้อนกันโดยมีการอ้างอิงไปยังไฟล์สคริปต์หากคุณต้องการทำสิ่งที่ซับซ้อนมากขึ้น
คุณควรแยกสคริปต์และกล่องโต้ตอบออกจากกันโดยเฉพาะอย่างยิ่งถ้าคุณใส่ RPG ที่มีการสนทนาเป็นตัวชี้วัด จากนั้นคุณสามารถใช้ไลบรารีเช่น simpleXML เพื่ออ่านไฟล์ XML
มีคำถามที่คล้ายกันเกี่ยวกับ SO ด้วยตัวอย่าง: https://stackoverflow.com/questions/372915/game-logic-in-xml-files
ฉันจะดูการฝังภาษาสคริปต์เช่น lua หรือ ruby และการโต้ตอบโต้ตอบการเข้ารหัสในนั้น
ดังนั้นสคริปต์โต้ตอบอาจมีลักษณะดังนี้:
switch showDialog "Why don't you just leave me along!", "Okay", "But I found your dog!"
case 1:
showDialog "And stay gone!"
case 2:
if playerHasObject "dog"
showDialog "Thank you!"
else
showDialog "Liar!"
นอกจากนี้ยังทำงานได้ดีสำหรับการเข้ารหัส AI และสิ่งอื่น ๆ ที่มีประโยชน์ในการปรับแต่งในระหว่างเวลาทำงาน คุณยังสามารถเพิ่มเครื่องมือแก้ไขที่สร้างไว้ในแอปพลิเคชันของคุณที่สามารถเรียกใช้เมื่อทำงานในการดีบัก (หรือเป็นไข่อีสเตอร์)
ในเกมสเตนดาห์ลเราใช้เครื่องจักรสถานะ จำกัด เพื่อใช้งาน NPC
แผนภาพต่อไปนี้แสดงให้เห็นเป็นตัวอย่างเล็ก ๆ น้อย ๆ จากวิธีการเขียนเควสกวดวิชา
ที่จุดเริ่มต้น NPC อยู่ในสถานะว่างและอาจเดินไปรอบ ๆ ผู้เล่นสามารถเริ่มการสนทนาโดยพูดว่า "สวัสดี" และ NPC จะเข้าสู่การเข้าร่วม ในสถานะนี้จะตอบคำถามเกี่ยวกับ "งาน" ของเขาและเสนอเกม "ช่วย" บางเกม ผู้เล่นอาจร้องขอภารกิจและ NPC จะเข้าสู่สถานะ QUEST_OFFERED ที่รอให้ผู้เล่นยอมรับ ("ใช่") หรือปฏิเสธ ("ไม่")
เราได้กำหนดชุดของเงื่อนไขที่สามารถแนบกับช่วงการเปลี่ยนภาพ ยกตัวอย่างเช่นการทำเควสต์อาจทำได้ก็ต่อเมื่อมีPlayerHasItemWithHimConditionเท่านั้น
หลังจากดำเนินการเปลี่ยนภาพ NPC อาจพูดข้อความและ / หรือดำเนินการกระทำ คล้ายกับเงื่อนไขที่เราได้กำหนดชุดการกระทำที่นำกลับมาใช้ใหม่ได้เช่นEquipItemActionซึ่งใช้เพื่อมอบรางวัลภารกิจให้กับผู้เล่น
เงื่อนไขหลาย ๆ สามารถนำมารวมกันโดยใช้AndCondition , OrConditionและNotCondition โดยปกติจะมีการดำเนินการจำนวนมากที่ต้องทำเมื่อทำภารกิจเสร็จสิ้นดังนั้นจึงมีคลาสMultipleActionsเช่นกัน
ในขณะที่การปฏิบัติจริงในสเตนดาห์ลนั้นไม่ได้แปลเป็นภาษาอื่น (มนุษย์) อย่างง่ายดายฉันคิดว่าแนวคิดทั่วไปนั้นดี
คุณสามารถใช้เวลาดูที่Dlgeditเครื่องมือของเครื่องยนต์ RPG มาเปิดAdonthell มันทันสมัยมากและควรมีทุกสิ่งที่คุณต้องการ (รวมถึงแหล่งที่มา)
ฉันคิดว่าการเพิ่มในการแปลคุณยังคงสามารถใช้ XML สำหรับตรรกะดังกล่าวข้างต้นข้างต้นเมื่อคุณได้รับความซับซ้อนประเภทนั้นคุณควรเขียนเครื่องมือการสนทนาของคุณเอง ข้อความการสนทนาของคุณจะถูกเก็บไว้เป็นกุญแจสำคัญในฐานข้อมูลที่คุณสามารถสลับออกได้ขึ้นอยู่กับภาษาที่คุณต้องการแสดง
ตัวอย่างเช่นคุณอาจมี:
<dialogue id="101" condition="!npc.carsFixed">
<message>Localize.FixMyCar</message>
<choices>
<choice condition="hero.carFixingSkill > 5" priority="7" id="Localize.Sure">
<command>hero.carFixingSkills += 1</command>
<command>npc.carFixed = true</command>
<command>hero.playSmokeAnimation()</command>
<command>nextDialogue = 104</command>
</choice>
<choice condition="hero.carFixingSkill <= 5" id="Localize.CantFix">
<command>nextDialogue = 105</command>
</choice>
<choice id="Localize.FixYourself">
<command>npc.likesHero -= 1</command>
</choice>
</choices>
</dialogue>
จากนั้นคุณจะต้องมีเครื่องมือแสดงข้อความเควสแทน "Localize.FixMyCar" ด้วยข้อความที่แปลอย่างเหมาะสม
เครื่องมือของคุณจะแสดงสิ่งที่โปรแกรมเล่นจะเห็นในภาษาที่เลือกได้พร้อมกับ XML ดิบที่แก้ไขได้
ในทำนองเดียวกันคุณสามารถใช้สิ่งนี้จากตัวอย่างที่คุณอ้างอิง :
npc.add(ConversationStates.ATTENDING,
ConversationPhrases.QUEST_MESSAGES,
null,
ConversationStates.QUEST_OFFERED,
Localization[ "BringMeABeer" ],
null);
หากคีย์ของคุณมีความหมายเพียงพอที่จะไม่มีข้อความที่สมบูรณ์ควรเป็นปัญหา
สิ่งนี้จะเป็นประโยชน์เช่นกัน:
Localization[ "<Location>.<NPC_name>.<Dialogue_text_key>" ];
Data ขับเคลื่อนตัวละครของคุณด้วยสคริปต์ LUA หรือแม้แต่ไฟล์ XML เมื่อคุณโต้ตอบกับ NPC ให้คว้าไฟล์ที่แนบมากับมันอ่านมันปรับสำหรับตัวแปรเกมใด ๆ ที่อาจถูกเรียกใช้และผลิตภัณฑ์ตอบสนองที่ถูกต้อง
ประโยชน์ที่ใหญ่ที่สุดจากการทำเช่นนี้คือคุณสามารถเข้าไปข้างในและจัดการกับกล่องโต้ตอบเพิ่มตัวละครใหม่ ฯลฯ ได้อย่างง่ายดายนอกจากนี้คุณยังหลีกเลี่ยงการสร้างฐานรหัสด้วยตรรกะพิเศษในการจัดการแต่ละกรณี
หากคุณใช้ XML ตรวจสอบให้แน่ใจว่าคุณได้สร้างเครื่องมือขนาดเล็กเพื่อแก้ไขไฟล์ XML คุณจะบ้าไปแล้วอย่างอื่น
หากกล่องโต้ตอบของคุณมีความซับซ้อนใด ๆ สิ่งที่สำคัญที่สุดที่คุณต้องใช้ในการใช้งานกล่องโต้ตอบคือวิธีที่จะเข้าใจความซับซ้อนของการโต้ตอบของคุณ ฉันแนะนำตัวแก้ไข Node ให้เห็นภาพนี้แม้ว่าฉันจะไม่มีระบบเปิดที่ดีที่จะแนะนำ
ฉันคิดว่าคุณใช้ภาษาสคริปต์ของคุณเองในการกำกับเกมประเภทนี้ (ถ้าไม่ใช่คุณควร) จากนั้นขยายสคริปต์ของคุณเพื่อจัดการกับกล่องโต้ตอบ
คุณสามารถทำงานกับตัวแปรเกมอื่น ๆ ในระหว่างการสร้างตรรกะการโต้ตอบ เอ็นจิ้นของเกมเหมือนเลโก้ คุณตั้งโปรแกรมอิฐเท่านั้นและสคริปต์ใช้พวกเขา ไม่สำคัญว่าคุณจะทำการแปลสคริปต์หรือคอมไพเลอร์ แต่สคริปต์ก็มีประโยชน์เสมอ
หุ่นยนต์ง่าย ๆ อาจทำได้:
(dialogueline_id, condition) -> (next_id, response)
อาจมีลักษณะเช่นนี้:
(1, troll is hungry?) -> (2, say "troll be hungry")
(2, player has bananas?) -> (3, say "hey, you have bananas!")
(3, ) -> (-1, (say "i like bananas, i take them and eat, you may pass, bye", remove bananas, feed the troll))
(2, player does not have bananas?) -> (-1, say "go away!!!")
ในเกมคุณจะพบ id และพยายามจับคู่ id และเงื่อนไข
คุณต้องสร้างแบบจำลองเงื่อนไขและการกระทำ ตามวัตถุตัวชี้ฟังก์ชัน XML ...
โปรแกรมแก้ไขบทสนทนาที่ดีก็มีประโยชน์เช่นกัน