Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Resetear la vida

Iniciado por SaraW, Abril 18, 2017, 09:00:02 AM

Tema anterior - Siguiente tema
¡Buenas a tod@s!
 
Os escribo porque me encuentro con el siguiente problema:
 
En mi juego, tengo una script de vida (Script healthbar), esta tiene una imagen y un texto. Al sufrir daño la imagen cambia el "fillAmount" y el valor del texto desciende. Al morir el jugador, se carga otra Scene 2 mostrando la healtbbar anterior (DontDentroyOnLoad, Script "Puntos") . En esa segunda Scene hay un botón que te permite volver a la Scene 1 y aquí esta mi problema. He encontrado en la red cómo guardar el valor de la healthbar original y eliminar la copia pero en mi caso quiero eliminar la original y guardar la copia. ¿Alguien sabe cómo?
 
También he intentado, dejando el valor de la healthbar original, restaurarlo. Pero al hacerlo ya no puedo sufrir daño (Script LoadOnClick).
 
 
 



   
      using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class HealthBar : MonoBehaviour {
    public Transform character;
    public Transform HBImage;
    public Transform HBText;
    public float maxHealth;
    public float currentHealth;
    public float health;

    // Use this for initialization
    void Start () {
        HBImage = gameObject.transform.GetChild().GetChild();
        HBText = gameObject.GetComponentInChildren<Text>().transform;
        HBImage.GetComponent<Image>().fillAmount = 1;
        currentHealth = maxHealth;
    }
    
    public void Damage(float damageAmount)
    {
        health = (currentHealth - damageAmount) / maxHealth;
        currentHealth -= damageAmount;
        currentHealth = Mathf.Round(currentHealth);
        HBImage.GetComponent<Image>().fillAmount = health;
        HBText.GetComponent<Text>().text = currentHealth.ToString();
        if (health <= )
        {
            SceneManager.LoadScene("MenuMuerte");
        }
    }
    void Update(){
    }


 }

   

[/quote]



   
      using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Puntos : MonoBehaviour {
    
    public static Puntos estadoJuego;
    public GameObject primerapuntuacion;


    void Awake (){
            
        if (estadoJuego==null){
            estadoJuego = this;
            DontDestroyOnLoad (gameObject);

        }

        else if (estadoJuego!=this){
            Destroy (gameObject);
        }
    }
}

   

[/quote]



   
      using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class LoadOnClick : MonoBehaviour {
    
    private float health;

    private float maxHealth;
    private float currentHealth;
    public Transform HBImage;
    public float DanoRestaurado = ;
    public GameObject healthBar;

    void Awake(){
        
        healthBar = GameObject.Find ("healthBar");
    }


    public void OnMouseDown(){
        
        healthBar.GetComponent<HealthBar> ().currentHealth = 10;
        healthBar.GetComponent<HealthBar> ().maxHealth = 10;
        healthBar.GetComponent<HealthBar>().Damage (DanoRestaurado);
        SceneManager.LoadScene("Main");

        }

    void Update(){
    }
}


       
   

[/quote]
 


  Muchísimas gracias :)
 
 
 
 
 
 

No he acabado de entender muy bien como están puestos los scripts en los GameObjects, pero entiendo que lo que quieres hacer es eliminar el gameObject del script "Puntos" para que al cambiar a la escena 1 vuelva a iniciar desde zero no? 
 
Si es eso puedes hacerlo de varias maneras:

- Que cuando clickas el botón para cargar la escena 1 destruya el GameObject "Puntos", así el estadoDelJuego volverá a ser null y se volverá a iniciar desde zero.

- Otra opción es destruir el antiguo estadoJuego en el awake del nuevo que aparecerá al cargar la escena Main.

- Pudes utilizar OnSceneLoaded para destruirlo cuando se carga la escena.
 
 
 
