ลงทะเบียนส่วนประกอบเกมวัตถุในระบบย่อยเกม? (การออกแบบวัตถุเกมตามส่วนประกอบ)


11

ฉันกำลังสร้างระบบเกมวัตถุ component-based เคล็ดลับบางอย่าง:

  1. GameObjectComponentsเป็นเพียงรายการ
  2. GameSubsystemsมี ยกตัวอย่างเช่นการแสดงผลฟิสิกส์ ฯลฯ แต่ละมีตัวชี้ไปยังบางส่วนของGameSubsystem เป็นนามธรรมที่ทรงพลังและยืดหยุ่นมาก: มันแสดงถึงส่วนใด ๆ ของเกม (หรือแง่มุม)ComponentsGameSubsystem

มีความต้องการในกลไกของการลงทะเบียนComponentsในGameSubsystems(เมื่อGameObjectถูกสร้างและสงบ) มี4 วิธีคือ:


  • 1: รูปแบบของความรับผิดชอบ ทุกคนมีให้แก่ทุกคนComponent ตัดสินใจในการลงทะเบียน (และวิธีการจัดระเบียบ) ตัวอย่างเช่น GameSubsystemRender สามารถลงทะเบียน Renderable Components ได้GameSubsystemGameSubsystemComponents

มือโปร. Componentsไม่รู้อะไรเกี่ยวกับวิธีการใช้งาน คลัปต่ำ A.GameSubsystemเราสามารถเพิ่มใหม่ ตัวอย่างเช่นให้เพิ่ม GameSubsystemTitles ที่ลงทะเบียน ComponentTitle ทั้งหมดและรับประกันว่าทุกชื่อจะไม่ซ้ำกันและมีส่วนต่อประสานในการสอบถามวัตถุตามชื่อ แน่นอน ComponentTitle ไม่ควรเขียนใหม่หรือสืบทอดในกรณีนี้ B.GameSubsystemsเราสามารถจัดระเบียบที่มีอยู่ ตัวอย่างเช่น GameSubsystemAudio, GameSubsystemRender, GameSubsystemParticleEmmiter สามารถผสานเข้ากับ GameSubsystemSpatial (เพื่อวางเสียง emmiter ทั้งหมดให้Componentsอยู่ในลำดับชั้นเดียวกันและใช้การแปลงแบบญาติสัมพันธ์)

แย้ง ทุกการตรวจสอบ ไม่มีประสิทธิภาพมาก

แย้ง รู้เกี่ยวกับSubsystemsComponents


  • 2: Subsystemการค้นหาแต่ละComponentsประเภทที่เฉพาะเจาะจง

มือโปร. Approach 1ประสิทธิภาพที่ดีขึ้นกว่าใน

แย้ง ยังรู้เกี่ยวกับSubsystemsComponents


  • 3: ลงทะเบียนตัวเองในComponent GameSubsystem(s)เรารู้เวลารวบรวมว่ามี GameSubsystemRenderer ดังนั้น ComponentImageRender จะเรียกสิ่งที่เรียกว่า GameSubsystemRenderer :: register (ComponentRenderBase *)

มือโปร. ประสิทธิภาพ. Approach 1ไม่มีการตรวจสอบที่ไม่จำเป็นในขณะที่

แย้ง เป็นคู่ที่ไม่ดีด้วยComponentsGameSubsystems


  • 4: รูปแบบคนกลาง GameState(ที่มีGameSubsystems) สามารถใช้ registerComponent (Component *)

มือโปร. ComponentsและGameSubystemsไม่รู้อะไรเกี่ยวกับกันและกัน

แย้ง ใน C ++ มันจะดูน่าเกลียดและช้า typeid-switch


คำถาม: วิธีใดดีกว่าและส่วนใหญ่ใช้ในการออกแบบที่อิงส่วนประกอบ สิ่งที่ฝึกพูด ข้อเสนอแนะใด ๆ เกี่ยวกับการใช้Approach 4?

ขอขอบคุณ.


