ฉันได้ออกแบบระบบเอนทิตีสำหรับ FPS มันใช้งานได้ดังนี้:
เรามี "โลก" - วัตถุเรียกว่า GameWorld สิ่งนี้ถืออาร์เรย์ของ GameObject เช่นเดียวกับอาร์เรย์ของ ComponentManager
GameObject ถืออาร์เรย์ของ Component นอกจากนี้ยังมีกลไกเหตุการณ์ซึ่งง่ายมาก คอมโพเนนต์เองอาจส่งเหตุการณ์ไปยังเอนทิตีซึ่งออกอากาศไปยังส่วนประกอบทั้งหมด
ส่วนประกอบนั้นเป็นสิ่งที่ให้ GameObject คุณสมบัติบางอย่างและเนื่องจาก GameObject เป็นเพียงภาชนะของพวกเขาทุกอย่างที่เกี่ยวข้องกับวัตถุเกมเกิดขึ้นในส่วนประกอบ ตัวอย่างเช่น ViewComponent, PhysicsComponent และ LogicComponent หากต้องการการสื่อสารระหว่างกันก็สามารถทำได้ผ่านการใช้เหตุการณ์
ComponentManager เป็นเพียงส่วนต่อประสานเช่นเดียวกับ Component และสำหรับแต่ละชั้น Component โดยทั่วไปควรจะมีหนึ่ง ComponentManager ผู้จัดการส่วนประกอบเหล่านี้มีความรับผิดชอบในการสร้างส่วนประกอบและเริ่มต้นพวกเขาด้วยคุณสมบัติอ่านจากสิ่งที่ชอบไฟล์ XML
ComponentManager ยังดูแลการอัพเดทส่วนประกอบต่างๆเช่น PhysicsComponent ที่ฉันจะใช้ห้องสมุดภายนอก (ซึ่งทำทุกอย่างในโลกพร้อมกัน)
สำหรับการกำหนดค่าฉันจะใช้โรงงานสำหรับเอนทิตีที่จะอ่านไฟล์ XML หรือสคริปต์สร้างส่วนประกอบที่ระบุในไฟล์ (ซึ่งเพิ่มการอ้างอิงไปยังผู้จัดการองค์ประกอบที่เหมาะสมสำหรับการอัปเดตจำนวนมาก) และ จากนั้นอัดมันเข้าไปในวัตถุ GameObject
มาถึงปัญหาของฉันแล้วฉันจะลองใช้มันกับเกมที่มีผู้เล่นหลายคน ฉันไม่รู้ว่าจะเข้าใกล้สิ่งนี้อย่างไร
ประการแรก: สิ่งที่ลูกค้าควรมีตั้งแต่ต้น? ฉันควรเริ่มด้วยการอธิบายว่าเอ็นจิ้นผู้เล่นเดี่ยวจะกำหนดเอนทิตีที่จะสร้างได้อย่างไร
ในเครื่องมือแก้ไขระดับคุณสามารถสร้าง "brushes" และ "เอนทิตี" แปรงใช้สำหรับสิ่งต่าง ๆ เช่นผนังพื้นและเพดานรูปร่างเรียบง่ายโดยทั่วไป หน่วยงานเป็น GameObject ที่ฉันได้บอกคุณเกี่ยวกับ เมื่อสร้างเอนทิตีในเครื่องมือแก้ไขระดับคุณสามารถระบุคุณสมบัติสำหรับแต่ละคอมโพเนนต์ คุณสมบัติเหล่านี้จะถูกส่งโดยตรงไปยังสิ่งที่เหมือนตัวสร้างในสคริปต์ของกิจการ
เมื่อคุณบันทึกระดับสำหรับเอ็นจิ้นที่จะโหลดมันจะถูกแยกย่อยเป็นรายการของเอนทิตีและคุณสมบัติที่เกี่ยวข้อง แปรงจะถูกแปลงเป็นเอนทิตี "worldspawn"
เมื่อคุณโหลดในระดับนั้นมันจะทำการติดตั้งเอนทิตีทั้งหมด ฟังดูง่ายใช่มั้ย
ตอนนี้สำหรับเครือข่ายหน่วยงานที่ฉันพบปัญหามากมาย ก่อนสิ่งที่เอนทิตีควรมีอยู่บนไคลเอนต์ตั้งแต่เริ่มต้น? สมมติว่าทั้งเซิร์ฟเวอร์และไคลเอนต์มีไฟล์ระดับไคลเอนต์อาจรวมถึงการติดตั้งเอนทิตีทั้งหมดในระดับแม้ว่าพวกเขาจะมีเพียงเพื่อวัตถุประสงค์ของกฎเกมบนเซิร์ฟเวอร์
ความเป็นไปได้อีกอย่างหนึ่งคือไคลเอนต์เริ่มทำการติดตั้งเอนทิตีทันทีที่เซิร์ฟเวอร์ส่งข้อมูลเกี่ยวกับมันและนั่นหมายความว่าลูกค้าจะมีเอนทิตีที่ต้องการเท่านั้น
ปัญหาอื่นคือวิธีการส่งข้อมูล ฉันคิดว่าเซิร์ฟเวอร์สามารถใช้การบีบอัดเดลต้าซึ่งหมายความว่าจะส่งเฉพาะข้อมูลใหม่เมื่อมีการเปลี่ยนแปลงบางอย่างแทนที่จะส่งสแน็ปช็อตไปยังลูกค้าทุกเฟรม แม้ว่านั่นหมายความว่าเซิร์ฟเวอร์จะต้องติดตามสิ่งที่ลูกค้าแต่ละคนรู้ในขณะนี้
และในที่สุดระบบเครือข่ายจะถูกฉีดเข้าไปในเครื่องยนต์ได้อย่างไร? ฉันกำลังคิดว่าส่วนประกอบ NetworkComponent ซึ่งถูกฉีดเข้าไปในทุกเอนทิตีที่ควรจะมีเครือข่าย แต่ส่วนประกอบเครือข่ายควรรู้ว่าตัวแปรใดบ้างที่เครือข่ายและวิธีการเข้าถึงเหล่านั้นและสุดท้ายว่าองค์ประกอบเครือข่ายที่สอดคล้องกันบนไคลเอนต์ควรรู้วิธีการเปลี่ยนตัวแปรเครือข่าย?
ฉันมีปัญหาใหญ่เข้ามาใกล้สิ่งนี้ ฉันจะขอบคุณถ้าคุณช่วยฉันในระหว่างทาง ฉันเปิดรับเคล็ดลับในการปรับปรุงการออกแบบระบบส่วนประกอบด้วยดังนั้นอย่ากลัวที่จะแนะนำสิ่งนั้น