เมื่อวานนี้ฉันได้อ่านงานนำเสนอจาก GDC Canada เกี่ยวกับระบบเอนทิตีแอตทริบิวต์ / พฤติกรรมและฉันคิดว่ามันยอดเยี่ยมมาก อย่างไรก็ตามฉันไม่แน่ใจว่าจะใช้งานได้อย่างไรไม่ใช่ในทางทฤษฎี ก่อนอื่นฉันจะอธิบายให้คุณทราบอย่างรวดเร็วว่าระบบนี้ทำงานอย่างไร
แต่ละเอนทิตีเกม (เกมวัตถุ) ประกอบด้วยคุณลักษณะ (= ข้อมูลซึ่งสามารถเข้าถึงได้โดยพฤติกรรม แต่ยังรวมถึง 'รหัสภายนอก') และพฤติกรรม (= ตรรกะซึ่งมีOnUpdate()
และOnMessage()
) ดังนั้นสำหรับตัวอย่างเช่นในโคลนฝ่าวงล้อมอิฐแต่ละคนจะต้องประกอบด้วย (ตัวอย่าง): PositionAttribute , ColorAttribute , HealthAttribute , RenderableBehaviour , HitBehaviour คนสุดท้ายอาจมีลักษณะเช่นนี้ (เป็นเพียงตัวอย่างที่ไม่ทำงานเขียนใน C #):
void OnMessage(Message m)
{
if (m is CollisionMessage) // CollisionMessage is inherited from Message
{
Entity otherEntity = m.CollidedWith; // Entity CollisionMessage.CollidedWith
if (otherEntity.Type = EntityType.Ball) // Collided with ball
{
int brickHealth = GetAttribute<int>(Attribute.Health); // owner's attribute
brickHealth -= otherEntity.GetAttribute<int>(Attribute.DamageImpact);
SetAttribute<int>(Attribute.Health, brickHealth); // owner's attribute
// If health is <= 0, "destroy" the brick
if (brickHealth <= 0)
SetAttribute<bool>(Attribute.Alive, false);
}
}
else if (m is AttributeChangedMessage) // Some attribute has been changed 'externally'
{
if (m.Attribute == Attribute.Health)
{
// If health is <= 0, "destroy" the brick
if (brickHealth <= 0)
SetAttribute<bool>(Attribute.Alive, false);
}
}
}
หากคุณสนใจระบบนี้คุณสามารถอ่านเพิ่มเติมได้ที่นี่ (.ppt)
คำถามของฉันเกี่ยวข้องกับระบบนี้ แต่โดยทั่วไปทุกหน่วยงานตามระบบเอนทิตี ฉันไม่เคยเห็นว่าสิ่งเหล่านี้ใช้งานได้จริงในเกมคอมพิวเตอร์จริงเพราะฉันไม่สามารถหาตัวอย่างที่ดีได้และถ้าฉันพบมันก็ไม่มีเอกสารแสดงความคิดเห็นและฉันก็ไม่เข้าใจ
ดังนั้นฉันต้องการถามอะไร วิธีการออกแบบพฤติกรรม (ส่วนประกอบ) ฉันได้อ่านที่นี่ใน GameDev SE ว่าข้อผิดพลาดที่พบบ่อยที่สุดคือการสร้างองค์ประกอบมากมายและเพียงแค่ "ทำให้ทุกอย่างเป็นองค์ประกอบ" ฉันได้อ่านแล้วว่ามันไม่แนะนำให้ทำการเรนเดอร์ในองค์ประกอบ แต่ทำมันนอกมัน (ดังนั้นแทนที่จะเป็นRenderableBehaviourมันอาจจะเป็นRenderableAttributeและถ้าเอนทิตีมีRenderableAttributeตั้งค่าเป็นจริงแล้วRenderer
(คลาสไม่เกี่ยวข้องกับ ส่วนประกอบ แต่สำหรับเครื่องยนต์เอง) ควรวาดลงบนหน้าจอหรือไม่)
แต่แล้วพฤติกรรม / องค์ประกอบล่ะ? สมมติว่าฉันมีระดับและในระดับที่มีEntity button
, และEntity doors
Entity player
เมื่อผู้เล่นชนกับปุ่ม (มันเป็นปุ่มตั้งพื้นซึ่งถูกสลับด้วยแรงกด) มันจะถูกกด เมื่อกดปุ่มมันจะเปิดประตู ทีนี้ทำอย่างไรดี?
ฉันคิดอะไรแบบนี้ขึ้นมา: ผู้เล่นได้รับCollisionBehaviourซึ่งตรวจสอบว่าผู้เล่นชนกับบางสิ่งหรือไม่ หากเขาชนกับปุ่มมันจะส่ง a CollisionMessage
ไปยังbutton
เอนทิตี ข้อความจะมีข้อมูลที่จำเป็นทั้งหมด: ใครเป็นผู้ชนกับปุ่ม ปุ่มได้มีToggleableBehaviourCollisionMessage
ซึ่งจะได้รับ มันจะตรวจสอบว่าใครทำมันชนกันและถ้าน้ำหนักของเอนทิตีนั้นใหญ่พอที่จะสลับปุ่มปุ่มจะถูกสลับ ตอนนี้มันตั้งค่าToggledAttributeของปุ่มเป็นจริง เอาล่ะ แต่ตอนนี้เป็นอย่างไร
ปุ่มควรส่งข้อความอื่นไปยังวัตถุอื่นทั้งหมดเพื่อบอกพวกเขาว่ามันถูกสลับ? ฉันคิดว่าถ้าฉันทำทุกอย่างเช่นนี้ฉันจะมีข้อความนับพันและมันก็ยุ่งเหยิงไปหมด ดังนั้นนี่อาจจะดีกว่า: ประตูตรวจสอบอย่างต่อเนื่องว่ามีการกดปุ่มที่เชื่อมโยงกับพวกเขาหรือไม่และเปลี่ยนแปลงOpenedAttributeตามนั้น แต่นั่นหมายความว่าOnUpdate()
วิธีการของประตูจะทำอะไรบางอย่างอยู่ตลอดเวลา (มันเป็นปัญหาจริงๆเหรอ?)
และปัญหาที่สอง: ถ้าฉันมีปุ่มหลายชนิด หนึ่งถูกกดด้วยแรงดันอันที่สองถูกสลับโดยการยิงที่หนึ่งที่สามคือการสลับถ้าน้ำไหลบน ฯลฯ ซึ่งหมายความว่าฉันจะต้องมีพฤติกรรมที่แตกต่างกันดังนี้:
Behaviour -> ToggleableBehaviour -> ToggleOnPressureBehaviour
-> ToggleOnShotBehaviour
-> ToggleOnWaterBehaviour
เกมนี้ใช้งานได้จริงหรือฉันแค่โง่งั้นเหรอ? บางทีฉันอาจจะมีเพียงหนึ่งToggleableBehaviourและมันจะประพฤติตามButtonTypeAttribute ดังนั้นถ้ามันคือButtonType.Pressure
มันทำอย่างนี้ถ้ามันเป็นButtonType.Shot
มันทำอย่างอื่น ...
แล้วฉันต้องการอะไร ฉันอยากจะถามคุณว่าฉันทำถูกหรือว่าฉันโง่และฉันไม่เข้าใจประเด็นขององค์ประกอบ ฉันไม่พบตัวอย่างที่ดีเกี่ยวกับองค์ประกอบที่ใช้งานได้จริงในเกมฉันพบบทเรียนบางบทที่อธิบายถึงวิธีการสร้างระบบคอมโพเนนต์ แต่ไม่ใช่วิธีการใช้งาน