เอ็นจิ้นของเกม: วิธีที่เหมาะสมสถาปัตยกรรมที่ชาญฉลาดในการใช้การสนับสนุนสคริปต์?


17

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

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

และสิ่งนี้คือฉันต้องการให้สคริปต์มีผลกับทั้งสองสิ่งที่เกี่ยวข้องกับตรรกะของเกม (การเปลี่ยนพารามิเตอร์หน่วย ฯลฯ ) และสิ่งต่าง ๆ ที่เกี่ยวข้องกับมุมมองเกมเช่นภาพเคลื่อนไหวพิเศษ / บทสนทนาสำหรับการต่อสู้ที่อาจขึ้นอยู่กับ ทริกเกอร์สคริปต์ที่แน่นอน

(ตามจริงแล้วฉันต้องการให้สคริปต์ควบคุมการไหลของเกมโดยปล่อยให้เฉพาะกลไกหลัก / กราฟิกไปที่ตรรกะ / มุมมอง แต่ฉันใหม่สำหรับสิ่งนี้ดังนั้นฉันไม่แน่ใจว่าฉันสามารถทำได้ตอนนี้)

ฉันคิดถึงสามตัวเลือก:

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

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

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

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

ขอขอบคุณ!

ป.ล. ขอบคุณสำหรับการย้ายคำถามไม่ทราบว่ามีส่วนพิเศษสำหรับ gamedev


คุณมีปัญหาอะไรที่การแนะนำภาษาสคริปต์จะแก้ปัญหาได้?
munificent

คำตอบ:


3

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

จับคู่สิ่งนี้กับการเปิดเผยออบเจ็กต์ที่มีข้อมูลและ API เพื่อเข้าถึงส่วนประกอบลอจิกที่จำเป็น (ฉันหมายความว่าคุณสามารถสคริปต์การค้นหาเส้นทาง AI แต่เนื่องจากเป็นรหัสชิ้นส่วนทั่วไปที่น่าจะถูกนำมาใช้และนำกลับมาใช้ใหม่ ฝังไว้ในโมดูลแล้วเพิ่มไปยัง API ที่สัมผัสกับภาษาสคริปต์?) สิ่งนี้จะช่วยให้คุณสามารถเข้าถึงได้ง่ายรวมถึงสถานที่ที่กำหนดไว้อย่างชัดเจนว่าเกิดอะไรขึ้น

อีกครั้งฉันเตือนสิ่งนี้ด้วยคำพูดเดียวกับที่ฉันทำอยู่เสมอ ผลิตภัณฑ์ทำงานเสร็จแล้วมีค่ามากกว่าทฤษฎีที่ดีในการเขียนโปรแกรมเสมอ :)

หวังว่านี่จะช่วยได้!


2

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

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

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

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

คุณสามารถแค็ปซูลอินเทอร์เฟซที่สคริปต์สามารถโต้ตอบได้โดยใช้รูปแบบFaçade ในวิธีการfaçadeคุณสามารถใส่ตรรกะที่กำหนดวิธีการ , เมื่อ , ถ้าสคริปต์ที่สามารถใช้ฟังก์ชั่นและการสรุปการปฏิสัมพันธ์สคริปต์จากการดำเนินงานหลัก

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


1

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


1

Lua เป็นตัวเลือกยอดนิยมสำหรับภาษาสคริปต์ทั่วไป คุณสามารถสร้างภาษาสคริปต์ของคุณเองโดยใช้ Lex และ Yacc (ดูบทความใน Game Programming Gems 3) แต่ฉันจะบอกว่าความต้องการส่วนใหญ่ของคุณจะได้รับการดูแลด้วย Lua ไม่ว่าเล็กหรือใหญ่

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