วิธีการ wire machine state finite ให้เป็นสถาปัตยกรรมที่อิงองค์ประกอบ [ปิด]


23

เครื่องรัฐดูเหมือนจะก่อให้เกิดการพึ่งพาที่เป็นอันตรายในสถาปัตยกรรมที่ใช้ส่วนประกอบ

มีการจัดการการสื่อสารระหว่างเครื่องรัฐและส่วนประกอบที่ดำเนินพฤติกรรมที่เกี่ยวข้องกับรัฐอย่างไรโดยเฉพาะ

ฉันอยู่ที่ไหน:

  • ฉันใหม่กับสถาปัตยกรรมที่อิงองค์ประกอบ
  • ฉันกำลังสร้างเกมต่อสู้แม้ว่าฉันไม่คิดว่ามันจะสำคัญ ฉันนึกภาพเครื่องรัฐของฉันถูกใช้เพื่อสลับสถานะเช่น "หมอบคลาน", "ห้าว", "ปิดกั้น" ฯลฯ
  • ฉันพบว่าเทคนิคการจัดการสถานะนี้เป็นระบบที่เป็นธรรมชาติที่สุดสำหรับสถาปัตยกรรมที่อิงองค์ประกอบ แต่มันขัดแย้งกับเทคนิคที่ฉันได้อ่าน: ระบบส่วนประกอบของวัตถุเกมแบบไดนามิกสำหรับตัวละครพฤติกรรมที่ไม่แน่นอนมันแสดงให้เห็นว่า ตัวเองโดยการตรวจสอบเงื่อนไขการเปิดใช้งานอย่างต่อเนื่อง
  • ฉันคิดว่าการกระทำเช่น "วิ่ง" หรือ "เดิน" เข้าท่าเป็นเรื่องของรัฐซึ่งไม่เห็นด้วยกับคำตอบที่ยอมรับได้ที่นี่: /gamedev//a/7934
  • ฉันพบสิ่งนี้มีประโยชน์ แต่ไม่ชัดเจน: จะใช้พฤติกรรมอย่างไรในสถาปัตยกรรมเกมที่อิงส่วนประกอบได้อย่างไร มันแสดงให้เห็นว่ามีองค์ประกอบแยกต่างหากที่มีอะไรนอกจากเครื่องรัฐ แต่สิ่งนี้จำเป็นต้องมีการเชื่อมต่อระหว่างส่วนประกอบเครื่องรัฐกับส่วนประกอบอื่นเกือบทั้งหมด ฉันไม่เข้าใจวิธีจัดการข้อต่อนี้ นี่คือการเดาบางอย่าง:

    A. ส่วนประกอบขึ้นอยู่กับเครื่องของรัฐ:
    ส่วนประกอบได้รับการอ้างอิงถึงส่วนประกอบของเครื่องของgetState()รัฐซึ่งจะส่งกลับค่าคงที่การแจงนับ คอมโพเนนต์อัปเดตตัวเองเป็นประจำและตรวจสอบสิ่งนี้ตามความจำเป็น

    B. สถานะของเครื่องจักรขึ้นอยู่กับส่วนประกอบ: ส่วนประกอบ
    สถานะของเครื่องได้รับการอ้างอิงถึงส่วนประกอบทั้งหมดที่มีการตรวจสอบ มันสอบถามgetState()วิธีการของพวกเขาเพื่อดูว่าพวกเขาอยู่ที่ไหน

    C. สิ่งที่เป็นนามธรรมระหว่างพวกเขา
    ใช้ฮับเหตุการณ์? รูปแบบคำสั่ง?

    D. แยกสถานะของวัตถุที่
    ใช้เป็นส่วนประกอบของรูปแบบสถานะอ้างอิง วัตถุสถานะแยกถูกสร้างขึ้นซึ่งเปิดใช้งาน / ปิดการใช้งานชุดของส่วนประกอบ เครื่องรัฐสลับระหว่างวัตถุสถานะ

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

คำตอบ:


7

