Как возродить танк после уничтожения в unity? (с задержкой в несколько секунд)

#c# #unity3d

#c# #unity3d

Вопрос:

Функция, которой я достиг до сих пор, заключается в том, что два танка могут стрелять друг в друга и уничтожать друг друга и не могут возродиться после уничтожения. Я попытался снова создать экземпляр tank после его уничтожения, но когда я это сделал, создаваемый объект потерял все свои свойства.(Он больше не становится управляемым или уничтоженным) Моя цель состоит в том, чтобы, когда пуля попадет в танк противника, она уничтожит противника. Противник немедленно исчезнет и воскреснет в позиции по умолчанию (или в любой позиции) после задержки в 4 секунды.

Вот мой код:

пуля публичного класса: MonoBehaviour {

 GameObject tank1;
GameObject tank2;
public int bullet;


// Start is called before the first frame update
void Awake()
{
    tank1 = GameObject.Find("Tank1");
    tank2 = GameObject.Find("Tank2");

}


void OnTriggerEnter2D(Collider2D other)
{   
    //If the bullet from tank 1 hits the object
    if (bullet == 1)
    {
        if (other.tag == "Wall")
        {
            Destroy(this.gameObject);
        }

        if (other.tag == "Tank2")
        {
            Destroy(this.gameObject);
            Destroy(other.gameObject);
            //tank2 = Instantiate(tank2, transform.position, transform.rotation);

        }
    }
    
   //If the bullet from tank 2 hits the object
    else if (bullet == 2)
    {
        if (other.tag == "Wall")
        {
            Destroy(this.gameObject);
        }

        if (other.tag == "Tank1")
        {
            Destroy(this.gameObject);
            Destroy(other.gameObject);
            //tank1 = Instantiate(tank1, transform.position, transform.rotation);
        }
    }
}

private void Respawn()
{

}
 

}

Ответ №1:

Не уничтожайте танк. Выключите его. Включите его снова для возрождения.

 // Turn it off
gameObject.SetActive(false);
 

Создание экземпляра обходится дорого и может привести к сбоям в частоте кадров.

Комментарии:

1. Спасибо, я попробовал SetActive, но после того, как я выключил его, я не могу найти способ включить его. (кстати, я не знаю, как установить время задержки)

Ответ №2:

Чтобы расширить ответ Hanger. Вы бы использовали свою переменную tank, подобную этой, чтобы отключить ее:

 tank1.SetActive(false);
 

Отредактируйте, чтобы включить вторую часть вашего заголовка, задержку. Кроме того, вы захотите установить new Vector3 в методе respawn значение везде, где вы хотите возродить объект.

 GameObject tank1;
GameObject tank2;
public int bullet;


// Start is called before the first frame update
void Awake()
{
    tank1 = GameObject.Find("Tank1");
    tank2 = GameObject.Find("Tank2");

}
    // Toggles active status of GameObject passed to it
void ToggleActiveInScene(GameObject gameObject)
{
    gameObject.SetActive(!gameObject.activeSelf);
}

// If GameObject is disabled, enables and moves it
void Respawn(GameObject gameObject)
{
    if(gameObject.activeSelf == false)
    {
        ToggleActiveInScene(gameObject);
        gameObject.transform.position = new Vector3(7, -2.5f, -0.1f);
    }
}

// A coroutine to delay ToggleActiveInScene
float secondsToWait = 2;
IEnumerator delayedToggleActiveInScene(GameObject gameObject)
{
    yield return new WaitForSeconds(secondsToWait);
    ToggleActiveInScene(gameObject);
}

// // A coroutine to delay Respawn
IEnumerator delayedRespawn(GameObject gameObject)
{
    yield return new WaitForSeconds(secondsToWait);
    Respawn(gameObject);
}

void OnTriggerEnter2D(Collider2D other)
{
    //If the bullet from tank 1 hits the object
    if (bullet == 1)
    {
        if (other.tag == "Wall")
        {
            Destroy(this.gameObject);
        }

        if (other.tag == "Tank2")
        {
            Destroy(this.gameObject);

            // StartCoroutine will start the coroutines like this
            StartCoroutine(delayedToggleActiveInScene(other.gameObject));
            StartCoroutine(delayedRespawn(other.gameObject));
        }
    }

    //If the bullet from tank 2 hits the object
    else if (bullet == 2)
    {
        if (other.tag == "Wall")
        {
            Destroy(this.gameObject);
        }

        if (other.tag == "Tank1")
        {
            Destroy(this.gameObject);
            StartCoroutine(delayedToggleActiveInScene(other.gameObject));
            StartCoroutine(delayedRespawn(other.gameObject));
        }
    }
}