การออกแบบตามส่วนประกอบ / เอนทิตี + พฤติกรรมต้นไม้ => วิธีการรวม?


9

สำหรับโครงการปัจจุบันของฉันฉันดำเนินการองค์ประกอบระบบ / นิติบุคคลตามพื้นต่อไปมากที่สุดของการปฏิบัติที่ดีที่สุดที่มีอยู่ในนี้พื้นที่ค่อนข้างไม่ได้กำหนด

ดังนั้นฉันจึงได้ (ขยายออกไปเล็กน้อย) เอนทิตีซึ่งโดยทั่วไปแล้วจะเป็นintID, ชื่อที่มนุษย์อ่านได้, std::mapของคอมโพเนนต์และlong"ตัวบ่งชี้ประเภท" ซึ่งใช้เพื่อแสดงองค์ประกอบที่มีอยู่ (ฉันมีพลังสองenumสำหรับองค์ประกอบทั้งหมด ประเภทและเมื่อใดก็ตามที่มีการเพิ่มองค์ประกอบลงในเอนทิตีฉันจะแก้ไขความยาวนั้นโดยอัตโนมัติผ่านการดำเนินการระดับบิตเปรียบเทียบคำตอบนี้ )

จากนั้นมีส่วนประกอบซึ่งค่อนข้างง่าย: intID enumเป็นประเภทส่วนประกอบตัวชี้ Entity หลักและstd::mapคุณสมบัติทั้งหมดที่มีอยู่ในคอมโพเนนต์นี้

ในที่สุดระบบ / ผู้จัดการที่จัดการกับการประมวลผลเชิงตรรกะ พวกเขาตรวจสอบก่อนว่า Entity ที่ประมวลผลในปัจจุบันมีการจับคู่long"type indicator" = ส่วนประกอบที่จำเป็นทั้งหมดสำหรับระบบนั้นมีอยู่หรือไม่ จากนั้นจะเข้าถึงคุณสมบัติบางอย่างถ้าจำเป็นและเรียกใช้ฟังก์ชันบางอย่างโดยตรงในองค์ประกอบที่เกี่ยวข้องหรือส่งข้อความบางอย่าง (ผ่านตัวแจกจ่ายข้อความ)

