ฉันจะใช้การเขียนสคริปต์อัจฉริยะในเกมของฉันได้อย่างไร


18

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

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

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


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

@Kikaimaru C # ไม่ใช่ภาษาสคริปต์ การใช้ lua จะเป็นความคิดที่ดีกว่าหรือภาษาอื่น ๆ ที่สามารถฝังอยู่ในเครื่องยนต์ของคุณ
JDSweetBeat

@DJMethaneMan "C # ไม่ใช่ภาษาสคริปต์" ไม่ได้มีความหมายอะไรไม่มีปัญหากับการเขียนสคริปต์ใน C # ในเกมที่เขียนใน C # และใช้สิ่งที่ต้องการ Roselyn เพื่อรวบรวม ... แต่หลังจาก 4 ปีฉันจะใช้ json javascript แทน xml และ C # :)
Kikaimaru

คำตอบ:


17

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

ENTITY:"Goblin"
{
    description="It's currently their age."
    commonname="goblin"
    pluralCommonName="goblins"
    childname="gob'in"
    pluralChildName="gob'ins"
    active=Nocturnal
    tags=Mobile
    baseAttributes="OrganicMobileCreature"

    [Model]{
            meshname="Goblin"
            texturename="GoblinTexture"
    }

    [Motion]{
            maxvelocity=0.01:0.015
            locomotion=Walk,Swim
    }

    [Skills]{
            ALL=0.01:0.05,Mine=8.3:8.8,PlaceCube=8.3:8.8
    }

    [Inventory]{
            maxItems=2
            Allow=ALL
            Disallow=NONE
    }
}

ส่วนใหญ่เป็นการอธิบายตนเอง แต่นี่เป็นไฮไลท์:

  • ส่วนแรกอธิบายข้อมูลทั่วไปของเอนทิตี ซึ่งรวมถึงคำอธิบายและชื่อที่แสดงสำหรับแง่มุมต่าง ๆ ของเอนทิตี
  • baseAttributesอ้างอิงแท็กไฟล์สคริปต์อื่นที่กำหนดส่วนประกอบทั่วไปที่ผมไม่ต้องการให้มีการ redefine หลายครั้ง มันมีส่วนประกอบเหมือนposition, liferequirementsและอื่น ๆ หากองค์ประกอบใด ๆ ถูกกำหนดที่นี่อีกครั้งส่วนประกอบนี้จะเขียนทับองค์ประกอบทั่วไป
  • แต่ละ[NAME] { }ชุดจะกำหนดส่วนประกอบใหม่ที่จะถูกเพิ่มเข้าไปในเอนทิตีเหล่านี้
  • คำอธิบายนี้ไม่ได้มีไว้สำหรับเอนทิตีเดียวแต่สำหรับก๊อบลินทั้งหมดที่สร้างขึ้น คุณจะเห็นว่าค่าบางอย่างมีช่วง (เช่น0.01:0.015) เมื่อมีการสร้าง goblin ใหม่มันจะถูกสร้างขึ้นด้วยองค์ประกอบที่มีค่าสุ่มในช่วงนั้น ดังนั้นก็อบลินแต่ละคนจะมีทักษะแตกต่างกันเล็กน้อยและมีความเร็วแตกต่างกันเล็กน้อย การตั้งค่านี้กำหนดว่าก๊อบลินทั้งหมดจะเริ่มต้นด้วยทักษะที่ดีมากในการวางลูกบาศก์และการขุดซึ่งเป็นเพียงเพื่อการทดสอบของฉันเอง แต่เป็นฉันแน่ใจว่าคุณสามารถเดาได้ง่ายมากที่จะเปลี่ยนค่าเป็นสิ่งที่ฉันต้องการ

