การสร้างเอนทิตีเป็นการรวมตัว


10

ฉันเพิ่งถามเกี่ยวกับวิธีแยกเอนทิตีออกจากพฤติกรรมและคำตอบหลักที่เชื่อมโยงกับบทความนี้: http://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/

แนวคิดขั้นสุดยอดที่เขียนเกี่ยวกับที่นี่คือ: วัตถุประสงค์ในการรวมบริสุทธิ์

ฉันสงสัยว่าฉันจะทำอย่างไรเพื่อสร้างเอนทิตีเกมเป็นการรวมที่บริสุทธิ์โดยใช้ C # ฉันยังไม่เข้าใจแนวคิดเกี่ยวกับวิธีการทำงานนี้ (บางทีเอนทิตีเป็นอาร์เรย์ของวัตถุที่ใช้อินเทอร์เฟซหรือชนิดฐานที่แน่นอน?)

ความคิดปัจจุบันของฉันยังคงเกี่ยวข้องกับการมีคลาสที่เป็นรูปธรรมสำหรับแต่ละประเภทเอนทิตีที่ใช้อินเทอร์เฟซที่เกี่ยวข้อง (IMoveable, ICollectable, ISpeakable และอื่น ๆ )

ฉันจะดำเนินการเกี่ยวกับการสร้างเอนทิตี้อย่างเดียวเป็นการรวมตัวโดยไม่ต้องมีรูปธรรมใด ๆ สำหรับเอนทิตีนั้น


หากคุณยังสนใจฉันสามารถส่งระบบเอนทิตีขนาดเล็กของฉันใน C # มันไม่น่าทึ่งแต่ใช้งานได้
The Duck คอมมิวนิสต์

คำตอบ:


6

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

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

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

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

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


3

วิธีที่ Unity ทำก็คือสคริปต์ทั้งหมด (ในกรณีของคุณรหัสเกมที่เฉพาะกับวัตถุประเภทเกม) นั้นได้มาจากคลาสพื้นฐานMonoBehaviourซึ่งตัวมันเองนั้นมาจากคลาสที่เกี่ยวข้องกับกรณีของComponentคุณ คุณไม่เคยแก้ไข (และไม่สามารถเข้าถึงรหัส) คลาส GameObject

วัตถุเกมอยู่ในความดูแลของที่มีทั้งหมดที่Components นอกจากนี้ยังมีหน้าที่ในการเรียกฟังก์ชั่นที่เกี่ยวข้องกับพวกเขา (เช่นUpdate) Unity ใช้การสะท้อนเพื่อกำหนดฟังก์ชันที่จะเรียกใช้ (ดูที่ส่วน "ฟังก์ชัน Overridable" ในหน้านี้ ) แต่คุณอาจต้องการทำให้มันเสมือนจริง

ดังนั้นหนึ่งในกลไกที่คุณใช้ใน Unity คือการรับส่วนประกอบบนวัตถุเกมปัจจุบันของคุณ (หรือลูกหลาน) ตามประเภท มีคุณสมบัติผู้ช่วยที่ห่อบางสิ่งที่พบได้ทั่วไป ตัวอย่างเช่นถ้าคุณต้องการเข้าถึงTransformองค์ประกอบของวัตถุเกม(เพื่อควบคุมตำแหน่ง / การหมุน / การปรับขนาดของวัตถุเกม) โดยปกติคุณจะต้องทำอะไรเช่นthis.GetComponent<Transform>().positionแต่พวกมันจะห่อหุ้มสิ่งนั้นไว้ในการthis.transform.positionเรียกของผู้ช่วย อีกรูปแบบทั่วไปคือการเข้าถึงRendererองค์ประกอบของวัตถุเกมปัจจุบัน ดังนั้นหากคุณต้องการทำสิ่งต่าง ๆ เช่นเปลี่ยนเนื้อหาของวัตถุในเกมปัจจุบันจากสคริปต์อื่นคุณอาจทำสิ่งที่ต้องการthis.renderer.material = someOtherMaterialและวัตถุในเกมของคุณจะได้รับการปรับปรุงอย่างเหมาะสม

อีกวิธีหนึ่งที่ใช้งานได้ใน Unity คือมีการตั้งค่าเครื่องมือแก้ไขเพื่อให้คุณสามารถสร้างวัตถุเกมในฉากที่มีส่วนประกอบอยู่แล้ว ในกรณีของ Unity วัตถุของเกมทั้งหมดมีTransformองค์ประกอบ แต่ก็สามารถมีประเภทในตัวเช่นAudioListenerหรือRendererซึ่งทำในสิ่งที่คุณคาดหวัง หรือคุณสามารถเพิ่มองค์ประกอบของคุณเองที่ทำสิ่งที่คุณต้องการให้พวกเขาทำ ตัวแก้ไขยังแสดงฟิลด์สาธารณะ / ต่อเนื่องได้บนส่วนประกอบของคุณดังนั้นคุณไม่จำเป็นต้องสร้างสคริปต์ที่แตกต่างกันหากคุณต้องการใช้รหัสพื้นฐานเดียวกัน แต่เปลี่ยนหมายเลขเวทย์มนตร์สองสามรอบ

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


0

ฉันชอบแนวทางที่ใกล้เคียงกับวิสัยทัศน์ของอดัมมากขึ้นจากบล็อกของ t-machine ส่วนประกอบควรเป็นข้อมูลเท่านั้นและระบบจะทำงานทั้งหมดกับพวกเขา

ดูตัวอย่างการติดตั้ง ES ใน C #: https://github.com/thelinuxlich/artemis_CSharp

และเกมตัวอย่างใช้มัน (XNA 4): https://github.com/thelinuxlich/starwarrior_CSharp

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