ฉันจะใช้หลายตาข่ายต่อเอนทิตีได้อย่างไรโดยไม่แยกส่วนประกอบหนึ่งประเภทเดียวต่อเอนทิตี


11

เราเพิ่งเปลี่ยนจากเอ็นจิ้นเกมตามลำดับชั้นเป็นเอ็นจิ้นเกมตามองค์ประกอบ ปัญหาของฉันคือเมื่อฉันโหลดแบบจำลองที่มีลำดับชั้นของตาข่ายและวิธีที่ฉันเข้าใจคือเอนทิตีในระบบที่ใช้องค์ประกอบไม่สามารถมีองค์ประกอบหลายประเภทเดียวกัน แต่ฉันต้องการ "meshComponent" สำหรับแต่ละ ตาข่ายในแบบจำลอง ดังนั้นฉันจะแก้ไขปัญหานี้ได้อย่างไร

ในเว็บไซต์นี้พวกเขาใช้เอ็นจิ้นเกมแบบอิงคอมโพเนนต์: http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/


ฉันคิดว่านี่เป็นภาษาท้องถิ่นเกินไป
jcora

4
ฉันคิดว่ามันเป็นคำถามทั่วไป วัตถุเกมสามารถมีองค์ประกอบเดียวกันหลายชิ้นได้หรือไม่?
Mathias Hölzl

ใช่มันคงจะเป็นไปได้ถ้ามันถูกถามแบบนั้น สำหรับฉันดูเหมือนว่าเขากำลังมองหาคำตอบสำหรับปัญหาที่เฉพาะเจาะจงมาก
jcora

4
"... เอนทิตีในระบบที่ใช้องค์ประกอบไม่สามารถมีองค์ประกอบหลายประเภทเดียวกัน ... " - ทำไมไม่?
ชัด

ฉันไม่คิดว่ามันแปลเป็ ยกตัวอย่างเช่นใน UE3, มีเพียงหนึ่งSkeletalMeshActor SkeletalMeshComponentเป็นปัญหาทั่วไปที่สามารถแก้ไขได้หลายวิธี
sam hocevar

คำตอบ:


13

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


ดังนั้นฉันจึงมีลำดับชั้นของเอนทิตีและเอนทิตีเหล่านี้มีส่วนประกอบและเชื่อมโยงกับผู้อื่น มันยังเป็น
เอ็นจิ้น

@ MathiasHölzlเป็นคำถามหรือไม่? ลำดับชั้นชนิดนี้ไม่เหมือนกับลำดับชั้นที่มีปัญหาใน OOP นี่เป็นเพียงลำดับชั้นกราฟิกเด็ก ๆ เอนทิตีจะไม่สืบทอดการทำงานจากพ่อแม่ของพวกเขาและทำให้คุณเดือดร้อนซึ่งมักจะทำอยู่ดี คุณสามารถไปกับ Asakeron เพื่อตอบปัญหาของคุณโดยมีรายชื่อ Meshs ฉันไม่เห็นว่ามันมีปัญหาอะไร บางทีฉันอาจไม่เข้าใจคำถามของคุณ?
ลุคบี

-1 ไม่แน่ใจว่าเป็นวิธีที่จะไปจริง ๆ หากสิ่งที่คุณต้องการคือส่วนประกอบที่จัดการลำดับชั้นของเมชทำไมไม่ให้มีแอพModelComponentที่มีลำดับชั้นของเมช? การแยกเอนทิตีเพียงเพื่อฟังดูเหมือนการแก้ปัญหาที่ผิด ดูคำตอบของ Asakeron และ Byte56
Laurent Couvidou

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

@LukeB เนื่องจากกลุ่มของตาข่ายนี้สามารถสอดคล้องกับเอนทิตีหนึ่งโดยรวมด้วยส่วนประกอบที่ขึ้นอยู่กับสิ่งนี้เช่น AI, เสียง, ฟิสิกส์ ... โดยการทำเช่นนี้คุณจะจบลงด้วยกราฟฉากและนิสัยใจคอทั้งหมด
Laurent Couvidou

8

meshComponent ของคุณอาจมีรายการของตาข่าย ฉันไม่แน่ใจว่าคุณใช้งานเครื่องยนต์อย่างไร แต่ระบบสามารถวนซ้ำทุกเครือข่ายได้อย่างง่ายดายและวาดได้ง่าย


1
A mesh มีส่วนประกอบเช่น transform, physic, graphic ...
Mathias Hölzl

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

1
ใช่มันควรจะเป็นส่วนประกอบ แต่ส่วนประกอบไม่สามารถมีส่วนประกอบได้ดังนั้นจึงยากที่จะใช้ลำดับชั้นของแบบจำลอง
Mathias Hölzl

