Respawn GameObject yang Hancur (Musuh)

Saya sedang menulis game (platformer 2D) dan saya mencoba membuat musuh respawn saat pemain respawn. Saya tidak bisa memuat ulang level begitu saja karena saya memiliki beberapa objek yang dimuat saat level dimuat, sehingga akan menyebabkan beberapa masalah. Sebagai gantinya, untuk menghidupkan kembali pemain, saya mengembalikannya ke lokasi awalnya (dan saya menangani nyawa yang hilang dan detail lainnya).

Seorang pemain menghancurkan musuh dengan memukul kepalanya, sebagai berikut (di OnTriggerEnter pada pemain):

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
    }

Seperti yang Anda lihat, saya menghancurkan objek musuh sepenuhnya. Untuk mengetahui musuh mana yang berada, saya menambahkan mereka ke daftar (disimpan dalam GameObject terpisah) saat pembuatan. Daftar ini dibuat di objek respawning musuh yang terpisah, sebagai berikut:

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

Saya mencoba memanggil fungsi yang memunculkan kembali semua minion dalam daftar di lokasi aslinya dengan menelusuri daftar. Fungsinya adalah sebagai berikut:

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);
    }
}

Saya tahu bahwa ini bukanlah metode yang paling optimal dalam hal waktu untuk menghapus semua musuh dan memunculkan kembali semuanya, dan jika logika ini salah atau jika Anda tahu cara yang lebih baik, saya terbuka untuk ide-ide baru.

Masalah dengan ide ini adalah, saya mendapatkan kesalahan:

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.

Sepertinya saya menambahkan referensi ke minion yang ada ke dalam daftar daripada salinannya. Bagaimana caranya agar musuh bisa respawn dengan baik, pada posisi semula?


person muttley91    schedule 21.04.2013    source sumber
comment
Mengapa tidak menyimpan status musuh sebagai kelas/struct dan meneruskan nilai-nilai yang disimpan tersebut untuk membuat instance? Jika Anda perlu memulihkan lebih dari posisi/orientasi, membuat serial objek Anda atau tidak menghancurkannya, cukup nonaktifkan objek game dan aktifkan kembali saat memulai ulang level.   -  person Jerdak    schedule 21.04.2013
comment
Apa yang Anda maksud dengan menempatkan negara sebagai kelas/struct? Bagaimana ini bisa membantu menghidupkan kembali musuh? Apakah saya akan meneruskan posisi/orientasi ke fungsi respawn dan membuat instance objek yang sama sekali baru? (Saya akan mempertimbangkan untuk menonaktifkan/mengaktifkannya tetapi saya ingin tahu tentang apa yang Anda maksud dengan pernyataan pertama.)   -  person muttley91    schedule 21.04.2013
comment
Aku seharusnya lebih jelas. Yang saya tunjukkan adalah bahwa tujuan Anda adalah untuk membuat instance kembali musuh Anda di lokasi awal mereka. Sejalan dengan enemylist Anda dapat memiliki enemyposition atau daftar serupa yang menyimpan sesuatu seperti Vector3 atau kelas khusus yang berisi informasi musuh yang relevan seperti kehidupan awal, posisi, orientasi, dll.   -  person Jerdak    schedule 21.04.2013
comment
Itu pendekatan yang menarik. Saya akhirnya memposting jawaban Anda untuk menonaktifkan saja daripada menghancurkan sebagai jawaban atas pertanyaan ini. Jika Anda lebih suka saya memilihnya sebagai jawaban Anda, Anda dapat mempostingnya dan saya akan mengambil jawaban Anda!   -  person muttley91    schedule 21.04.2013
comment
Tidak apa-apa, saya senang dengan karma komentar. :) Jangan ragu untuk menerima jawaban Anda sendiri.   -  person Jerdak    schedule 22.04.2013


Jawaban (1)


Saya mengikuti saran Jerdak dan, alih-alih Menghancurkan musuh, saya menonaktifkan mereka. Dengan cara ini, mereka masih ada, dan saya dapat mengulang dan mengaktifkan kembali semua musuh yang dinonaktifkan (dibunuh).

person muttley91    schedule 21.04.2013