โครงสร้างหน่วยเกม RTS


18

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

วิธีที่ฉันเห็นมันมี 2 วิธีที่ฉันทำได้

  1. คลาสหน่วยทั่วไปเดียวที่มีแฟล็กที่ระบุสิ่งที่สามารถ / ไม่สามารถทำได้ (จากนั้นสร้างอินสแตนซ์ในอาร์เรย์แบบสแตติกและคว้าเมื่อจำเป็น)
  2. คลาสหน่วยนามธรรมพร้อมวิธีการแบบนามธรรมสำหรับการกระทำเฉพาะหน่วยเช่น (Attack, Harvest, Patrol) ซึ่งจำเป็นต้องนำไปใช้ในคลาสย่อยแม้ว่าหน่วยนั้นจะไม่สามารถเก็บเกี่ยวสิ่งใดได้

วิธีแรกในการทำสิ่งนี้ดูง่ายที่สุด แต่ฉันจะต้องมีรหัสจำนวนมากที่ไม่ได้ใช้สำหรับหน่วยงานส่วนใหญ่

วิธีที่สองสามารถใช้งานได้เช่นกัน แต่ถ้าฉันตัดสินใจที่จะมีสองหน่วยที่แตกต่างกันที่สามารถเก็บเกี่ยวทรัพยากรฉันจะมีรหัสเดียวกันแน่นอนในสองชั้นเรียนที่แตกต่างกันซึ่งดูเหมือนจะไม่ถูกวิธีที่จะทำ

นี่เป็นแนวทางที่ถูกต้องสำหรับปัญหานี้หรือไม่?
ในเกมอย่าง AoE ทุกหน่วยมีสิ่งที่ฉันเข้าใจคือ List of Actions / Orders บางอย่างฉันอยากรู้วิธีทำให้บางอย่างคล้ายกับสิ่งนั้นโดยที่ฉันสามารถเขียนโค้ด Action / Order แต่ละครั้งได้ครั้งเดียวและ จากนั้นมอบให้กับทุกหน่วยงานที่ต้องมีการกระทำ

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

คำตอบ:


25

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

ยกตัวอย่างเช่นรถถังอาจมีส่วนประกอบMobile, Destructible, Attackerการเคลื่อนที่ปราการเท่านั้นDestructible, Attackerและเครื่องเกี่ยวนวดMobile, ,Destructible Harvesterชั้นเรียนเหล่านี้จะรวมรหัสทั้งหมดที่จำเป็นในการใช้พฤติกรรมเหล่านี้ การโต้ตอบระหว่างส่วนประกอบ ( Attackerสามารถสร้างความเสียหายได้เพียงอย่างเดียวDestructible) สามารถดำเนินการได้โดยการตรวจสอบส่วนประกอบหากหน่วยอื่นมีองค์ประกอบที่ต้องการและโต้ตอบกับส่วนประกอบนั้นโดยตรง

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

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


ดังนั้นในเอกภาพฉันจะปิดและเปิดใช้งานส่วนประกอบตามต้องการหรือไม่
Daniel Holst

@DanielHolst ไม่คุณจะต้องเพิ่มและลบออกตามต้องการ คุณสามารถทำได้ในการแก้ไขความสามัคคีหรือ scrips ใช้และgameObject.AddComponent gameObject.RemoveComponent
Philipp

อ่าโอเค แต่พูดสำหรับการกระทำ / คำสั่ง "moveTo" หน่วยจะทราบได้อย่างไรว่าเมื่อคำสั่งซื้อเสร็จสิ้นแล้วและฉันจะจัดคิวคำสั่งซื้อได้อย่างไร
Daniel Holst

2
@DanielHolst ฉันคิดว่าคุณเข้าใจผิดบางอย่าง Movingหมายถึงองค์ประกอบ "หน่วยนี้โดยทั่วไปมีความสามารถในการเคลื่อนไหว" มีการแนบส่วนประกอบอย่างถาวรโดยไม่คำนึงว่าหน่วยกำลังเคลื่อนที่หรือไม่ มันไม่ได้หมายความว่ามันมีการเคลื่อนไหวในขณะนี้ แม้ว่าคุณสามารถทำได้ด้วยวิธีนี้โดยการเพิ่มMoveOrderส่วนประกอบลงไปและให้ส่วนประกอบนั้นลบตัวเองออกจากหน่วยเมื่อคำสั่งซื้อเป็นจริงหรือยกเลิก
ฟิลิปป์

1
@DanielHolst ตอนนี้คุณกำลังล่องลอยไปในทิศทางของยูนิต AI ซึ่งเป็นเวิร์มอื่นของเวิร์ม แนวทางที่เป็นไปได้คือการมีไลบรารีขององค์ประกอบ AIScript ซึ่งอาจสันนิษฐานว่ามีส่วนประกอบบางอย่างอยู่หรือเปลี่ยนพฤติกรรมของพวกเขาขึ้นอยู่กับว่าองค์ประกอบใดที่หน่วยมีอยู่ แต่นั่นเป็นหัวข้อที่ซับซ้อนเกินไปที่จะจัดการกับความคิดเห็น
ฟิลิปป์

4

เกมจำนวนมากใช้ระบบที่อิงองค์ประกอบสำหรับเอนทิตีซึ่งเป็นที่ซึ่งพฤติกรรมและความสามารถสามารถเพิ่มลงในประเภทหน่วยทั่วไปมากกว่าที่จะถูกเข้ารหัสเป็นส่วนหนึ่งของคลาสเอนทิตี (หรือเทียบเท่า)


สิ่งนี้จะเป็นเรื่องยากมากที่จะใช้?
Daniel Holst

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

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

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