- Home /
The question is answered, right answer was accepted
My script to kill the player and respawn, does nothing?
I've been trying to get answers from on here for a day or 2 now, and I cannot seem to find one. Each answer = new question. I think I am getting closer, before I had an error, now it just doesn't do anything. (I probably did something stupid somewhere) I am very new to coding, so don't expect me to understand a lot (Do you know any good tutorial series?). I basically want to get rid of the PlayerMovement, and then 2 seconds later get rid of Mesh, BoxCollider, if Health <= 0, (In case it goes negative or something). And then, after five seconds, I want all three of those to come back. And then, Health = 100. I thought I had the code right, but when health = 0, nothing happens. Thanks in advance for the help (And possibly a good series to watch on youtube for c# coding)
Here is the script:
using UnityEngine;
using System.Collections;
public class AttributeDeclaration : MonoBehaviour {
#region Public ints
public int Health = 100;
public int Magic = 100;
public int Strength = 100;
public int Stamina = 100;
public int Defense = 100;
//Maximum attributes
public int MaxHealth = 100;
public int MaxMagic = 100;
public int MaxStrength = 100;
public int MaxStamina = 100;
public int MaxDefense = 100;
//Testing Stuff
public int DamageAmount = 20;
//---------------------------------------------------------------------------------------------
#endregion
public PlayerLevelDeclaration PT;
public PlayerMovement PM;
public HealthPotion HP;
//----------------------------------------------------------------------------------------
void Awake(){
newPos = transform.position;
}
//-------------------------
// Use this for initialization
void Start () {
}
//-----------------------------------------------------------------------------------------
// Update is called once per frame
void Update () {
PT = gameObject.GetComponent<PlayerLevelDeclaration>();
HP = gameObject.GetComponent<HealthPotion>();
PM = gameObject.GetComponent<PlayerMovement>();
TempDamageHealth();
TempDamageStamina();
TempDamageMagic();
TempDamageStrength();
TempDamageDefense();
DisallowNegative();
KillPlayer();
}
//----------------------------------------------------------------------------------------
void DisallowNegative(){
if(Health <= 0)
{
Health = 0;
}
if(Stamina <= 0)
{
Stamina = 0;
}
if(Magic <= 0)
{
Magic = 0;
}
if(Strength <= 0)
{
Strength = 0;
}
if(Defense <=0)
{
Defense = 0;
}
}
//-----------------------------------------------------------------------------------------
public int TempDamageHealth()
{
if(Input.GetKeyDown(KeyCode.Keypad1))
{
Health = Health - DamageAmount;
}
return Health;
}
//-------------------------------------------------------------------------------------
public int TempDamageStamina()
{
if(Input.GetKeyDown(KeyCode.Keypad2))
{
Stamina = Stamina - DamageAmount;
}
return Stamina;
}
//--------------------------------------------------------------------------------------
public int TempDamageMagic()
{
if(Input.GetKeyDown(KeyCode.Keypad3))
{
Magic = Magic - DamageAmount;
}
return Magic;
}
//------------------------------------------------------------------------------------------
public int TempDamageStrength()
{
if(Input.GetKeyDown(KeyCode.Keypad4))
{
Strength = Strength - DamageAmount;
}
return Strength;
}
//----------------------------------------------------------------------------------
public int TempDamageDefense()
{
if(Input.GetKeyDown(KeyCode.Keypad9))
{
Defense = Defense - DamageAmount;
}
return Defense;
}
//--------------------------------------------------------------------
Vector3 newPos;
bool IsAlive = true;
IEnumerator KillPlayer(){
if(Health <= 0)
{
IsAlive = false;
Health = 0;
//Hopefully this makes it so the player can't move as soon as Health = 0, but doesn't disappear and lose
//collision until after 2 seconds. Then, 5 seconds later, the player's position is set to 0, 0, 0, and
//He regains movement, reappears, and regains collision.
//Kill Player
PM.enabled = false;
yield return new WaitForSeconds(2f);
renderer.enabled = false;
collider.enabled = false;
PM.enabled = false;
//Wait 5 seconds
yield return new WaitForSeconds(5f);
//Set position code;
Vector3 PlayerSpawn = new Vector3(0f , 0f , 0f);
newPos = PlayerSpawn;
transform.position = newPos;
//Rest
renderer.enabled = true;
collider.enabled = true;
PM.enabled = true;
IsAlive = true;
Health = MaxHealth;
}
yield return IsAlive == true;
}
}
Have you already watched this? I'd recommend trying something like this:
bool $$anonymous$$illPlayerRunning = false;//used so that we only have 1 coroutine running at a time.
void Update(){
...//othercode
if(Health <= 0 && !$$anonymous$$illPlayerRunning){
StartCoroutine($$anonymous$$illPlayer());
$$anonymous$$illPlayerRunning = true;
}
}
Then you need to make sure that at the end of $$anonymous$$illPlayer() you set "killPlayerRunning = false" so that you can die again.
Thank you very much, I went with Harshad$$anonymous$$'s method, but this is useful as well. Thanks again, about to ask another question. I love Unity xD
Answer by HarshadK · Nov 19, 2014 at 06:25 AM
You need to call your KillPlayer() coroutine using either of the methods provided by @Sir-Irk.
I would also suggest you to not call your KillPlayer() coroutine from Update rather call it only once when the health is zero. You can do it from the disallowNegative() function as below:
void DisallowNegative(){
if(Health <= 0)
{
Health = 0;
StartCoroutine(KillPlayer()); // Or you can also use StartCoroutine("KillPlayer");
}
Follow this Question
Related Questions
Multiple Cars not working 1 Answer
Distribute terrain in zones 3 Answers
C# Help - Respawn or Reset 1 Answer
Respawning without creating Clones 2 Answers
Alternative to Update 1 Answer