ในช่วงหลายทศวรรษที่ผ่านมา โปรแกรมเมอร์เกมได้พัฒนาเทคนิคหลายอย่างเพื่อจัดทำและช่วยแก้ปัญหาในการใช้ "NPC" ที่ชาญฉลาดและสนุกสนาน เทคนิคที่รู้จักมากที่สุดคือ:
- (จำกัด) เครื่องจักรของรัฐ
- ต้นไม้พฤติกรรม
เทคนิคเหล่านี้ช่วยให้โปรแกรมเมอร์เกมและนักออกแบบเกมสามารถย้ำการนำพฤติกรรมของ NPC ไปใช้และยังสามารถให้เหตุผลเกี่ยวกับพฤติกรรมดังกล่าวได้อีกด้วย
ด้วยความนิยมที่เพิ่มขึ้นของ ECS (Entity Component System) คำถามก็เกิดขึ้น: เทคนิคเหล่านั้นเข้ากันได้กับ ECS หรือไม่
ฉันคิดว่าพวกเขาเป็นเช่นนั้น แม้ว่าเราจะต้องตรวจสอบ ในราคาเท่าไหร่ก็ตาม
เริ่มต้นด้วยเครื่องของรัฐ
เครื่องสถานะเป็นตัวเลือกที่ดีมากหากคุณสามารถระบุสถานะแยกกันของ NPC ได้ และหากคุณต้องการจำกัดความเป็นไปได้ในการเปลี่ยนจากรัฐหนึ่งไปอีกรัฐหนึ่ง บ่อยครั้งที่เรายังสามารถกำหนดเหตุการณ์/การกระทำที่จะรับผิดชอบต่อการเปลี่ยนแปลงสถานะ และเหตุการณ์/การกระทำที่จะทริกเกอร์เมื่อมีการดำเนินการเปลี่ยนแปลง
ใน ECS สถานะจะแสดงด้วยส่วนประกอบซึ่งเชื่อมโยงกันโดยเอนทิตี การจัดการสถานะดำเนินการโดยระบบ ซึ่งจะสอบถามเอนทิตีตามประเภทส่วนประกอบ ใน ECS เอนทิตีสามารถเชื่อมโยงกับอินสแตนซ์ประเภทส่วนประกอบบางประเภทได้เพียงอินสแตนซ์เดียวเท่านั้น แต่เนื่องจากเราสามารถมีประเภทส่วนประกอบได้ "ไม่จำกัด" พื้นที่สถานะจึงกลายเป็นอนันต์เช่นกัน
มาดูตัวอย่างที่เป็นประโยชน์มากขึ้น
สัญญาณไฟจราจรสามารถมีได้ 3 สถานะ สีแดง สีเหลือง สีเขียว หากเรากำหนดส่วนประกอบของธงสำหรับทุกรัฐ เราจะสามารถเพิ่มทั้งสามองค์ประกอบให้กับเอนทิตีเดียวกันได้ ซึ่งทำลายตรรกะของเรา เพื่อกำหนดข้อจำกัดให้กับสถานะ เราสามารถกำหนดองค์ประกอบได้เพียงองค์ประกอบเดียว: TrafficLightStateComponent
ซึ่งเก็บค่า enum
TrafficLightState
ซึ่งมี 3 กรณี red, yellow, green
ด้วยวิธีนี้ เราสามารถตรวจสอบให้แน่ใจว่าเอนทิตีซึ่งเป็นตัวแทนของสัญญาณไฟจราจรสามารถอยู่ในสถานะที่ถูกต้องเพียงสถานะเดียวเท่านั้น
แล้วข้อจำกัดในเรื่องการเปลี่ยนแปลงของรัฐล่ะ?
สมมติว่าเราต้องการให้แน่ใจว่า red
ไม่สามารถเปลี่ยนเป็น green
ได้โดยตรงโดยไม่อยู่ในสถานะ yellow
จริงๆ แล้วนี่ซับซ้อนกว่ามาก สิ่งที่เราสามารถทำได้คือนำ TrafficLightStateComponent
ไปใช้ในลักษณะที่นักพัฒนาซอฟต์แวร์ไม่สามารถตั้งค่าได้โดยตรง แต่ใช้วิธีการเปลี่ยนรูปแบบสาธารณะเท่านั้น ซึ่งจะตรวจสอบว่าการเปลี่ยนแปลงที่เราต้องการดำเนินการนั้นเป็นไปได้หรือไม่
แล้วการดำเนินการกับการเปลี่ยนแปลงสถานะล่ะ?
การเปลี่ยนแปลงสถานะในสถานการณ์ ECS ของเราคือการอัปเดตค่าส่วนประกอบ มีแนวคิดเกี่ยวกับระบบรีแอกทีฟ โดยที่ระบบ (หรือโค้ดบางอย่างในระบบ) จะถูกดำเนินการไม่ใช่ทุกขีด แต่จะดำเนินการเพียงครั้งเดียวเท่านั้น หลังจากการเปลี่ยนแปลงในสถานะเอนทิตีเกิดขึ้น
การใช้งานที่เป็นไปได้ใน Unity ECS
สิ่งที่ฉันอธิบายไว้ในย่อหน้าสุดท้ายสามารถนำไปใช้ได้ในระยะเวลาที่เหมาะสมโดยโปรแกรมเมอร์ผู้มีทักษะ อย่างไรก็ตาม อย่างที่ฉันพูดถึงไปแล้ว เทคนิค AI ไม่เพียงสร้างขึ้นเพื่อทำให้โปรแกรมเมอร์มีความสุขเท่านั้น แต่ยังเพิ่มศักยภาพให้กับนักออกแบบเกมและช่วยให้ทั้งสองฝ่ายเข้าใจ พฤติกรรม NPC ที่ซับซ้อนโดยการแสดงภาพสถานะปัจจุบันในการรันแอปพลิเคชัน
เพื่อให้บรรลุผลทั้งหมดนี้ เราจำเป็นต้องมีเครื่องมือแก้ไข ซึ่งจะช่วยให้เรากำหนดสถานะและการแปลงสถานะได้ เครื่องมือนี้ควรให้ความเป็นไปได้ในการสร้างประเภทส่วนประกอบที่แสดงถึงสถานะและวิธีการแปลงสถานะที่ถูกต้อง เครื่องมือนี้ยังสามารถสร้างโครงสร้างพื้นฐานสำหรับระบบที่มีปฏิกิริยาได้อีกด้วย และสุดท้ายแต่ไม่ท้ายสุด ควรให้ความเป็นไปได้ในการเลือกเอนทิตีที่มีประเภทสถานะขณะรันไทม์ และดูว่าสถานะนั้นอยู่ในสถานะใดในปัจจุบัน
ต้นไม้พฤติกรรม
ในความคิดเห็นที่ต่ำต้อยของฉัน ต้นไม้พฤติกรรมเป็นวิธีที่ดีเยี่ยมในการควบคุมโฟลว์ของอัลกอริธึมที่ซับซ้อน กำหนดค่าได้ และ "แสดงได้" ในระดับหนึ่งของนามธรรม ทุกสิ่งที่เราสามารถทำได้ด้วยแผนผังพฤติกรรมนั้นสามารถทำได้ด้วยภาษาการเขียนโปรแกรมสำหรับวัตถุประสงค์ทั่วไป แต่นักออกแบบเกมไม่สามารถเข้าถึงได้ และเป็นการยากที่จะประเมิน โดยเฉพาะหากคุณมีเครื่องมือในการแสดงภาพสถานะของแผนผังพฤติกรรมในขณะรันไทม์
จากการฉายแนวคิดบน ECS เราตระหนักดีว่าแผนผังพฤติกรรมสามารถเป็นตัวแทนรหัสภายในของระบบได้ โหนดปลายสุด (การดำเนินการและเงื่อนไข) ของแผนผังพฤติกรรมสามารถทำงานได้โดยตรงในโลกของเอนทิตี หรือสำเนาของค่าจากโลกของเอนทิตี
มีคำถามที่น่าสนใจมากมาย
- ต้นไม้ควรถูกกระตุ้นทุกครั้งหรือไม่?
- เราควรสนับสนุนสถานะโหนดที่ทำงานอยู่และในขณะที่ทริกเกอร์แผนผัง ต้นไม้ควรข้ามไปยังโหนดที่ทำงานล่าสุดโดยตรงหรือไม่
- โหนดควรทำงานกับกลุ่มของเอนทิตีหรือในเอนทิตีเดียว?
- เราควรจะทำให้ต้นไม้ทำงานแบบขนานสำหรับทุกเอนทิตีโดยใช้งานหรือไม่?
- ต้นไม้ควรถูกนำเสนออย่างไร (ในตัวแก้ไข)?
- โหนดต้นไม้ควรมีพารามิเตอร์ / สถานะของตัวเองหรือควรกำหนดทุกอย่างด้วยส่วนประกอบและเอนทิตี?
ทั้งหมดนี้เป็นคำถามที่ยอดเยี่ยมและ IMHO เป็นการยากที่จะให้คำตอบที่ชัดเจน ฉันเดาว่าคำตอบเดียวที่สมเหตุสมผลคือ:
ขึ้นอยู่กับ Behavior Tree Tooling ที่คุณจินตนาการ
คุณต้องระบุผลประโยชน์ที่แท้จริงที่คุณต้องการได้รับจากการแสดงอัลกอริทึม NPC พร้อมแผนผังพฤติกรรม และนอกเหนือจากประโยชน์และข้อผิดพลาดแล้ว ข้อจำกัดของ ECS ยังนำมาสู่ประเด็นสำคัญอีกด้วย และอย่าลืม:
ถ้าไม่พอดีก็อย่าฝืน