ทั้งหมดนี้เกี่ยวข้องกับการสร้าง parser ที่กำหนดเองโครงสร้างบางอย่างเพื่อเก็บนิยามเอนทิตี (ฉันเรียกว่า Lexicon!) และโรงงานสำหรับใช้นิยามเอนทิตีเหล่านั้นและสร้างเอนทิตีใหม่ สำหรับฉันระบบนี้ยังอยู่ในช่วงเริ่มต้น แต่มันกลับกลายเป็นว่าดีจริงๆ เป็นระบบที่ทรงพลังสำหรับการกำหนดเอนทิตีอย่างรวดเร็วและอนุญาตให้คุณสร้างเอนทิตีที่คุณต้องการโดยใช้ส่วนประกอบที่คุณสร้างขึ้น หากคุณไม่สะดวกในการสร้างโปรแกรมแยกวิเคราะห์ของคุณเองฉันคิดว่า XML จะใช้งานได้ดี ฉันแปลงของฉันจาก parser แบบเรียกซ้ำแบบ pushback ที่ฉันเขียนขึ้นสำหรับการเขียนโปรแกรมภาษาขึ้นเล็กน้อย

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

  • วิธีที่พวกเขาพบเส้นทาง (การเคลื่อนที่ของเส้นสายตาอย่างง่าย A * แบบง่าย, A * ที่สามารถคาดการณ์ได้ ฯลฯ )
  • พวกเขาก้าวร้าว / ป้องกันอย่างไร เอนทิตีสามารถมีโฮมโซนที่จะได้รับการปกป้อง แต่อาจจะไม่ก้าวร้าวนอกเขตเหล่านั้น
  • การรับรู้เทคโนโลยี (ประตูที่เปิดใช้แกดเจ็ตหลีกเลี่ยงกับดัก ฯลฯ )
  • และอื่น ๆ...

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


ขอบคุณสำหรับการแบ่งปัน. ฉันคิดว่าฉันจะลองใช้รูปแบบ XML ฉันคิดมากเกี่ยวกับเรื่องนั้น (ขอบคุณ AbstractChaos btw) และมันควรเป็นสิ่งที่ฉันต้องการ (อย่างน้อยก็สำหรับคำอธิบายเอนทิตี)
ธาน

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

@ Byte56 ฉันรู้ว่าโพสต์นี้เก่า แต่คุณจะจัดการความสัมพันธ์กับเด็ก ๆ ได้อย่างไร? สมมติว่าเรามีต้นไม้ทักษะและคุณต้องใช้ 10 คะแนนในทักษะ A [0] เพื่อเปิดใช้งาน A [1] และ 10 คะแนนในการเปิดใช้งาน A [2] ฯลฯ ฉันควรทำรังเหล่านี้หรือทำให้แบนและคีย์บน parentId? เห็นได้ชัดว่าพวกมันเท่าเทียมกันอย่างมีเหตุผล แต่ฉันหวังว่าคุณจะมีความเข้าใจในโลกแห่งความจริง
Superstringcheese

@Superstringcheese if player.hasPoints(10) then i++ end skillTree[i]จะเป็น pseudocode บางส่วน อย่างไรก็ตามฉันไม่รู้ว่าคำถามนั้นเกี่ยวข้องกับโพสต์อย่างไร
JDSweetBeat

4

หากสิ่งที่คุณต้องการจริงๆคือวิธีการกำหนดองค์ประกอบของ Monster แล้ว XML จะทำงานได้ดีทั้ง C # และ java มีการใช้งานที่รวดเร็ว

xml ของคุณอาจเป็น

<?xml version="1.0" encoding="UTF-8"?>
<mobs>
  <mob>
    <personality>Aggressive</personality>
    <intelligence>20</intelligence>
  </mob>
</mobs>

จากนั้นคลาส Mob ของคุณอาจมีลักษณะเช่นนั้น (Java)

public class Mob {
  private IPersonality personality;
  private Integer intelligence

  //**  Getters & Setters **//
}

โดยที่ IPersonality เป็นอินเตอร์เฟส

จากนั้นคุณสามารถโหลด xml และแยกแต่ละค่าผ่านทางโรงงาน

ตัวอย่างเช่นการแยกค่าบุคลิกภาพในบุคลิกภาพโรงงานซึ่งเป็นเพียง:

