godot-พฤติกรรมต้นไม้
การใช้ GDScript ของแผนผังพฤติกรรมสำหรับ AI ของเกม โดยอิงตามโหนด Godot ดั้งเดิม และใช้โปรแกรมแก้ไขแผนผังฉากในตัว
รุ่น C # -> https://github.com/MadFlyFish/godot-behavior-tree-csharp
การติดตั้ง
- คัดลอกโฟลเดอร์ 'addons' ลงในไดเรกทอรีหลักของโครงการของคุณ
- เปิดใช้งานปลั๊กอินจากการตั้งค่าโปรเจ็กต์ จากนั้นรีสตาร์ท Godot ไม่เช่นนั้นจะไม่รู้จักคลาสใหม่ (นั่นเป็นข้อบกพร่องของเอ็นจิ้น)
- หรือคุณสามารถลากโฟลเดอร์ bt_example ลงในไดเร็กทอรีหลักของโปรเจ็กต์ของคุณได้
- หากต้องการดูตัวอย่างการทำงาน ให้รันฉาก agent.tscn ฉาก ex_behavior_tree.tscn คือตัวอย่างของวิธีการสร้างต้นไม้
คำแนะนำ:
- คลิกไอคอนการสร้างโหนด คุณควรเห็นโหนดใหม่พร้อมใช้งาน (หากไม่เห็น ให้รีสตาร์ท Godot) คุณต้องใช้ BehaviourTree เป็นโหนดรูท ซึ่งควรมีลูกเดียวเท่านั้น ลูกนี้สามารถเป็นโหนดใดก็ได้ภายใต้หมวดหมู่ BTNode ซึ่งทั้งหมดสืบทอดมาจากคลาส BTNode
- หลังจากสร้างแผนผังพฤติกรรมแล้ว คุณต้องระบุว่าใครเป็นเจ้าของ AI (ตัวแทน) และ Blackboard ใดที่ถูกใช้ สามารถวางกระดานดำได้ทุกที่ (เนื่องจากอยู่นอกต้นไม้) และแชร์ระหว่างต้นไม้ต่างๆ ได้ ระบบมีความยืดหยุ่นเพียงพอที่จะให้คุณตัดสินใจว่าจะอัปเดตข้อมูลกระดานดำของคุณอย่างไรและเมื่อใด ตัวอย่างเช่น คุณสามารถสร้างโหนดธรรมดาด้วยสคริปต์ที่จัดการการอัปเดตกระดานดำ เช่น ด้วยการเรียกกลับสัญญาณหรือแม้กระทั่งอยู่ในกระบวนการ () หรือคุณสามารถทำจากที่อื่นได้ แม้แต่จากภายในต้นไม้ เพียงแค่ต้องแน่ใจว่าได้ออกแบบสิ่งต่าง ๆ ในแบบที่คุณสามารถรักษาและติดตามได้
- แผนผังพฤติกรรมดำเนินการดำเนินการลูกๆ แต่ละตัว ซึ่งจะคืนสถานะความสำเร็จหรือความล้มเหลวบางประเภท เฉพาะสาขาที่ติดตามโหนดที่สำเร็จเท่านั้นที่จะถูกดำเนินการ BTNode ต้องส่งคืนความสำเร็จหรือความล้มเหลว และสามารถระงับการดำเนินการได้เฉพาะเมื่อมีการเรียกใช้ Yield() เท่านั้น หลังจากนั้นจะยังคงอยู่ในสถานะกำลังทำงานอยู่จนกว่าการดำเนินการจะเสร็จสิ้น เมื่อ BTNode อยู่ในสถานะกำลังทำงาน ทรีจะระงับการดำเนินการอย่างต่อเนื่อง (โดยมีข้อยกเว้นเดียวคือ BTParallel ) จนกว่ารายการย่อยทั้งหมดจะเสร็จสิ้นการดำเนินการ นี่คือเพื่อวัตถุประสงค์ในการเพิ่มประสิทธิภาพ
- การไหลของแผนผังถูกกำหนดโดยโหนดคอมโพสิตที่เรียกว่า: BTSequence, BTSelector, BTRandomSelector, BTRandomSequence, BTParallel ซึ่งทั้งหมดสืบทอดมาจาก BTComposite ลำดับจะสำเร็จหากรายการย่อยทั้งหมดประสบความสำเร็จ ในขณะที่จะล้มเหลวหากรายการย่อยรายการใดรายการหนึ่งล้มเหลว ตัวเลือกนั้นตรงกันข้ามกับตรรกะ โดยจะสำเร็จหากลูกหนึ่งสำเร็จ และจะล้มเหลวหากลูกทั้งหมดล้มเหลว การขนานจะวิ่งหนีเด็ก ๆ ทั้งหมดและประสบความสำเร็จเสมอโดยไม่ต้องรอให้เด็ก ๆ ดำเนินการจนเสร็จสิ้น โหนดคอมโพสิตฐานรันรายการย่อยทั้งหมดและประสบความสำเร็จเสมอ แต่ยังรอการดำเนินการให้เสร็จสิ้นด้วย
- การกระทำของพฤติกรรม AI ของคุณดำเนินการในโหนด BTLeaf เพิ่ม BTLeaf จากนั้นทำ 'ขยายสคริปต์' ตอนนี้คุณสามารถกำหนดพฤติกรรมของคุณเองในสคริปต์นี้ได้โดยการแทนที่เมธอด _ ขีด() การกระทำของคุณจะไปที่นี่ อย่าลืมอ่านความคิดเห็นในสคริปต์พื้นฐานเพื่อทราบแนวทางปฏิบัติที่ดีที่สุด โปรดจำไว้ว่า BTLeaf ไม่ควรมีลูก
- BTDecorator ใช้เพื่อปรับแต่งการทำงานของโหนดลูก พวกเขาสามารถมีลูกได้เพียงคนเดียวเท่านั้น
- BTConditional เป็นประเภทมัณฑนากรที่ใช้บ่อยที่สุด เพิ่ม BTConditional และขยายสคริปต์ จากนั้นแทนที่เมธอด _ pre_tick() เพื่อกำหนดเงื่อนไขที่ลูกจะถูกดำเนินการ ตรวจสอบให้แน่ใจว่าคุณอ่านความคิดเห็นเนื่องจากมีตัวอย่างที่เป็นประโยชน์อยู่ที่นั่น
- BTGuards เป็นอุปกรณ์ตกแต่งที่สามารถใช้เพื่อล็อคสาขาชั่วคราว หรือคุณสามารถกำหนดตัวปลดล็อคซึ่งจะแทนที่เวลาล็อคที่ระบุ นอกจากนี้ยังมีตัวเลือกในการกำหนดตู้เก็บของอีกด้วย BTGuards สามารถทำให้พฤติกรรมของคุณสมบูรณ์และตอบสนองได้ดี รวมถึงปรับให้เหมาะสม เนื่องจากพวกมันหลีกเลี่ยงการแตกแขนงและการทำซ้ำโดยไม่จำเป็น
- เครื่องมือตกแต่งอื่นๆ ช่วยให้คุณสามารถวนซ้ำการดำเนินการ ย้อนกลับผลลัพธ์ของเครื่องหมายถูก และอื่นๆ คุณสามารถทำอะไรได้มากมายโดยปรับแต่งการดำเนินการผ่านเครื่องมือตกแต่ง
- แนวปฏิบัติที่ดีคือการใช้โหนดที่ให้มาและปฏิบัติตามรูปแบบการออกแบบของแผนผังพฤติกรรม แต่เนื่องจากนี่เป็นการใช้งานโค้ดล้วนๆ โดยไม่มีโปรแกรมแก้ไขภาพ คุณจึงสามารถควบคุมการออกแบบได้มากและทำให้เกิดข้อผิดพลาดเล็กน้อย นี่เป็นเพียงสคริปต์ที่มีประโยชน์ซึ่งปฏิบัติตาม "แนวทางปฏิบัติที่ดี" บางประการ แต่ไม่ผูกมัดกับหลักเกณฑ์เหล่านี้ หากไม่ใช่สำหรับกฎพื้นฐานสองสามข้อ ขึ้นอยู่กับคุณที่จะตัดสินใจว่าคุณจะออกแบบแผนผังพฤติกรรมของคุณอย่างไร แต่โปรดจำไว้ว่าหากคุณใช้แผนภูมินี้ในทางที่ผิด คุณจะไม่ได้รับประโยชน์จากพลังของรูปแบบแผนผังพฤติกรรม (ตัวอย่างเช่น คุณสามารถใช้ BTNode พื้นฐานสำหรับทุกสิ่งและเพียงแค่ขยายมันทุกครั้ง แม้ว่ามันจะเละเทะก็ตาม)
- คุณอาจมีแผนผังพฤติกรรมขนาดใหญ่ แต่แนวทางปฏิบัติที่ดีที่สุดคือปฏิบัติตามปรัชญาองค์ประกอบของ Godot และสร้างแผนผังพฤติกรรมเล็กๆ หลายๆ แผนผังสำหรับแต่ละองค์ประกอบของฉากของคุณ ตัวอย่างเช่น ต้นไม้สำหรับตัวควบคุมการเคลื่อนไหวของคุณ ต้นไม้สำหรับตัวควบคุมอาวุธของคุณ ต้นไม้สำหรับส่วนประกอบผู้เบิกทางของคุณ ฯลฯ แผนผังพฤติกรรมสามารถมีกระดานดำได้เพียงกระดานเดียวเท่านั้น แต่กระดานดำเดียวกันสามารถใช้ได้กับต้นไม้หลายต้น ดังนั้นนี่คือ มีประโยชน์อย่างยิ่งหากคุณต้องการมีต้นไม้หลายต้นโดยไม่ต้องทำกระดานดำหลายอันด้วย โดยส่วนตัวแล้ว เหตุผลที่ฉันมีกระดานดำเป็นองค์ประกอบที่แยกออกจากกัน เป็นเพราะฉันต้องการทำให้กลุ่มศัตรูแบ่งปันข้อมูลเดียวกันแต่มีพฤติกรรมที่เป็นอิสระ ดังนั้น นี่จึงเป็นกรณีการใช้งานสำหรับสิ่งนี้ นอกจากนี้ ฉันมักจะมีองค์ประกอบหลายอย่างในตัวนักแสดงของฉัน และฉันต้องการใช้ฐานข้อมูลเดียวกันสำหรับแผนผังที่แตกต่างกัน