1
ฉันเชื่อว่าคุณควรให้ข้อมูลเพิ่มเติมเกี่ยวกับวิธีสร้างเครื่องยนต์ของคุณเพื่อรับคำตอบที่ดียิ่งขึ้น ระบบส่วนประกอบของเอ็นติตี้สามารถนำไปใช้ได้หลายวิธีตรวจสอบคำตอบนี้โดย Kylotan สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนั้น
Asakeron

4

ฉันจะสร้างส่วนประกอบตาข่ายของฉันด้วยรายการวัตถุตาข่าย วัตถุตาข่ายแต่ละตัวมีข้อมูลตาข่ายพร้อมกับการชดเชย เมื่อวาดรูประบบวาดภาพจะรับตำแหน่งจากส่วนประกอบตำแหน่งจากนั้นดึงแต่ละตาข่ายในส่วนประกอบตาข่ายที่ตำแหน่ง + ออฟเซ็ต

คุณสามารถมีหลายตาข่ายภายในองค์ประกอบตาข่ายของคุณในขณะที่ยังพูดด้วยองค์ประกอบตาข่ายเดียวต่อเอนทิตี


1

TLDR: การทำให้ส่วนประกอบประกอบด้วยหลายตาข่ายเริ่มต้นด้วย

ฉันเห็นด้วยกับ Asakeron / Byte56 / Laurent ในอีกทางหนึ่งที่ต้องการระดับระหว่างตาข่าย / วัสดุคู่และเอนทิตี้ของตัวเอง แทนที่จะมอง GraphicsComponent เป็นจุดยอดและวัสดุให้คิดว่ามันเป็นหยดพิกเซลบนแรสเตอร์สุดท้าย - วิธีที่พวกเขาได้รับมีรายละเอียดการใช้งานและไม่มีอะไรเพิ่มเติม

ฉันคิดเกี่ยวกับเรื่องนี้มากสำหรับโครงการของฉันและฉันคิดว่าทางออกที่ดีที่สุดคือการทำให้ GraphicsComponent เป็นองค์ประกอบระดับที่สูงขึ้นมากซึ่งรวมถึงการทำงานของวัตถุ 'Model' แบบดั้งเดิมมาก - เพราะฟังก์ชั่นนี้ไม่จำเป็น! หากต้องการแสดงรูปหลายเหลี่ยมเหล่านี้มากกว่าเพียงแค่ข้อมูลบัฟเฟอร์และจำเป็นต้องมี shader เช่น:

  • ตำแหน่งที่คุณพูดถึง
  • ข้อมูลการสร้างสกิน / แอนิเมชั่น
  • Pass ปัจจุบัน (เช่นหากใช้สอง pass alpha)
  • ข้อมูลการส่งเงา (ถ้าคุณทำ)
  • ข้อมูลเกี่ยวกับวิธีการปรับปรุงวัสดุและเวลา
  • ฟังก์ชั่นการเลือกสรร

และนั่นเป็นเพียงสำหรับสินทรัพย์ 3 มิติโดยไม่พิจารณาระบบอนุภาคป้ายโฆษณา ฯลฯ แต่ทั้งหมดนี้เกี่ยวข้องกับรหัสกราฟิก / การแสดงผลเท่านั้น - มันไม่ส่งผลกระทบต่อฟิสิกส์เสียงหรือการเขียนสคริปต์ดังนั้นจึงสมเหตุสมผล องค์ประกอบกราฟิก / การแสดงผล

ฉันลงเอยด้วย:

Model : Entity, IHasGraphicsComponent, IHasSkeleton, IHasAnimationStore     //This is the 'game object' - it is passed to the GraphicsController
    ModelComponent : GraphicsComponent                      //This is the actual graphics component, used by the GraphicsController in the context of the game object.
        ModelComponentPart : GraphicsComponent              //This is also a graphics component
            Mesh                                        //These are implementation details
            Material
        ModelComponentPart : GraphicsComponent
            Mesh
            Material
    Skeleton
    Animations

ในเรื่องนี้:

  • โมเดลคือเนื้อหาเกมใด ๆ ที่มีองค์ประกอบกราฟิก

  • ModelComponent นั้นคล้ายคลึงกับโมเดลดั้งเดิมและอันที่จริงแล้วสำหรับสินทรัพย์ 3 มิติ ตัวควบคุม GraphicsComponent (ถ้าคุณใช้รูปแบบ Model-View-Controller) เป็นผู้รับผิดชอบในการหาประเภทของสินทรัพย์กราฟิกและวาดอย่างถูกต้อง (โปรดทราบว่า ModelComponent เป็น subclass ของ GraphicsComponent)

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

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