public IPersonality getPersonality(String personalityName) {
  if(personalityName.equals("Aggressive")) {
    return new AggressivePersonality();
  }
  else if(personalityName.equals("Passive")) {
    return new PassivePersonality();
  }
  else {
     //Maybe allow for no personality (We all know monster like that ;) )
     return null; 
  }
}

จากนั้นคุณสามารถตั้งค่าม็อบได้

Mob mob = new Mob();
mob.setPersonality(getPersonality(xmlValue));
mobList.add(mob);

กุญแจสำคัญคือเครื่องยนต์ของคุณรู้รูปแบบของ xml และมีโรงงานสำหรับทุกสิ่งที่ต้องการ

ข้อดีอย่างหนึ่งของ XML คือที่คุณสามารถกำหนดแบบแผนของคุณเองเพื่อให้แน่ใจว่ารูปแบบคือเห็นที่ถูกต้องเสมอนี่

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


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

หากคุณอ่านคลาส Mob เป็น Entity คุณจะสร้าง Enitity (Mob) ใหม่โดยใช้ XML ที่มีส่วนประกอบต่าง ๆ (IPersonality, Intelligence [ตัวอย่างของข้อมูลสำหรับม็อบนั้น] และน่าเสียดายที่ฉันไม่สามารถตอบได้ว่ามันจะมีความยืดหยุ่นเพียงพอหรือไม่เพราะฉันไม่รู้ว่าคุณต้องการให้ทำอะไรมากกว่าที่คุณระบุไว้อย่างไรก็ตาม XML เป็นรูปแบบที่ขอบเขตเดียวเป็นวิธีตีความแต่ละส่วน อัปเดตคำถามของคุณด้วยตัวอย่างโดยละเอียดแล้วฉันจะแสดง xml ที่สามารถจัดการได้ ตรรกะของเกมภายในดูเหมือนว่าควรจะอยู่ภายในหรือไม่
AbstractChaos

0

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

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

หากคุณใช้ Scriptengine (เช่น LUA) คุณสามารถถ่ายโอนรหัสนี้จากโปรแกรมที่คอมไพล์แล้วไปยังไฟล์สคริปต์ที่โหลดระหว่างรันไทม์ ในการทำเช่นนี้คุณจะต้องเปิดเผย API ของ "สัตว์ประหลาด" ของคุณไปยังสคริปต์ ที่ช่วยให้คุณสามารถเรียกวิธีการของรหัสเกมมอนสเตอร์จากภายนอก


API ของสัตว์ประหลาดของฉัน ฉันหมายความว่าฉันจะต้องสามารถสร้างส่วนประกอบใหม่จากสคริปต์ (instanciation) เป็นไปได้ไหม?
ธาน

สิ่งนี้น่าจะเป็นไปได้ คุณสามารถใช้วิธีการผสมของหน่วยเก็บข้อมูลภายนอก (เช่นที่กล่าวถึงโดย abstractchaos หรือ byte56) และภาษาสคริปต์ (LUA, Python ... ) ข้อได้เปรียบหลักของเช่น LUA คือคุณสามารถเปลี่ยนรหัสของคุณในขณะใช้งานจริงและสามารถใช้งานได้ทันทีในเกม / เครื่องมือที่ใช้งานของคุณ
Aron_dc

โฮอย่างจริงจัง? มันเป็นข้อได้เปรียบอย่างมากแน่นอน นอกจากนี้ฉันยังมีของ LUA (หรือภาษาสคริปต์อื่น ๆ ) สำหรับ "เกมไทม์ไลน์" ฉันหมายถึงเพื่อสร้างฉากที่ผู้เล่นจะต้องถูกบล็อกเทพดานี้ต้องย้ายที่นี่แสงที่นี่และที่นั่น ... ดังนั้นฉันอาจจะใช้ภาษาสคริปต์ในการโหลดเอนทิตีได้หรือไม่ นอกจากนี้ฉันจะโพสต์คำถามอื่นเพื่อเปิดเผยวิธีปัจจุบันของฉันในการจัดการเอนทิตี้ / ส่วนประกอบเหนือสิ่งที่ฉันเรียกว่า "ผู้จัดการ" เพื่อดูว่าฉันทำได้ดีหรือไม่
ธาน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.