- Home /
Instantiate prefab once help C#
Hi, I'm trying to spawn a health object when the players health is 15 or less but my instantiate creates a loop if I don't pick up the health object instantly. Could anyone help me please?
Code lines: 14, 15, 30, 31, 32, 33, 34, 35, 36, 37
using UnityEngine;
using System.Collections;
public class Player_Health : MonoBehaviour {
public static float curHealth = 100f;
public static float maxHealth = 100f;
public static float decHealth = 5f;
public static float regHealth = 1f;
public static bool levelFail = false;
public GUISkin skin;
public GameObject spawnHealth;
public bool completedHealth;
void Start(){
curHealth = 1;
}
void Update(){
if (curHealth < maxHealth)
{
curHealth += regHealth * Time.deltaTime;
}
if (curHealth <= 0)
{
levelFail = true;
}
if (curHealth <= 15)
{
completedHealth = true;
if(completedHealth = true)
{
Instantiate(spawnHealth);
completedHealth = false;
}
}
}
void OnTriggerStay2D(Collider2D other){
if (other.gameObject.tag == "Darkness")
{
curHealth -= decHealth * Time.deltaTime;
}
}
void OnTriggerEnter2D(Collider2D other){
if (other.gameObject.tag == "Health")
{
Player_Health.curHealth = maxHealth;
Destroy(other.gameObject);
}
}
void OnGUI(){
GUI.skin = skin;
string HealthText = "Your Health: " + curHealth + " / " + maxHealth;
GUI.Box (new Rect(Screen.width /2 - 350, 20, 200, 24), HealthText);
if (levelFail == true)
{
Time.timeScale = 0;
Rect winScreenRect = new Rect(Screen.width/2 - (Screen.width *.5f/2), Screen.height/2 - (Screen.height *.5f/2), Screen.width *.5f, Screen.height *.5f);
GUI.Box(winScreenRect, "Level Failed!");
if (GUI.Button(new Rect(winScreenRect.x + winScreenRect.width - 170, winScreenRect.y + winScreenRect.height - 60, 150, 40), "Retry"))
{
Destroy(gameObject);
Application.LoadLevel(Application.loadedLevel);
Game_Manager.lightsActive = 0;
curHealth = 100f;
levelFail = false;
Time.timeScale = 1;
EndLvl.curHealthGuard = EndLvl.maxHealthGuard;
}
if (GUI.Button(new Rect(winScreenRect.x + 20, winScreenRect.y + winScreenRect.height - 60, 100, 40), "Quit"))
{
Application.LoadLevel(0);
}
}
}
}
The problem--I am assu$$anonymous$$g--is that the health object is being constantly spawn. If that is the case (which the code seems to show), the fix would be to remove: completedHealth = true; in the curHealth 15.
Yeah, this here:
if(completedHealth = true)
is not checking for equivalency, it is assigning true to completedHealth, then it is evaluating the result of that as a boolean expression (which will be true).
In the future, make sure you are using == if you want to check for equivalency. Also, you totally don't have to check for the equivalency of a bool value. Just use
if(completedHealth)
or
if(!completedHealth)
Answer by MarksTeq · Oct 23, 2014 at 01:02 AM
Also change
if (curHealth <= 15)
to
if (curHealth <= 15 && completedHealth == true)
{
Instantiate(spawnHealth);
completedHealth = false;
}
and do this:
void Start(){
curHealth = 1;
completedHealth = true;
}
else it's just going to repeat infinitely because you always just set it back to true
Thank you very much for your help, it's all working now.