ฉันได้กลิ่นเกินวิศวกรรม ส่วนประกอบที่ลงทะเบียนด้วย GameObject หาก GameSubsystem เป็นสิ่งที่ฉันคิดว่าเป็นเช่นนั้นก็เป็นเพียงรายการส่วนประกอบที่สามารถเพิ่มลงใน GameObject ได้ในครั้งเดียว คุณอธิบายว่ามันฟังดูเหมือนว่ามี "เวทมนต์" ที่ GameObjects และ Components ประกอบกัน (พวกเขาค้นหาซึ่งกันและกันทำไม?) ฉันยังได้รับความรู้สึกว่าคุณกำลังพยายามที่จะใช้ส่วนประกอบสำหรับทุกสิ่งโดยทั่วไปในเครื่องยนต์ของคุณซึ่งฉันจะพิจารณาอีกครั้ง สำหรับสิ่งที่คุ้มค่าฉันจะพิจารณาตัวเลือก 3 หรือ 4 เท่านั้น
LearnCocos2D

@GamingHorror, การลงทะเบียนComponentsในการGameObjectsอยู่นอกขอบเขตของคำถามของฉัน อ่านบทความเกี่ยวกับวิธีการใช้ส่วนประกอบหรือถามคำถามของคุณเองในเว็บไซต์นี้หากคุณสนใจ สิ่งที่คุณคิดว่าGameSubsystemผิดทั้งหมด
topright

ฉันมีอคติต่อการพัฒนาส่วนประกอบสำหรับตรรกะของเกมไม่ใช่ส่วนประกอบของเครื่องยนต์และคำอธิบายของคุณดูเหมือนจะชี้ไปในทิศทางนั้น ฉันเข้าใจระบบส่วนประกอบเป็นอย่างดีฉันคิดว่าฉันถูกโยนออกนอกหลักสูตรเพราะฉันไม่คุ้นเคยกับคำศัพท์ที่คุณใช้โดยเฉพาะ GameSubsystem จากสิ่งที่ฉันอ่านดูเหมือนว่าคุณกำลังพยายามสร้างทุกอย่าง (เช่นเครื่องยนต์ทั้งหมด) จากส่วนประกอบ
LearnCocos2D

ใช่ "วัตถุเกมตามชิ้นส่วน" และ "การเขียนโปรแกรมเชิงองค์ประกอบ" เป็นคำที่แตกต่างกันซึ่งอาจทำให้เกิดความสับสน อย่าลำเอียงควร "bilased" ดีกว่า: scottbilas.com/files/2002/gdc_san_jose/game_objects_slides.ppt
topright

คำตอบ:


3

ประตูหมายเลข 3 ... ส่วนประกอบลงทะเบียนตัวเองใน GameSubsystem (s)

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

การมีเพศสัมพันธ์ไม่ใช่เรื่องเลวร้ายในกรณีนี้

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

ในที่สุดหากระบบย่อยหนึ่งต้องตอบสนองต่ออีกระบบหนึ่ง (renderer, ฟิสิกส์, ออดิโอต้องทำสิ่งต่าง ๆ เมื่อมีอะไรเกิดขึ้น) ส่วนประกอบสามารถอำนวยความสะดวกซึ่งกันและกันผ่านวัตถุในเกม ส่วนประกอบ


1
ดีแล้ว. แต่ส่วนประกอบรู้ได้อย่างไรเกี่ยวกับ GameSubsystems ระบบย่อยทั้งหมดเป็นแบบซิงเกิลตันหรือไม่? ไม่น่าเกลียดใช่ไหม ... ฉันกำลังคิดถึงวิธีแก้ปัญหาอื่น ๆ เช่นการฉีดแบบพึ่งพา ... แต่เมื่อใดและใครจะส่งอินสแตนซ์ของระบบย่อยไปยังแต่ละองค์ประกอบ
Dani

@Dani Components ไม่จำเป็นต้องเข้าถึงโดยตรงไปยังอินสแตนซ์ของระบบย่อยพวกเขาเพียงแค่ต้องส่งข้อความเพื่อขอให้ทำการลงทะเบียนพวกเขาไม่จำเป็นต้องรู้ว่าระบบย่อยคืออะไร (แต่พวกเขาจะเป็นไปได้มากที่สุด) และทำไม พวกเขาจะเป็นโสดหรือไม่ นั่นไม่ใช่ข้อกำหนดแม้ว่าในกรณีส่วนใหญ่คุณจะต้องการเพียงระบบย่อยเดียวสำหรับแต่ละระบบย่อย
Pablo Ariel

@Pablo - เห็นด้วย
Rick
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.