I have just made a mistake but I can’t figure out what I have done wrong. I have tried rewriting it a few times but still it does not work. The first part works as I get the reading “Dead” and the player dies. But then I don’t get the next reading or the respawn. Please can you help me.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class KillPlayer : MonoBehaviour {
public GameObject player;
public GameObject playerPrefab;
public GameObject respawn;
void OnTriggerEnter (Collider other) {
Destroy (player);
Debug.Log ("Dead");
}
void Respawn() {
if (GameObject.FindGameObjectWithTag("Player") == null) {
Instantiate (playerPrefab, GameObject.Find("Respawn").transform.position, Quaternion.identity);
Debug.Log("Respawn");
}
}
}
I would rewrite it in such a way as to check for something…So something like this…
public GameObject player;
public GameObject playerPrefab;
public GameObject respawn;
private bool isDead = false;
void OnTriggerEnter (Collider other)
{
if( !isDead)
Destroy (player);
Debug.Log ("Dead");
}
void Update()
{
if( isDead )
Respawn();
}
void Respawn()
{
if (GameObject.FindGameObjectWithTag("Player") == null) {
Instantiate (playerPrefab, GameObject.Find("Respawn").transform.position, Quaternion.identity);
Debug.Log("Respawn");
}
}
this way you can check every frame…IF at ANY TIME the player becomes dead…it will call the respawn method…Thats something your not doing is CALLING the respawn method…
I do not see anywhere in your code where you are actually calling your Respawn() method. I assuming you are hoping that by destroying the player that the GameObject.FindGameObjectWithTag of the player would be null and instantiate your player again, but in order for that to work you would need to call Respawn() in the Update() method of that script. You essentially need this;
void Update()
{
Respawn();
}
As far as being efficient, that is certainly not it. You could look into calling Respawn() after the Dead debug, or if you want a timer look into a coroutine to handle this. GameObject.FindGameObjectWithTag is not the type of code you want in an update method for performance reasons, but for learning it can get you going in the right direction.