Bottom-line:จนกระทั่งถึงที่นี่เป็นส่วนประกอบที่ขับเคลื่อนด้วยเหตุการณ์ / ระบบเอนทิตีที่เป็นมาตรฐานมากกว่ารวมกับวิธีการที่ขับเคลื่อนด้วยข้อมูล (เปรียบเทียบส่วนประกอบไม่ได้มีตัวแปรข้อมูลที่มีรหัสตายตัว แต่เป็นแผนที่ทั่วไปแทน (บางส่วน) / archetypes ของส่วนประกอบจะถูกอ่านจากไฟล์ที่มีตัวเลือกในการเพิ่มข้อมูลเพิ่มเติมซึ่งไม่ได้เป็นส่วนหนึ่งของรหัสส่วนประกอบจริง

ตอนนี้ฉันอยากจะแนะนำBehavior Trees (อิงจากAiGameDev BTSK ) ในโครงการนั้น แต่ฉันไม่แน่ใจว่าควรเชื่อมโยงกับส่วนประกอบที่มีอยู่แล้วหรือไม่หรือจะรวมการออกแบบเหล่านั้นเข้าด้วยกันอย่างไร

แนวคิด / คะแนน / คำถามที่เกี่ยวข้องหลายประการอยู่ในใจ:

  1. BT ของฉันจะถูกอ่านจากไฟล์ (อีกครั้ง) ขณะนี้ฉันมีเวลายากที่จะเห็นว่าฉันจะทำให้การเชื่อมต่อระหว่างBT Actionต้นไม้และการเขียนโปรแกรมจริงของฉันดีที่สุดได้อย่างไร ฉันควรสร้างแผนผังบางส่วนระหว่างชื่อแอ็คชันที่ใช้ในไฟล์ BT และตัวชี้ฟังก์ชันเพื่อการใช้งานจริงหรือไม่? อะไรคือวิธีปกติในการแก้ปัญหานั้น

  2. ฉันคิดว่าฉันจะต้องสร้าง BT สำหรับEntityประเภทที่แตกต่างกันทั้งหมดของฉัน(ดังนั้นสำหรับการรวมกันของส่วนประกอบเกมที่เกี่ยวข้องกับ AI / AI ตามที่ระบุโดยหลายครั้งที่ฉันกล่าวถึง ดังนั้นจึงไม่มีความเหมาะสมที่จะนำการBT Actionติดตั้งไปใช้ในส่วนประกอบเนื่องจากส่วนประกอบส่วนใหญ่มีแนวโน้มที่จะมีส่วนร่วมต่อการกระทำใช่ไหม

  3. ดังนั้นBT Actionตรรกะควรอยู่ในระบบที่แยกจากกัน (ซึ่งเป็นวิธีการที่แผนที่จากความคิดที่ # 1 ชี้ไปที่) จากนั้นระบบจะตรวจสอบlong"ตัวบ่งชี้ประเภท" ของฉันว่าEntityมีการตรวจสอบ BT หรือไม่และได้รับคำสั่งให้ดำเนินการบางอย่าง (= เมธอดในระบบ) ได้รับอนุญาตให้ทำเช่นนั้นจริง (= มีองค์ประกอบที่จำเป็น) แต่ถ้าไม่ใช่ (เพราะตัวอย่างเช่นผู้สร้าง BT มองข้ามสถานการณ์ที่เฉพาะเจาะจงซึ่งองค์ประกอบที่จำเป็นอาจไม่ได้แนบกับ Entity ตอนรันไทม์อีกต่อไป) จะไม่มีอะไรเกิดขึ้น

คำถาม:

  • มีแนวคิดที่พิสูจน์แล้วสำหรับการรวมประเภทนั้นหรือไม่?
  • สิ่งที่คุณใช้ใน 3 คะแนนของฉันคืออะไร?
  • มีสิ่งอื่นใดอีกบ้างที่นึกถึงอีกทั้งเกี่ยวกับการออกแบบส่วนประกอบ / เอนทิตีของฉัน

จุดที่ 1: ต้นไม้พฤติกรรมไม่มีอะไรมากไปกว่าภาพ DSL ที่ใช้เป็นหลักในการสร้างพฤติกรรมของตัวละคร องค์ประกอบ BehaviorTree ไม่ควรทำอะไรมากหรือน้อยกว่าองค์ประกอบสคริปต์จะทำ จุดที่ 3: อะไรคือสาเหตุของการใช้แผนที่เหนือเขตข้อมูลปกติ
Eric

# 1: "DSL" หมายถึงอะไรในบริบทนี้ # 3: ขออภัย แต่ฉันไม่สามารถติดตามคุณได้ โปรดอธิบายสิ่งที่คุณหมายความว่าอย่างไร
ฟิลิปออลไกเออร์

1
อาจเป็นภาษาเฉพาะของโดเมนเช่น ไวยากรณ์ที่กำหนดเองเพื่อทำงานกับปัญหาที่เฉพาะเจาะจงมาก
แพทริคฮิวจ์

Patrick ถูกต้องแม้ว่า semantics จะเป็นส่วนหนึ่งของมันและ "มาก" อาจถูกลบออกจากคำจำกัดความนี้ - Re 3: คำขอโทษของฉันควรอ่านได้: "สาเหตุของการใช้แผนที่เหนือฟิลด์ปกติในส่วนประกอบคืออะไร"
Eric

Re 3: ฉันต้องการความสามารถในการระบุคุณสมบัติเพิ่มเติมในภายหลังแบบไดนามิกนอกรหัส C ++ (buzzword: data-driven) เพื่อความง่ายฉัน (อย่างน้อยตอนนี้) วางคุณสมบัติทั้งหมดในกรอบทั่วไปนี้ (ใช้แผนที่) แม้กระทั่งผู้ที่แก้ไขในรหัสและด้วยเหตุนี้อาจเป็นเขต C ++ จริง อาจต้องกลับมาทบทวนอีกครั้งในภายหลังหากมันกลายเป็นปัญหาด้านประสิทธิภาพ ...
Philip Allgaier

คำตอบ:


2

ขณะนี้ฉันมีเวลายากที่จะเห็นว่าฉันจะทำให้การเชื่อมต่อระหว่าง BT Action ในต้นไม้นั้นดีที่สุดและการเข้ารหัสที่แท้จริงในแอปพลิเคชันของฉันได้อย่างไร ฉันควรสร้างแผนผังบางส่วนระหว่างชื่อแอ็คชันที่ใช้ในไฟล์ BT และตัวชี้ฟังก์ชันเพื่อการใช้งานจริงหรือไม่? อะไรคือวิธีปกติในการแก้ปัญหานั้น

ลืมเกี่ยวกับพอยน์เตอร์ของฟังก์ชันและคิดถึงวัตถุ แต่ละโหนดในแผนผังพฤติกรรม (BT จากจุดนี้เป็นต้นไป) จะสอดคล้องกับวัตถุหนึ่งในรหัสของคุณ วัตถุเหล่านั้นจะมีอินเทอร์เฟซมาตรฐานเพื่อให้คุณจัดเรียงเป็นต้นไม้และสำหรับการสำรวจภายใน ชุดพอยน์เตอร์ของฟังก์ชั่นนั้นใช้ได้ดีกับพฤติกรรม แต่มันไม่ได้จับโครงสร้างของต้นไม้ของคุณเลย

ดังนั้นจึงไม่มีความเหมาะสมที่จะนำการใช้งาน BT Action ไปใช้ในส่วนประกอบเนื่องจากส่วนประกอบส่วนใหญ่น่าจะเกี่ยวข้องกับการกระทำต่อไปใช่ไหม?

ฉันคาดหวังให้เอนทิตีมีส่วนประกอบ BehaviorTree เดียวที่เก็บข้อมูลที่เกี่ยวข้องสำหรับ BT ของเอนทิตีนั้น การดำเนินการของ BT สามารถทำได้โดย BT Component หรือ BT Subsystem ขึ้นอยู่กับว่าคุณจัดการส่วนประกอบในระบบของคุณอย่างไร เช่นเดียวกับทุกอย่างที่ใช้ส่วนประกอบพวกเขาจะต้องอ้างถึงส่วนประกอบอื่น ๆ เพื่อให้งานสำเร็จ แต่ส่วนประกอบอื่น ๆ นั้นไม่จำเป็นต้องรู้อะไรเกี่ยวกับ BT

การกระทำที่แตกต่างกันในระดับที่ง่ายที่สุดนั้นจะถูกเข้ารหัสในวัตถุโหนด BT ต่างๆ พวกเขาควรจะสามารถทำให้กิจการที่เกี่ยวข้องดำเนินการโดยจัดการส่วนประกอบตามที่จำเป็นเช่น เข้าถึงส่วนประกอบการเคลื่อนไหวเพื่อย้าย


ย่อหน้า # 1: ใช่ BT เองจะเป็นวัตถุ (อย่างที่ฉันพูดเหมือนเวอร์ชั่นจาก AiGameDev) ฉันแค่คิดถึงฟังก์ชั่นการทำงานของตัวเอง แต่ย่อหน้าที่ 2 ของคุณเปลี่ยนไป ด้วยเหตุผลบางอย่างวิธีนี้ง่าย ๆ ไม่เคยเกิดขึ้นกับฉัน (Entity มีอินสแตนซ์ของสมาชิก BT ของตัวเอง) อาจเป็นเพราะส่วนประกอบใหม่ทั้งหมดฉันไม่ได้คิดอย่างตรงไปตรงมาและเรียบง่ายอีกต่อไปดังนั้นฉันจึงมองหาวิธีผสมผสานส่วนประกอบกับสิ่งของ BT แต่ไม่จำเป็นต้องใช้แน่นอน
ฟิลิปออลไกเออร์

สิ่งสำคัญที่ฉันแพ้ในก่อนหน้านี้คือวิธีเชื่อมต่อการดำเนินการกับเอนทิตี ตอนนี้มันชัดเจน: การกระทำรู้เอนทิตี้ผ่านต้นไม้ของมันซึ่งในทางกลับกันรู้เอนทิตี้ของมัน
ฟิลิปออลไกเออร์

@Philip Allgaier ฉันอยากรู้อยากเห็นคุณสร้างโหนด BT ได้อย่างไร คุณสร้างมันเป็น 1 behavior node = 1 entity (ซึ่งจะเป็นเอนทิตีจำนวนมากต่อวัตถุ 1 เกม) หรือสร้างโหนดเป็นคลาสปกติ (ไม่เกี่ยวข้องกับ ECS) หรือใช้วิธีอื่น ๆ ? ขอบคุณ!
cppBeginner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.