ฉันสามารถใช้พฤติกรรมการหมุนพวงมาลัยหรือลอจิกเพื่อให้โทรศัพท์มือถือล้อมอีกข้างได้อย่างไร


10

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

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

ตัวอย่าง:

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

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


1
การสแต็คเป็นเพียงข้อกังวลที่ปลายทางหรือในระหว่างการขนส่งหรือไม่ ฉันคาดเดาหลัง
SpartanDonut

@SpartanDonut
Vaughan Hilts

@KromStern ฉันเพิ่มรูปภาพหวังว่าจะช่วยได้
Vaughan Hilts

คำตอบ:


15

ให้ตัวแทนของคุณอ่อนแอ "ประจุไฟฟ้า" เพื่อให้พวกเขาขับไล่กันตามสายของกฎหมายของ Coulomb

สมมติว่าสำหรับความเรียบง่ายที่ mobs ควรผลักกันออกไปด้วยความแข็งแรงเท่ากันมันก็เพียงพอที่จะใช้แรงระหว่าง mobs ทุกคู่ที่มีขนาดsome_constant / distance^2ซึ่งsome_constantเป็นแรงผลักที่กำหนดและdistanceระยะทางแยกพวกเขา

จุดแข็งของการขับไล่นั้นจะตกลงมาด้วยกำลังสองของระยะทาง

ธรรมชาติของรหัสมีตัวอย่างที่ดี (กับการสาธิตสด)ที่นี่ ดูเหมือนว่านี้:

ติดตามรวมและแยกพฤติกรรม

การจับคู่ทุกองค์ประกอบต่อกันเป็นการดำเนินการกำลังสอง ( O(n^2)) ถ้าคุณมีจำนวนมากจริงๆตัวแทนคุณอาจต้องการที่จะเพิ่มประสิทธิภาพการคำนวณแรงที่มีประมาณบาร์นส์ฮัทซึ่งจะนำมันลงเพื่อเข้าสู่ระบบเชิงเส้น ( O(n log n)) แต่ต้องใช้ควอดทรี


ลิงค์ที่ยอดเยี่ยม Anko ชื่นชมมาก! ฉันจะต้องอ่านอย่างละเอียดทั้งไซต์นี้
Vaughan Hilts

ตาร์คราฟ (1 อย่างน้อย) ทำสิ่งที่คล้ายกับหน่วยการบินของมัน แต่มันทำเมื่อหยุดเคลื่อนไหวเท่านั้นคือเมื่อพวกมันเคลื่อนที่พวกเขาก็จะรวมตัวกันเป็นกอง ๆ (ไม่สนใจซึ่งกันและกันว่าเป็นอุปสรรค) แต่เมื่อพวกเขาหยุดพวกเขาก็เริ่มกระจายออกจากสิ่งที่ดูเหมือนจะเป็น ศูนย์ท้องถิ่นของพื้นที่ปกติบางส่วน (สี่เหลี่ยมจัตุรัส / วงกลมอาจ) ที่ครอบคลุมพวกเขา นี้ไม่ได้ดูเป็นสวยเป็นตัวอย่างในคำตอบ แต่มันอาจใช้ทรัพยากร CPU น้อยลงและมันอาจจะง่ายต่อการรหัสเกินไป ...
Shivan มังกร

@ShivanDragon SC2 นำเสนอพฤติกรรมแบบเดียวกันพวกเขาทั้งหมดมารวมกันที่ปลายทางในฝูงชนจากนั้นมีพื้นที่ว่างสำหรับรูปลักษณ์ที่ดูสมจริงและน่าพึงพอใจ
Kroltan

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

1

วิธีการของฉันคล้ายกับ @ Anko แต่ขึ้นอยู่กับการทำงานโดยมิลลิงตันและ Funge จากปัญญาประดิษฐ์สำหรับเกม

นี่เป็นลักษณะของการแยก แต่คุณต้องคำนึงว่าความเร็วนี้ควรคำนวณด้วยความเร็วของเอเจนต์ในฟังก์ชันอัปเดต

public Vector3 GetSeparationVel (float threshold, float decayCoefficient)
{
    threshold = threshold * threshold;
    Vector3 separationVelocity = Vector3.Zero;
    for (int i = 0; i < enemies.Length; i++) {
        if (enemies[i] == this) {
            continue;
        }
        Vector3 direction = this.position - enemies[i].position;
        float distance = direction.LengthSquared();
        float strenght = 0.0f;
        if (distance < (threshold)) {
            strenght = Math.Min(decayCoefficient / distance, this.maxAccel);
            direction.Normalize();
            separationVelocity += strenght * direction;
        }
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.