วิธีการใช้พฤติกรรมในสถาปัตยกรรมเกมตามองค์ประกอบ?


21

ฉันเริ่มใช้ผู้เล่นและศัตรู AI ในเกม แต่ฉันสับสนเกี่ยวกับวิธีการนำสิ่งนี้ไปใช้ในสถาปัตยกรรมเกมตามส่วนประกอบได้ดีที่สุด

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

อย่างที่ฉันเห็นฉันมีสองวิธีดำเนินการ:

  • สร้างส่วนประกอบ AI เดียวที่มีลอจิกของผู้เล่นทั้งหมด (แยกออกจากองค์ประกอบจริงหรือฝังเป็น PlayerAIComponent) ฉันสามารถบังคับใช้ข้อ จำกัด ของรัฐได้อย่างง่ายดายโดยไม่ต้องสร้างการเชื่อมต่อระหว่างส่วนประกอบแต่ละอย่างที่ประกอบกันเป็นเอนทิตีของผู้เล่น อย่างไรก็ตามส่วนประกอบ AI ไม่สามารถแตกหักได้ ตัวอย่างเช่นถ้าฉันมีศัตรูที่สามารถยืนและเดินไปมาหรือเดินไปรอบ ๆ และแกว่งดาบเป็นครั้งคราวฉันต้องสร้างส่วนประกอบ AI ใหม่
  • แยกพฤติกรรมออกเป็นส่วน ๆ โดยระบุแต่ละสถานะ ฉันได้รับ StandComponent, WalkComponent และ SwingComponent ในการบังคับใช้กฎการเปลี่ยนแปลงฉันต้องจับคู่แต่ละองค์ประกอบ SwingComponent ต้องปิดการใช้งาน StandComponent และ WalkComponent ในช่วงระยะเวลาของการสวิง เมื่อฉันมีศัตรูที่ยืนอยู่เฉยๆแกว่งดาบเป็นครั้งคราวฉันต้องแน่ใจว่า SwingComponent นั้นปิดการใช้งาน WalkComponent หากมีอยู่ แม้ว่าสิ่งนี้จะช่วยให้ส่วนประกอบผสมและการจับคู่ที่ดีขึ้น แต่ก็สามารถนำไปสู่ฝันร้ายในการบำรุงรักษาได้เมื่อมีการเพิ่มการพึ่งพาแต่ละครั้งส่วนประกอบที่มีอยู่จะต้องได้รับการอัปเดตเพื่อให้เล่นได้ดีขึ้นกับข้อกำหนดใหม่

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

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

แก้ไข : ฉันสงสัยว่ามีความสับสนเกี่ยวกับสิ่งที่ฉันหมายถึงกับสถานการณ์ที่หนึ่งและสอง ฉันพยายามอธิบายในแผนภาพด้านล่าง

แผนภาพส่วนประกอบ

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

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


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

2 ไม่ใช่ตัวเลือกที่ทำงานได้
โคโยตี้

คำตอบ:


6

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

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

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

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


รูปแบบของรัฐไม่ได้บ่งบอกถึงสถานการณ์แรกใช่หรือไม่ สิ่งนี้ส่งผลให้ AIComponent เดียวใช้เครื่องสถานะที่มีวัตถุสถานะที่แตกต่างกัน สิ่งที่ฉันหมายถึงด้วยตัวเลือกที่สองคือ WalkComponent และ SwingComponent นั้นเป็นประเภทเดียวกันกับที่พูดว่า RenderComponent และ PhysicsComponent
ผี

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

คุณหมายถึงการเพิ่ม AIComponent ให้กับเอนทิตีในแผนภาพ 2 ซึ่งจะควบคุม Stand / Walk / Swing-Component หรือไม่ แนวคิดของฉันคือส่วนประกอบส่งสัญญาณบล็อกหรือเปิดใช้งานตามเงื่อนไขบางประการ ตัวอย่างเช่น SwingComponent จะส่งสัญญาณทั่วไปเช่นสัญญาณ "bound_feet" เมื่อเริ่มต้นและ "release_feet" เมื่อเสร็จสิ้นการสวิง WalkComponent จะปิดใช้งานและเปิดใช้งานตัวเองตามสัญญาณเหล่านี้ เนื่องจาก 'การเปลี่ยนสถานะ' ถูกห่อหุ้มไว้ในส่วนประกอบด้วยตนเองผู้ออกแบบจึงไม่จำเป็นต้องให้โปรแกรมเมอร์เดินสายส่วนประกอบเข้าด้วยกัน
ผี

