เกิดใหม่ทำลาย GameObject (ศัตรู)

ฉันกำลังเขียนเกม (เกมแพลตฟอร์ม 2 มิติ) และฉันกำลังพยายามให้ศัตรูเกิดใหม่เมื่อผู้เล่นเกิดใหม่ ฉันไม่สามารถโหลดระดับใหม่ได้เนื่องจากมีวัตถุบางอย่างที่โหลดเมื่อระดับโหลด ดังนั้นอาจทำให้เกิดปัญหาบางอย่างได้ เพื่อที่จะเกิดใหม่ให้กับผู้เล่น ฉันจะต้องส่งมันกลับไปยังตำแหน่งเริ่มต้น (และฉันจะจัดการกับชีวิตที่หายไปและรายละเอียดอื่น ๆ )

ผู้เล่นทำลายศัตรูด้วยการตีศัตรูที่หัว ดังต่อไปนี้ (ใน OnTriggerEnter บนผู้เล่น):

if(otherObject.CompareTag("Minion")) //hit by minion
    {
        if(hitFromTop(otherObject.gameObject)) //if player jumped on enemy
        {
            otherObject.GetComponent<Minion>().setMoving(false); //stop moving
            playSound(KillEnemySound); //play killing enemy sound
            jump();
            Destroy(otherObject.gameObject); //kill minion

        }
                    //else hurt player
    }

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

void Start ()
{
    enemyList = GameObject.FindGameObjectsWithTag("Minion");
    Debug.Log ("Adding all minions to list");
}

ฉันกำลังพยายามเรียกใช้ฟังก์ชันที่สร้างมินเนี่ยนทั้งหมดในรายการที่ตำแหน่งเดิมโดยดูจากรายการ ฟังก์ชั่นมีดังนี้:

public void RespawnAll()
{
    foreach(GameObject minion in enemyList)
    {
        Destroy(minion); //make sure to respawn ALL minions
    }
    Debug.Log ("Respawning all");
    foreach(GameObject minion in enemyList)
    {
        Debug.Log ("instantiating minions from list");
        Instantiate (minion, minion.GetComponent<Minion>().origPosition, Quaternion.identity);
    }
}

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

ปัญหาของแนวคิดนี้คือ ฉันได้รับข้อผิดพลาด:

MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it. Your script should either check if it is null or you should not destroy the object.

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


person muttley91    schedule 21.04.2013    source แหล่งที่มา
comment
ทำไมไม่เก็บสถานะของศัตรูเป็นคลาส/โครงสร้าง แล้วส่งผ่านค่าที่เก็บไว้เหล่านั้นเพื่อสร้างอินสแตนซ์ล่ะ หากคุณต้องการคืนสถานะมากกว่าตำแหน่ง/การวางแนว ไม่ว่าจะทำให้วัตถุของคุณเป็นอนุกรมหรือไม่ทำลายมัน เพียงแค่ปิดการใช้งานวัตถุเกมและเปิดใช้งานอีกครั้งเมื่อเริ่มระดับใหม่   -  person Jerdak    schedule 21.04.2013
comment
คุณหมายถึงอะไรโดยการวางสถานะเป็นคลาส/โครงสร้าง? สิ่งนี้จะช่วยเกิดใหม่ของศัตรูได้อย่างไร? ฉันจะส่งตำแหน่ง/การวางแนวไปยังฟังก์ชันการเกิดใหม่และสร้างอินสแตนซ์ของวัตถุใหม่ทั้งหมดหรือไม่ (ฉันกำลังจะพิจารณาปิดการใช้งาน/เปิดใช้งาน แต่ฉันอยากรู้ว่าคุณหมายถึงอะไรในข้อความแรก)   -  person muttley91    schedule 21.04.2013
comment
ฉันควรจะชัดเจนกว่านี้ สิ่งที่ฉันชี้ให้เห็นก็คือเป้าหมายของคุณคือการสร้างศัตรูของคุณขึ้นมาใหม่ ณ ตำแหน่งเริ่มต้นของพวกเขา ขนานกับ enemylist คุณสามารถมี enemyposition หรือรายการที่คล้ายกันซึ่งจัดเก็บบางอย่างเช่น Vector3 หรือคลาสแบบกำหนดเองที่มีข้อมูลศัตรูที่เกี่ยวข้อง เช่น ชีวิตเริ่มต้น ตำแหน่ง ทิศทาง ฯลฯ   -  person Jerdak    schedule 21.04.2013
comment
นั่นเป็นแนวทางที่น่าสนใจ ฉันลงเอยด้วยการโพสต์คำตอบของคุณเพื่อปิดการใช้งานแทนที่จะทำลายเป็นคำตอบสำหรับคำถามนี้ หากคุณต้องการให้ฉันเลือกเป็นคำตอบของคุณ คุณสามารถโพสต์ไว้ได้ แล้วฉันจะรับคำตอบของคุณแทน!   -  person muttley91    schedule 21.04.2013
comment
ไม่เป็นไร ฉันพอใจกับความคิดเห็นกรรม :) อย่าลังเลที่จะยอมรับคำตอบของคุณเอง   -  person Jerdak    schedule 22.04.2013


คำตอบ (1)


ฉันทำตามคำแนะนำของ Jerdak และแทนที่จะทำลายศัตรู ฉันปิดการใช้งานพวกมัน ด้วยวิธีนี้ พวกมันยังคงอยู่ และฉันสามารถวนซ้ำและเปิดใช้งานศัตรูทั้งหมดที่ถูกปิดการใช้งาน (ถูกสังหาร) ได้อีกครั้ง

person muttley91    schedule 21.04.2013