Te pongo un ejemplo de la segunda opción:
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Puntos : MonoBehaviour
{
    public static Puntos estadoJuego;
    public GameObject primerapuntuacion;
 
    void Awake()
    {
        string nombreEscena = SceneManager.GetActiveScene().name;
        if (nombreEscena == "Main")
        {
            //Si estamos en al escena principal destruimos el anterior estadoJuego y asignamos el nuevo.
            if(estadoJuego != null)
                Destroy(estadoJuego.gameObject);
            estadoJuego = this;
        }
        else if (nombreEscena != "Main")
        {
            //Si la escena no es la principal lo destruimos (por si estuviera este Script en la escena de Muerte)
            Destroy(this.gameObject);
        }
    }
}

 
 
 
En LoadOnClick te recomiendo que hagas esto para no mal gastar recursos... No necesitas hacer un GetComponent 3 veces y no necesitas tener un Update si está vacío:
 

using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class LoadOnClick : MonoBehaviour {
   
    private float health;
    private float maxHealth;
    private float currentHealth;
    public Transform HBImage;
    public float DanoRestaurado = ;
    public GameObject healthBar;
    void Awake(){
       
        healthBar = GameObject.Find ("healthBar");
    }
 
    public void OnMouseDown(){
        HealthBar hBar = healthBar.GetComponent<HealthBar>();
        hBar.currentHealth = 10;
        hBar.maxHealth = 10;
        hBar.Damage (DanoRestaurado);
         
        SceneManager.LoadScene("Main");
        }
}

 
 
 
Espero que te sirva. Saludos.

¡Muchísimas gracias por tu respuesta @TheBullet! Lo he probado y funciona a excepción de que yo quiero que en la Scene2 aparezca el healthbar copia (el último), el motivo es que lo utilizo como si fuera una puntuación...
 
Sobre qué objetos tienen las Scripts:
 
- Healthbar --> Empty Healthbar (canvas + imagen + texto)
 
- Puntos --> Empty Healthbar (") //Ya que quiero que la healthar se mantenga en la Scene 2, por eso el DontDestroyOnLoad
 
- LoadOnClick --> Boton Scene 2

Cita de: SaraW date=1492516094¡Muchísimas gracias por tu respuesta @TheBullet! Lo he probado y funciona a excepción de que yo quiero que en la Scene2 aparezca el healthbar copia (el último), el motivo es que lo utilizo como si fuera una puntuación...
   
   
      Sobre qué objetos tienen las Scripts:
   
   
      - Healthbar --> Empty Healthbar (canvas + imagen + texto)
   
   
      - Puntos --> Empty Healthbar (") //Ya que quiero que la healthar se mantenga en la Scene 2, por eso el DontDestroyOnLoad
   
   
      - LoadOnClick --> Boton Scene 2
   


¿A que te refieres con "copia"?  En principio con este código el healthbar no se destruye en la segunda escena y solo se destruye al volver a iniciar la primera.

@TheBullet ya está solucionado! No sabes como te agradezco tu ayuda, de verdad :D Dejo por aquí la Script completa por si ayuda a alguien:
 



   
      using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Puntos : MonoBehaviour
{
    public static Puntos estadoJuego;

    void Start()
    {
        GameObject.Find ("healthbar");
        DontDestroyOnLoad (gameObject);

    }

    void Awake()
    {
        string nombreEscena = SceneManager.GetActiveScene().name;

        if (nombreEscena == "Main")
        {
            //Si estamos en al escena principal destruimos el anterior estadoJuego y asignamos el nuevo.
            if(estadoJuego != null)
                Destroy(estadoJuego.gameObject);

            estadoJuego = this;
        }
        else if (nombreEscena != "Main")
        {
            //Si la escena no es la principal lo destruimos (por si estuviera este Script en la escena de Muerte)
            Destroy(this.gameObject);
        }
    }
}

   

[/quote]
 
 

Cita de: SaraW date=1492498802Al morir el jugador, se carga otra Scene 2 mostrando la healtbbar anterior (DontDentroyOnLoad, Script "Puntos") . En esa segunda Scene hay un botón que te permite volver a la Scene 1 y aquí esta mi problema.
   


Hola, y pregunto porque queres pasar la healthBar a la escena 2 si la escena 2 es la escena de muerte no? no serie lo mismo crear un nueva healthBar con salud = 0 ?

Etiquetas: