En este momento estás viendo ¿Por qué la salud de mi jugador no cambia cuando yo quiero?

 – Unity

¿Por qué la salud de mi jugador no cambia cuando yo quiero? – Unity

¿Por qué la salud de mi jugador no cambia cuando yo quiero?

– UnityAssets3Free

buenas , por aqui josel luis y esta vez os traigo
esta pregunta

En mi juego, tengo un jugador con salud y estoy tratando de agregar una barra de salud, pero mi único problema es que cuando mi jugador pierde hp, mi barra de salud no cambia. En mis scripts, el script que actualiza la barra de salud está vinculado a mi script de salud, pero cuando mi jugador pierde hp, el hp del jugador no cambia en la barra de salud y no estoy seguro de por qué. Sé que el jugador pierde hp, por lo que el problema es que, aunque los scripts están vinculados, el hp no cambia en el script separado. El script para mi barra de salud:

Lo siento si el código es malo, soy un programador novato.

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

public class HealthBArScript : Health
   

    private void Update()
         
        transform.localScale = new Vector3(healthPoints / 100, 1.0f, 1.0f);
    



El guión para mi salud si es necesario:

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

public class Health : MonoBehaviour
   
    public float healthPoints = 100.0f; 
    private Coroutine onHit = null;

    private void Update()
    
        StartCoroutine(Updaate());      
    

    IEnumerator Updaate()
           
        if (healthPoints <= 0)
        
            Destroy(gameObject);
        

        if (healthPoints >= 101.0f)
        
            healthPoints = 100.0f;
        

        yield return new WaitForSeconds(2.0f);
    
    
    private void OnTriggerEnter(Collider coll)
    
        if (coll.gameObject.tag == "Zombie")
        
            if (onHit == null)
                onHit = StartCoroutine(HitDelay());
        

        if(coll.gameObject.tag == "Health")
        
            healthPoints = healthPoints + 10; 
        

        if (coll.gameObject.tag == "Health_1")
        
            healthPoints = 100.0f;
        
    

    IEnumerator HitDelay()
    
        healthPoints = healthPoints - 25;
        yield return new WaitForSeconds(2.0f);
        onHit = null;
       




2 respuestas 2

Déjame decirte algunas cosas básicas sobre unity programación y por qué algunas cosas no tienen mucho sentido.

1.- La clase Monobehaviour es la clase que necesitas heredar cuando necesitas lidiar con el mismo comportamiento que el gameobject en la escena. Esto se puede adjuntar a gameObjects en el editor para programar el comportamiento común de gameobjects como posición, rotación, etc. Es por eso que esta clase contiene los métodos para ello, Start(), Update() etc.

2.- La herencia hace que tu tipo de clase contenga todas las características de la clase padre (la clase de la que heredas) y las nuevas que agregas en tu clase hija. A menos que necesite una clase que use algunos o todos los métodos/propiedades de Health, no necesita heredar de él. Después public class HealthBArScript : Health No tiene sentido. Heredar significa mantener todas las funciones principales más algunas nuevas especializadas.

Comprobar cualquier herencia individual ejemplo para obtener el punto.

3.- Update() se llama una vez cada cuadro, aproximadamente 60 veces por segundo. Es por eso que configurar la escala todo el tiempo, en la actualización:

private void Update()
     
    transform.localScale = new Vector3(healthPoints / 100, 1.0f, 1.0f);

No tiene sentido. Puede establecer esto en el editor, en el componente Transformar o en el Start() del componente Monobehaviour correspondiente en caso de que necesite algo de lógica.

4.- En cuanto a las corrutinas, no necesitas corrutinas para lo que estás haciendo. Puedes leer el documentación. Además, estás iniciando una rutina en Update()

private void Update()

    StartCoroutine(Updaate());      

Lo que probablemente bloqueará tu juego o algo inesperado. Comenzaría a manejar mi código de la manera más simple posible en Update() y en métodos monoheviour, y cuando surja la necesidad se puede explorar el uso de rutinas, ya que se deben usar con cuidado.

Finalmente:

Parece que tu jugador y tu barra de curación deben ser dos clases diferentes que heredan de Monobehavior. Es fácil porque los objetos del juego de diferentes tipos a menudo necesitan su clase heredada de monocomportamiento de repuesto mientras las cosas se mantienen simples. Por lo tanto, debe comunicar estas dos clases para que cuando el jugador pierda hp, su barra de curación disminuya la cantidad en alguna pantalla. Por supuesto, con cualquier pequeño tutorial puedes llegar a ese punto.

Lo que quiere hacer es NO hacer que su barra de salud herede el script de Salud. La herencia le permitirá extender la clase, eso no es lo que quiere hacer aquí. En su lugar, desea una referencia a una instancia de la clase Salud desde el script de la barra de salud.

Pon salud en el objeto del juego que necesita salud. jugador, enemigo, etc.

public class Health : MonoBehaviour

    // The actual health value
    //
    public float healthPoints;

Y coloque la barra de salud en su elemento de interfaz de usuario:

public class HealthBar : MonoBehaviour

    // A reference to the Health we want to display
    //
    public Health trackedHealth;

    void Update()
    
        transform.localScale = new Vector3(trackedHealth.healthPoints / 100, 1, 1);
    

Desde el inspector, arrastrará el objeto con el script de estado adjunto a la variable trackedHealth del script de la barra de estado. Ahora tiene una referencia a la salud que mostrará.

Escalar la transformación a Actualizar será suficiente por ahora, pero considere alejarse de Actualizar para estos cambios poco frecuentes. Para pruebas y aprendizaje rápidos, esto está perfectamente bien.

nota: si aun no se resuelve tu pregunta por favor dejar un comentario y pronto lo podremos de nuevo , muchas gracias

sin mas,hasta la proxima

Deja una respuesta