นั่นคือสิ่งที่เชื่อมต่อกับสิ่งที่และวิธีการย้ายระหว่างบรรทัดคำพูดเมื่อการสนทนาย่อยสิ้นสุดลง?
หากคุณมีตัวอย่างของแผนภูมิโต้ตอบพื้นฐานใน C # โปรดโพสต์ไว้
นั่นคือสิ่งที่เชื่อมต่อกับสิ่งที่และวิธีการย้ายระหว่างบรรทัดคำพูดเมื่อการสนทนาย่อยสิ้นสุดลง?
หากคุณมีตัวอย่างของแผนภูมิโต้ตอบพื้นฐานใน C # โปรดโพสต์ไว้
คำตอบ:
ชื่อ "ต้นบทสนทนา" เป็นบิตทำให้เข้าใจผิด - พวกเขามักจะกราฟระบุทิศทางที่เรียบง่ายไม่เพียง แต่ต้นไม้ โครงสร้างข้อมูลพื้นฐานของกราฟดังกล่าวมักจะประกอบด้วย "ข้อมูล" บางอย่างสำหรับโหนดซึ่งเป็นตัวแทนของจุดที่เราอยู่ในการสนทนาและการเชื่อมโยงจากพวกเขาไปยังโหนดอื่น ๆ ซึ่งเป็นตัวแทนของสิ่งที่ถูกพูดและทำโดยผู้เข้าร่วม และอาจมีเงื่อนไขให้ จำกัด การมองเห็นหรือสคริปต์เพื่อดำเนินการเพิ่มเติมต่างๆ โดยปกติหนึ่งในโหนดคือโหนดเริ่มต้นเริ่มต้น (ป้ายกำกับทั่วไปสำหรับที่คือ "ROOT", "START" และ "GREETING") และโหนดที่ไม่มีลิงก์ที่ถูกต้องซึ่งนำไปสู่การสิ้นสุดการสนทนา
ในกรณีส่วนใหญ่กราฟจะถูกแสดงในหน่วยความจำว่าเป็นรายการของNode
โครงสร้างข้อมูลแต่ละอันมี ID อย่างน้อยและรายการของLink
โครงสร้างข้อมูล0..n รายการสามารถเป็นแบบโลคัลกับ NPC หรือแบบโกลบอล กรณีที่สองเป็นที่ต้องการหากคุณมี NPC ทั่วไปจำนวนมากซึ่งสามารถพูดคุยเพื่อขอข้อมูลได้ แต่ไม่มีการสนทนาที่เฉพาะเจาะจงด้วยตนเอง ระบบจะค้นหาโหนดการสนทนาเริ่มต้นสำหรับ NPC โดยจดจำ ID เป็น ID การสนทนาปัจจุบันแสดงลิงก์ที่ถูกต้องในปัจจุบันสำหรับผู้เล่นที่จะเลือกจาก (หรือ "[การสนทนาสิ้นสุด]" หากไม่มีลิงก์ที่ถูกต้อง) และรอ อินพุต เมื่อผู้เล่นเลือกลิงค์เส้นสนทนาที่เกี่ยวข้องจะปรากฏขึ้นและสคริปต์ที่เกี่ยวข้องจะทำงาน
แทนที่จะมีกฎและเงื่อนไขที่ซับซ้อนในการเชื่อมโยงคุณสามารถรับโดยใช้ตัวแปรบูลีน "ที่ถูกต้อง" อย่างง่ายซึ่งสามารถเปลี่ยนได้จากสคริปต์ของลิงก์การสนทนาอื่น ๆ (รวมถึงค่าเริ่มต้นจากโหนดเริ่มต้น) หรือภายนอก กลไก โดยทั่วไปวิธีการนี้จะง่ายกว่า แต่เหมาะสำหรับเกมที่มีการสนทนาน้อยมากเนื่องจากจะย้ายตรรกะของ "การตอบสนองนี้จะเกิดขึ้นเมื่อใด" ห่างจากข้อมูลตอบกลับเอง
โปรดทราบว่าโครงสร้างที่ฉันอธิบายที่นี่แตกต่างจาก Byte56 เล็กน้อยในการที่โหนดไม่จำเป็นต้องมีสายการสนทนาใด ๆ ลิงก์สามารถมีได้ทั้งหมด ในตัวแปรพื้นฐานที่สุดสิ่งนี้แปลเป็นโครงสร้างต่อไปนี้
ต้นไม้โต้ตอบที่ถูกสร้างขึ้นด้วยโครงสร้างกราฟ
กราฟจะถูกสำรวจตามการตัดสินใจของผู้เล่น ตัวเลือกการโต้ตอบที่มีให้กับผู้ใช้นั้นมาจากขอบที่กำหนดเส้นทางไปยังโหนดการโต้ตอบอื่น ๆ
กราฟกำกับเป็นโครงสร้างข้อมูลพื้นฐาน สามารถนำไปใช้ได้อย่างง่ายดายและคุณอาจต้องการนำไปใช้ด้วยตนเอง เนื่องจากคุณต้องการปรับกราฟตามความต้องการของกล่องโต้ตอบ
บางโหนดอาจต้องมีเงื่อนไขพิเศษเพื่อให้ปรากฏขึ้น ตัวอย่างเช่นผู้เล่นจะต้องใช้ทักษะในการพูดข้างต้น X หรือผู้เล่นจะต้องเสร็จสิ้นภารกิจ Z ก่อนที่พวกเขาจะสามารถดำเนินการโต้ตอบหนึ่งสาขา หรือพวกเขาต้องถามบางสิ่ง 4 ครั้งก่อนที่ NPC จะพูดคุยกับพวกเขา คุณสมบัติเหล่านี้จะถูกกำหนดให้กับเกมของคุณ แต่น่าจะพูดถึงเมื่อคุณใช้โหนดและการข้ามผ่านขอบ แน่นอนว่ามันเป็นการดีที่สุดที่จะเริ่มต้นด้วยรูปแบบที่ง่ายที่สุดและสร้างขึ้นจากที่นั่น
ฉันได้สร้างระบบ dialogtree ง่าย ๆ : http://iki.fi/sol/d3/ ตัว "engine" นั้นเป็นธรรมดา c แต่ข้อมูลที่ผลิตโดยโปรแกรมแก้ไขนั้นค่อนข้างใช้งานง่ายในภาษาใด ๆ เครื่องมือเอาต์พุต XML, JSON และรูปแบบไบนารีที่กำหนดเอง
แนวคิดหลักเรียบง่าย:
แต่ละโหนด (ที่ฉันเรียกว่า "การ์ด" เช่นเดียวกับอะนาล็อกข้างต้น) ของกล่องโต้ตอบประกอบด้วยข้อความคำถามและคำตอบที่เป็นศูนย์หรือมากกว่า คำตอบแต่ละข้อนำไปสู่การ์ดใบใหม่
นอกจากนี้ยังมีระบบแท็กที่แสดงคำตอบบางอย่างแก่ผู้ใช้เฉพาะเมื่อมีการตั้งค่าแท็ก (หรือไม่ได้ตั้งค่าแท็ก) การป้อนแท็กที่ระบุชุด (หรือ unsets) บัตร
นี่คือทุกสิ่งที่เราต้องการทำในบทสนทนาใด ๆ ในเกม "ข้อความคำถาม" อาจเป็นข้อความธรรมดาหรืออาจเป็นสคริปต์ในการขับเคลื่อนภาพเคลื่อนไหวหรืออะไรก็ตาม
คุณสามารถใช้ TreeSharp และต้นไม้พฤติกรรมเพื่อสร้างแบบจำลองระบบการสนทนา TreeSharp เป็นห้องสมุดที่ให้การใช้งานต้นไม้อย่างง่าย IA บอทสำหรับว้าวเสร็จแล้วด้วยดังนั้นมันจึงเป็นผู้ใหญ่ ... :)
การใช้งานของฉันมีโหนดที่ให้เลือกระหว่างคำตอบและแต่ละคำตอบสามารถเข้าร่วมกับการสนทนา othe หรือการกระทำหรือลำดับของการกระทำหรือโหนดที่ช่วยให้ไปที่กล่องโต้ตอบอื่น ... หรือสิ่งที่คุณต้องการ ...
ฉันใช้เครื่องมือแก้ไขอัจฉริยะเพื่อทำให้มองเห็น ... แต่ท้ายที่สุดมันสร้างรหัส c # ตาม treesharp ...
คุณต้องการกราฟกำกับ (อาจเป็นวงกลม)
คุณต้องการสร้างแบบจำลองโหนดเป็นวัตถุและลูกศรที่ส่งออกทั้งหมดในโหนดของกราฟนั้นถูกสร้างแบบจำลองเป็นวัตถุแยกต่างหากเช่นกัน โหนดมีรายการลูกศรที่ส่งออกและวัตถุ "ลูกศร" แต่ละอันมีข้อความที่จะแสดงและการอ้างอิงไปยังปลายทาง ไม่แน่ใจ แต่ฉันคิดว่าในวัตถุ C # นั้นมีการอ้างอิงอยู่เสมอดังนั้นคุณเพียงแค่สร้างวัตถุก่อนจากนั้นเมื่อคุณสร้างวัตถุลูกศรให้เสียบวัตถุเดียวกันลงในช่องปลายทางของลูกศรสองตัว (ใน C ++ คุณต้องใช้การอ้างอิงหรือประเภทตัวชี้ Node & หรือ Node *)
สำหรับการโหลดสิ่งต่าง ๆ เช่นนี้จากดิสก์มักจะให้หมายเลข ID ที่ไม่ซ้ำกันในแต่ละโหนดจากนั้นโหลดโหนดทั้งหมดลงในอาร์เรย์ที่ดัชนีเป็นหมายเลขเฉพาะ จากนั้นลูกศรจะถูกจัดลำดับโดยการเขียนตัวเลขไม่ใช่วัตถุจริง
เมื่อคุณโหลดลูกศรคุณจะใช้อาร์เรย์และ ID เพื่อรับการอ้างอิงไปยังโหนดที่ชี้ไป หากคุณเขียนวัตถุออกมาสองครั้งคุณจะได้รับวัตถุสองชิ้นแยกกันที่ดูเหมือนกันซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ
การประมวลผลแผนผังต้นไม้กลายเป็นเรื่องง่ายมาก คุณเพียงแค่ใส่รูทโหนดในcurrentNode
ตัวแปรแสดงทุกสิ่งอย่างใดอย่างหนึ่งจากนั้นเมื่อมีการเลือกให้ตั้งค่าrootNode
เป็นปลายทางของลูกศร ใน pseudocode:
Node& currentNode = dialogTree.node[0];
while( currentNode != END_CONVERSATION_PSEUDO_NODE )
{
stage.displayNode( currentNode );
currentNode = stage.waitForUserToChoose();
}
เมื่อเร็ว ๆ นี้ฉันต้องพัฒนาบางอย่างเช่นนี้โดยใช้ Node และเลือกโครงสร้างไฟล์ข้อความพื้นฐานเพื่อแสดงกราฟกำกับของโหนดการสนทนา
คุณสามารถดูโค้ดผลลัพธ์และรูปแบบข้อความได้ที่:
https://github.com/scottbw/dialoguejs
มันไม่รองรับเงื่อนไขหรือทริกเกอร์เหตุการณ์ (ยัง) แต่อาจง่ายพอที่จะเริ่มต้นด้วย devs เกมจำนวนมาก
(รหัสตัวเองใน GPL, btw)
dialog-tree
แท็ก