Есть несколько способов архивировать это.
Обратите внимание, что вы также можете работать полностью без сопрограмм, но обычно это отстой
private float timer;
private bool isRespawning;
private GameObject clone;
private void DestroyObject(GameObject obj)
{
isRespawning = true;
timer = 3f;
// first make a clone of the current Object
var clone = Instantiate(obj, obj.transform.position, obj.transform.rotation, objtransform.parent);
// disable the clone
clone.SetActive(false);
// Destroy the original
Destroy(obj);
}
private void Update()
{
if(Mathf.Approximately(timer,0f)) return;
timer += Time.deltaTime;
if(timer > 0) return;
// Set the clone active
clone.SetActive(true);
timer = 0;
}
Более простым будет сопрограмма:
private void DestroyAndRespawn(GameObject obj)
{
StartCoroutine(DestroyAndRespawnRoutine(obj));
}
private IEnumerator DestroyAndRespawnRoutine(GameObject obj)
{
// first make a clone of the current Object
var clone = Instantiate(obj, obj.transform.position, obj.transform.rotation, objtransform.parent);
// disable the clone
clone.SetActive(false);
// Destroy the original
Destroy(obj);
// Wait 3 seconds
yield return new WaitForSeconds(3f);
// Set the clone active
clone.SetActive(true);
}
Но зачем вам уничтожать объект и возрождать его?Вы можете просто отключить, а затем снова включить его
private void DestroyAndRespawn(GameObject obj)
{
StartCoroutine(DestroyAndRespawnRoutine(obj));
}
private IEnumerator DestroyAndRespawnRoutine(GameObject obj)
{
// disable the obj
obj.SetActive(false);
// Wait 3 seconds
yield return new WaitForSeconds(3f);
// Set the objactive
obj.SetActive(true);
}
Обновление
Поскольку вы хотите вызвать его при столкновении:
Вам понадобится еще один GameObject, который работает в качестве диспетчера для перезапуска / включения, отключая, поскольку вы не можете просто прикрепить этот скрипт к объекту, который вы отключаете -> также отключит скрипт и никогда не включит его снова.
- Создайте новый пустой GameObject, например с именем "RespawnManager"
Создайте новый скрипт RespawnManager.cs:
public class RespawnManager : MonoBehaviour
{
public static RespawnManager Singleton;
private void Awake()
{
if(Singleton)
{
enabled = false;
return;
}
Singleton = this;
}
private void DestroyAndRespawn(GameObject obj)
{
StartCoroutine(DestroyAndRespawnRoutine(obj));
}
private IEnumerator DestroyAndRespawnRoutine(GameObject obj)
{
// disable the obj
obj.SetActive(false);
// Wait 3 seconds
yield return new WaitForSeconds(3f);
// Set the objactive
obj.SetActive(true);
}
}
Чем вы можете позвонитьэто при столкновении, как
OnCollisionEnter(Collision obj)
{
if (obj.gameObject.name != "bullet") return;
// pass this GameObject to the manager
RespawnManager.Singleton.DestroyAndRespawn(gameObject);
}