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