เหตุใดจึงต้องวางเอนทิตี config นอกสคริปต์?


11

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

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


คำตอบของ @ Christopher Larsenยาวเกินกว่าจะโพสต์เป็นความคิดเห็น

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

นี่คือตัวอย่างของสิ่งที่ฉันต้องการถาม ด้านล่างมีสองทางเลือกในการกำหนดค่าเอนทิตี: ผ่านสคริปต์และผ่านไฟล์ JSON ภายนอก คำถามของฉันคือทำไมผู้คนจำนวนมากต้องการกำหนดเอนทิตีนอกสคริปต์?

คลาสเอนทิตีฐาน:

class Entity:
    def __init__(self, name):
        pass
    def addComponent(self, comp):
        pass

วิธีการสคริปต์:

orc = Entity('Orc')
orc.addComponent(PositionComponent(3.4, 7.9))

วิธีการ JSON:

{
    "name" : "Orc",
    "components":
    {
        "PositionComponent": {
            "x" : 3.4,
            "y" : 7.9
        }
    }
}

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

คำตอบ:


13

ข้อได้เปรียบที่สำคัญที่อยู่ในใจของฉันคือมันช่วยให้การกำหนดค่าที่จะแก้ไข / จัดการโดยไม่ได้เขียนโปรแกรมโดยไม่ต้องให้พวกเขาสัมผัสใด ๆ ของสคริปต์เกม


สิ่งนี้สามารถทำได้โดยเพียงแค่มีสองไฟล์ (เท่ากับสัตว์ป่า. a และ. cpp) ฉันสงสัยว่าใครจะเป็นคนที่ต้องการสร้างวัตถุ (นอกเหนือจากการบอกว่าไม่มีอะไรที่ดูเหมือนแจกันและไม่มีอะไรที่ดูเหมือน butterly) ที่ยังไม่ต้องการเพิ่มในตรรกะบางอย่างกับมัน (เช่น ถ้าคนที่ปกคลุมด้วยเกสรจากดอกไม้ในแจกันดึงดูดผีเสื้อ) มนุษย์อ่านได้ดีมากและหนึ่งในความคิดของฉันว่าทำไมจึงเป็นเช่นนั้น แต่มีอีกครั้งที่ฉันย้าย JSON, ตาราง Lua และ XML ทั้งหมดมีระดับความสามารถในการอ่านของมนุษย์ในระดับใกล้เคียงกันโดยผู้ที่ไม่ใช่โปรแกรมเมอร์
James

2
Glest เป็นเกมที่ดัดแปลงด้วย xml โปรแกรมเมอร์ที่ไม่ใช่โปรแกรมเมอร์จำนวนมากทำ mods สำหรับมัน เป็นวิธีที่สะดวกกว่าที่จะมี xml / json มากกว่าสคริปต์
จะ

6

เหตุผลหนึ่งที่ฉันมักจะใช้ไฟล์กำหนดค่ามากกว่าสคริปต์สำหรับเรื่องนี้คือ:

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

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


5
ย้อนกลับไปเมื่อการพัฒนาซอฟต์แวร์กระแสหลักดีขึ้นซึ่งเป็นที่รู้จักกันดีในนามของหลักการของ Least Power : ทุกวันนี้เราต้องขอบคุณเหตุผลที่เลือกไม่ใช่โซลูชันที่ทรงพลังที่สุด แต่มีประสิทธิภาพน้อยที่สุด เหตุผลก็คือยิ่งภาษามีพลังน้อยเท่าไหร่คุณก็ยิ่งสามารถใช้ข้อมูลที่เก็บไว้ในภาษานั้นได้มากเท่านั้น

1
@ โจที่จริง ๆ แล้วอธิบายค่อนข้างดีหนึ่งในเหตุผลที่ฉันยังใช้วิธีนี้ ตอนแรกฉันพยายามกำหนดค่าเอนทิตีของฉันในสคริปต์ แต่พบว่ามันยากที่จะใช้เกมบันทึก (ไม่สามารถติดตามความสัมพันธ์ระหว่างส่วนประกอบ) การใช้ไฟล์ปรับแต่งภายนอกช่วยได้มาก
Paul Manta

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

2

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


1

รูปแบบที่คุณอธิบายเป็นการใช้งานระบบขับเคลื่อนข้อมูล

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

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

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

ลองมาเป็นตัวอย่างของเอนทิตีแบบแผน "orc" ...

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

  • maxhealth = 10
  • ดาเมจ = 3 ดาเมจต่อวินาที
  • หนี = true
  • runawaywhen = สุขภาพ <10
  • ก้าวร้าว = true

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

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

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

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


2
สคริปต์เป็นข้อมูลตามคำจำกัดความส่วนใหญ่
จะ

1
-1 คำถามไม่ได้เกี่ยวกับข้อมูลที่ขับเคลื่อนด้วยการเข้ารหัสยาก แต่เกี่ยวกับการเขียนสคริปต์แบบไดนามิกและการประกาศแบบคงที่

@Christopher ฉันเพิ่มการตอบกลับยาวใน OP ของฉัน กรุณาตรวจสอบมัน
Paul Manta

0

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

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

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

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