ภาพรวมค่อนข้างเบา แต่ลองดูสไลด์เหล่านี้จากงานนำเสนอที่ฉันทำกับเกมใหม่เมื่อปีที่แล้ว:

https://docs.google.com/presentation/d/110MxOqut_y7KOW1pNwIdcccisIA3ooJwVR-xm-ecuc4/view

(ดูภาพที่เกี่ยวข้องด้านล่าง)

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

มันมีความสำคัญเช่นเดียวกับการสร้างระบบการจัดองค์ประกอบพิเศษสำหรับพฤติกรรม AI มุ่งไปที่การผสมผสานระหว่างพฤติกรรมที่คุณต้องการสำหรับระบบ AI ที่ง่ายขึ้น

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

แม้แต่พฤติกรรมเช่น "stun" ซึ่งจริงๆแล้วมีเพียง StunBehaviorAction ที่ผลักลงบนสุดของรายการแอ็คชั่น ถ้าพฤติกรรม stun ถูกเปิดใช้งาน (หลังจากสังเกตว่า EarsComponent ของวัตถุในเกมได้ยินการโจมตีด้วยคลื่นกระแทกที่น่าตื่นตะลึง) จากนั้นก็ตั้งค่าสถานะภายในเป็น Stunned บอก AnimationComponent ให้เล่น Animation stun และตั้งค่าสถานะการกระทำเป็น Blocking และจับเวลา หมดเวลา stun ที่ดึงมาจาก EnemyParametersComponent ของวัตถุเกม เนื่องจากเป็นการบล็อกและที่ด้านบนสุดของรายการการกระทำไม่มีพฤติกรรมใด ๆ ในรายการการกระทำที่จะได้รับวิธีการอัปเดตที่เรียกว่าดังนั้นพวกเขาจึงต้องปิดตัวลง เมื่อหมดเวลาหมดอายุ StunBehaviorAction ตั้งค่าสถานะเป็น Idle และสถานะการกระทำเป็น NonBlocking

พฤติกรรมอื่น ๆ ที่เรานำมาใช้นั้นเกือบทั้งหมดนำมาใช้กับเครื่องสถานะภายในเครื่องเดียว จริง ๆ แล้วมีเพียงสองเครื่องเท่านั้นที่ไม่ได้ใช้กลไกของรัฐคือ PatrolPathBehaviorAction (มันจะผลักชุด PathAction ไปสู่รายการแอ็คชั่นหากไม่ได้ใช้งานซึ่งจะผลักดัน MoveAction ของ) และ GuardHomeBehaviorAction (ที่ด้านล่างของ รายการการกระทำและจะเพียงแค่กด PathAction กลับไปยังตำแหน่งบ้านของศัตรู) พฤติกรรมอื่น ๆ ทุกอย่างเป็นเครื่องของรัฐ

สไลด์ 10 สไลด์ 25 สไลด์ 26


อะไรคือความแตกต่างพื้นฐานระหว่าง "พฤติกรรม" และ "การกระทำ"
Pup

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

3

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

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


ดังนั้นส่วนประกอบย่อย AI กำลังทำงานจริงหรือ พวกเขามีอยู่เป็นส่วนประกอบเอนทิตีในระดับเดียวกับส่วนประกอบ AI หรือไม่
Pup

ส่วนประกอบย่อยในเครื่องยนต์ของเราเป็นส่วนหนึ่งของคลาสคอมโพเนนต์พื้นฐาน ดังนั้นใด ๆComponentซึ่งได้มาจากBaseComponentอาจมีหมายเลขใด ๆ ของSubComponents กับมัน Update()วิธีการในการBaseComponentที่จะตรวจสอบรายชื่อของส่วนประกอบย่อยและโทรUpdate()ในบรรดา Subcomponentsเป็นตัวเลือกทั้งหมดดังนั้นBaseComponentอาจไม่มี นอกจากนี้ข้อความใด ๆ ที่ไปยังคอมโพเนนต์จะถูกส่งไปยังคอมโพเนนต์ย่อยด้วยเช่นกัน
Nic Foster

1

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

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