Noticias

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

Instanciar y no cambiar propiedades (Resources)

Iniciado por Alex, Septiembre 11, 2018, 04:47:50 PM

Tema anterior - Siguiente tema
Buenas!
 
estaba terminando mi sistema de vida y me tope con el problema de que al cargar mi barra de vida desde resourses cuando mi jugador ya no tiene vida la barra se escala a 0 (de 100% a 0%) el problema cae en que al volver a iniciar el juego la barra se guardo en 0% y no del 100% como debería ser alguien sabe a que se debe? tal vez omití algo
 
<
 
Pnl_Vida es el canvas
 
healthBar es el prefab de la barra
 


   GameObject instance = Instantiate(Resources.Load("Pnl_Vida", typeof(GameObject))) as GameObject;


    

 


   private void HealthRender(float maxHealth)


       {


           float _health = health/maxHealth;


           healthBar.rectTransform.localScale = new Vector3(_health,


               healthBar.rectTransform.localScale.y,healthBar.rectTransform.localScale.z);


       }

 
>
 
psdt: uso el multijugador de unity así que ya tiene el (isLocalPlayer) el problema es que luego de usarlo una vez a la siguiente ya no hay barra al 100%
 
si alguien tiene la respuesta se lo agradecería!

Cita de: Alex date=1536677270alguien sabe a que se debe?
   


Ah que se guarda con health = 0% ? sin tener el contexto de guardado es casi imposible decirte, parece que la relación está bien, los floats están bien así que no tenés el típico "auto cast" a int que te trunca el número. Por qué es que le pasas un maxHealth? no será que la estás cagando por ahí? ... Igual, en vez de escalar te conviene cambiar el "fillAmount" de un "Image" (creo), queda mucho mejor.

@lightbug he vuelto a hacer el código un poco más simple siguiendo tu consejo con el fillAmount
 

public class PlayerHealth : NetworkBehaviour {
 
public float health = 120f;
public Image HealthBar;
void Start () {
   HealthBar.fillAmount = health;
   
GameObject instance = Instantiate(Resources.Load("Pnl_Vida", typeof(GameObject))) as GameObject;
}
void Update()
{
   if(!isLocalPlayer)
   return;
   if(!IsAlive())   
   {
      //estoy muerto
      GameObject instance = Instantiate(Resources.Load("Pnl_Muerte", typeof(GameObject))) as GameObject;
      gameObject.SetActive(false);
      
   }
}
public void AddHealth( float amount)
{
   health = health + amount+ amount; //si amount negativo, decremento vida  20  -10  10 // cada amount es + 10 de vida
   if(health >= 100)
   {
      health = 100;
   }
   else if(health <= 0f)
   {
      health = 0f;
   }
}
public bool IsAlive()
{
   if(health <= 0f)
   {
      return false;
   }
   else
      return true;
}
public void GetHit(float amount)
{
   health -= amount;
if(health <= 0) health = 0;
HealthBar.fillAmount = health;
 
}
}

 
el problema es que ahora al instanciar el Pnl_Vida  cuando mi jugador es atacado, su fillamount no se escala  como debe ser, en su script del carro si se reduce de 120 a menos(ignora el 120 de vida tambien puede ser 100) creo que cuando instancio mi panel en el editor no se relaciona con el healthbarr del script o se queda independiente, alguna ayuda?

Primero, deberias revisar el porque tu script no esta instanciando en el lugar correcto el Prefab Pnl_Vida, este debe estar dentro de un Canvas -
 
Segundo, el propio script tiene problemas de logica -
 
Tercero, FillAmount funciona en un rango de 0 a 1, por lo que para que funcione correctamente deberias saber cual es el máximo de salud que tiene el objeto y que este devida el valor actual para tener un rango de 0 - 1.
 

public int MaxHealth = 135;
public int CurrentHealth = 80;
public float GetHealthPercent()
{
return (float)CurrentHealth / (float)MaxHealth;
}

 
....
 
Fuera de la problemática ¿Porque requieres instanciar el "Panel de salud"?

@francoe1 intentaré con el maxhealth nuevamente, el Pnl de vida ya trae su canvas y se instancia sin problemas, quiero instanciar el Panel porque las escenas donde la utilizo estan separadas, no es conveniente tener un canvas para todas las escenas y el player para hacer que se pueda poner la barra de vida en su casilla necesita que los dos objetos esten o bien en la jerarquía o en los assets (en mi caso en el resourses)

Etiquetas: