ต้นไม้พฤติกรรม :: การกระทำที่ใช้เวลานานกว่าหนึ่งขีด


19

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

ตัวอย่างเช่นด้านล่างเป็นรูปภาพของแผนผังพฤติกรรม:

ป้อนคำอธิบายรูปภาพที่นี่

ตอนนี้ให้เราสมมติว่าพฤติกรรมDrive To Enemyใช้เวลามากกว่าสองสามซ้ำในต้นไม้ ดังนั้นในการขับผ่านไปยังศัตรูแต่ละครั้งจะถูกเรียกเพราะตอนนี้อยู่ในสถานะ ใช้งาน

ปัญหาคือฉันต้องการเรียกEvade Enemyหาก Enemy อยู่ใกล้ ๆ และการพิจารณาว่าDrive To Enemyมักถูกเรียกว่าฉันไม่เคยได้รับโอกาสที่จะเรียกEvade Enemy ( ควรเรียกว่าหลีกเลี่ยงศัตรู )

  • ฉันควรสำรวจ Tree EACHผ่านไม่ว่า Action จะทำงานอะไร
  • ฉันจะทำในสิ่งที่ถูกต้องหรือไม่
  • วิธีที่เหมาะสมในการจัดการพฤติกรรมดังกล่าวคืออะไร?

ตอนแรกถูกถามใน Stackoverflow ความคิดที่นี่น่าจะเหมาะกว่าที่จะถามคำถามนี้


1
คำตอบที่ให้ไว้ที่นี่ช่วยไหม? gamedev.stackexchange.com/questions/51693/…
Tetrad

นั่นเป็นคำถามของฉัน ฉันจะโพสต์คำถามนี้เป็นความคิดเห็น แต่คิดว่าควรเป็นคำถามแยกต่างหาก
แลนเซอร์ฟรี

คำตอบ:


16

ดูภาพที่ฉันให้ไว้ในคำตอบก่อนหน้าของฉัน:

ป้อนคำอธิบายรูปภาพที่นี่

หากคุณนึกภาพว่าโหนด 1 คือ 'Evade Enemy' และโหนด 2 คือ 'Chase Enemy' คุณจะเห็นว่าแม้ว่าในการทำซ้ำครั้งที่สอง (เมื่อทุกอย่างเป็นสีเขียวยกเว้น '2' และ 'B' เมื่อการทำซ้ำครั้งที่สอง เริ่มต้น) 'Evade Enemy' ยังคงได้รับการตรวจสอบก่อน เมื่อ 'Evade Enemy' ล้มเหลวเนื่องจากไม่มีศัตรูอยู่ใกล้จึงเปิดใช้งาน 'Chase Enemy' อีกครั้ง เมื่อมีการเยี่ยมชม 'Chase Enemy' อีกครั้งจะสังเกตว่าอยู่ในสถานะ 'กำลังทำงาน' และข้ามไปที่ 'B' โดยตรง

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

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


2
ขอบคุณสำหรับคำอธิบายที่ดีอีกข้อหนึ่ง ฉันมีเวลายากที่จะเข้าใจธรรมชาติของต้นไม้พฤติกรรมซ้ำซาก ฉันจะถามคุณในความคิดเห็นของคำถามสุดท้าย แต่ไม่ต้องการเปลี่ยนความคิดเห็นให้เป็น QA ที่ยาว แม้ว่าหนึ่งคำถามสุดท้ายนี่คือทั้งหมดที่ทำให้ตอนนี้ มีความแตกต่างระหว่างตัวเลือกและลำดับในการจัดการสถานะการทำงานหรือไม่? ดูเหมือนว่าตัวเลือก (โหนด 0) จะตรวจสอบโหนด 1 ก่อนในขณะที่ลำดับ "โหนด 2" ไม่ได้ตรวจสอบโหนด A ในการทำซ้ำครั้งที่สอง
แลนเซอร์ฟรี

4
เป็นคำถามที่ดีฉันคิดว่าคุณเข้าใจแล้ว โหนด 2 ไม่ได้ตรวจสอบโหนด A เนื่องจากโหนด A นั้นเสร็จสมบูรณ์ เมื่อโหนด 2 ถูกทำเครื่องหมายเป็น 'กำลังทำงาน' จะสังเกตว่าโหนด B เป็นโหนดที่กำลังทำงานอยู่ คุณสามารถสันนิษฐานได้ว่าถ้าโหนดกำลังทำงานหมายความว่าโหนดก่อนหน้าไม่จำเป็นต้องตรวจสอบอีกครั้ง
MichaelHouse

คุณรีเซ็ตตัวเลือกรูท (0) เป็น "READY" หลังจากตั้งค่าเป็น "RUNNING" หลังจากการทำซ้ำครั้งแรกหรือไม่
แลนเซอร์ฟรี

ฉันเชื่อว่ามีเพียงพาเรนต์ของโหนดที่ทำงานเท่านั้นที่ถูกตั้งค่าให้ทำงาน จำเป็นต้องตั้งค่ารูทให้พร้อมแทนที่จะทำงานเนื่องจากเราต้องแยกวิเคราะห์โหนด (1) อีกครั้ง
MichaelHouse

3
นั่นเป็นทางเลือกหนึ่ง คุณสามารถอัปเดตได้บ่อยครั้งหรือนานเท่าที่คุณต้องการ ทุกๆ 300 มิลลิวินาทีถ้าคุณต้องการหรือทุกเฟรม หรือคุณสามารถมีการอัปเดตแบบตายตัวเช่นเดียวกับการอัพเดทที่ถูกกระตุ้นเพื่อจัดการกับเหตุการณ์ ต้นไม้พฤติกรรมเช่นเดียวกับโครงสร้างส่วนใหญ่เช่นนี้ไม่ได้กำหนดไว้อย่างเคร่งครัด ควรใช้วิธีที่ดีที่สุดสำหรับเกมของคุณ หากประเมินว่าทุกเฟรมสิ้นเปลืองมากเกินไปอย่าทำอย่างนั้น คุณยังสามารถ จำกัด จำนวนเวลาที่ใช้ในการประเมินทรีและรับในเฟรมถัดไปหากคุณต้องการ มีตัวเลือกมากมาย
MichaelHouse
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.