@ghostonline ใช้งานได้ดีกับสิ่งต่าง ๆ ที่มีกฎตายตัวเช่น "ไม่สามารถเดินได้ในขณะที่แกว่ง" แต่แล้วการเปลี่ยนระหว่างขาตั้งและเดินล่ะ? หากยืนอยู่ในความควบคุมจะรู้ได้อย่างไรว่าจะลองเดินได้อย่างไร ตรรกะการยืนอาจต้องการเลือกการเดินหรือการแกว่งซึ่งได้รับผลกระทบจากการขาดความสามารถในการเดิน - ควรเลือกที่จะแกว่งในกรณีนั้นเสมอ แต่ฉันคิดว่าคุณกำลังติดตามถูก
Tesserex

2

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

สำหรับ NPC ฉันเห็น StandComponent และ WalkComponent เป็นลักษณะของสิ่งเดียวกัน คุณเคยมี WalkComponent โดยไม่มี StandComponent หรือไม่? ฉันสงสัยมัน. เช่นเดียวกัน RunComponent ก็จะเป็น WalkComponent ที่มีความเร็วสูงขึ้นและภาพเคลื่อนไหวที่แตกต่างกัน ฉันสามารถเห็นคุณค่าของการมี NPCMovementComponent และ NPCSwordFighterComponent แยกจากกัน แต่ถึงแม้จะรู้สึกว่าเป็นเรื่องที่ครอบงำฉันก็ตาม


ฉันจะไม่แยกการเคลื่อนไหวของ NPC และการเคลื่อนไหวของผู้เล่นมากขนาดนั้น การเคลื่อนไหวของการเคลื่อนไหวที่ขับเคลื่อนภาพเคลื่อนไหวและฟิสิกส์นั้นสามารถแบ่งปันได้อย่างแน่นอน มันคือสิ่งที่เลือกการกระทำหรือช่วงการเปลี่ยนภาพที่แตกต่าง (ผู้เล่นรับข้อมูลในขณะที่ AI คือ ... AI) ฉันยอมรับว่าคุณมี PlayerController แต่คุณก็มี AIController ซึ่งทั้งสองอย่างนี้สามารถใช้ Movement Components / Swing Components เพื่อให้งานเคลื่อนไหว / ฟิสิกส์จริงเสร็จสิ้น
homebrew

จริง ฉันสมมติว่าวัตถุที่เคลื่อนไหวทั้งหมดมี PhysicsComponent หรือ MovementComponent ที่จัดการการเคลื่อนไหวของพวกเขาและ PlayerController และ AIController จะใช้มันเพื่อจัดการกับการเคลื่อนไหว การเคลื่อนไหวควรเป็นองค์ประกอบที่แยกจากกันอย่างแน่นอนเนื่องจากอาจมีสิ่งที่ต้องย้ายที่ไม่มี AI หรือมี AI ที่ง่ายที่สุดที่เป็นไปได้ (วัตถุฟิสิกส์ใบ้เช่นลังหรือขยะ)
Gregory Avery-Weir

2

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

เครื่องจักรสถานะ จำกัด C ++

ด้านบนมีตัวอย่างที่เป็นรูปธรรมของเครื่องสถานะใน c ++ ที่ผู้เล่นและ AI สามารถใช้งานได้


1

สิ่งที่คุณต้องการคือส่วนประกอบที่จัดการการเคลื่อนไหวของตัวละคร (ผู้เล่นและ NPC) ส่วนประกอบ AI หรือส่วนประกอบของผู้เล่นจะส่งคำสั่งไปยังองค์ประกอบการเคลื่อนไหวนี้และจะตรวจสอบว่าการกระทำสามารถเริ่มต้นได้ สิ่งนี้จะหุ้มข้อ จำกัด การเคลื่อนไหวของคุณไว้ในองค์ประกอบเดียว รหัส AI และรหัสผู้เล่นของคุณไม่จำเป็นต้องรู้ว่าจะใช้งานดาบสวิงได้อย่างไร AI จะมีสถานะภายในเช่น Idle, Attack, Fleeing


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