Noticias

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

Uat is japening jere? [contador aumenta]

Iniciado por Null, Septiembre 03, 2016, 09:14:43 PM

Tema anterior - Siguiente tema
Septiembre 03, 2016, 09:14:43 PM Ultima modificación: Septiembre 04, 2016, 02:30:39 PM por pioj
Tengo un script que controla el hambre de unas
hormigas.
 
Y al principio lo probé con una sola hormiga, y el contador del hambre aumentaba a una velocidad "normal" (1f * Time.deltaTime).
Pero luego lo probé con muchas hormigas a la vez, y vi que el contador de hambre aumentaba
a toda leche.
Entonces me asusté y vine corriendo aquí. 
Aquí está el script, y realmente no entiendo qué pasa:
 

using UnityEngine;
using System.Collections;
[DisallowMultipleComponent]
public class HormigaHambre : MonoBehaviour
{
  public float i_hambre;  // <--- Las variables que empiezan con i_ las uso para verlas en el Inspector...
  public static float hambre; // <--- porque las que son static no se muestran en él.
 
  public bool i_estaComiendo;
  public static bool estaComiendo;
  void Start()
  {
    hambre = 0f;
    estaComiendo = false;
  }
  void Update()
  {
    i_hambre = hambre;
    i_estaComiendo = estaComiendo;
   
    Hambre();
  }
  void Hambre()
  {
    if (!estaComiendo)
       hambre += 1f * Time.deltaTime;
   
    // Límites del hambre.
    if (hambre >= 100f)
       hambre = 100f;
   
    if (hambre <= 0f)
       hambre = 0f;
  }
}

 
 
 
El único script aparte en el que toco la variable hambre, es en este:
 

using UnityEngine;
using System.Collections;
public class Comida : MonoBehaviour
{
  void OnTriggerStay(Collider other)
  {
    if (other.gameObject.tag == "Hormiga")
    {
      HormigaHambre.estaComiendo = true;
      HormigaHambre.hambre -= 10f * Time.deltaTime;
     
      if (HormigaHambre.hambre <= 0f)
      {
        HormigaHambre.estaComiendo = false;
        Destroy(gameObject);   // Después de destruirse, otro script instancia de nuevo este objeto cada 10 segundos.
      }
    }
  }
}

 

No hago nada más raro con ella en ningún otro script.
 
Alguien sabe por qué mientras más hormigas tengo en la escena con el mismo script,
más rápido aumenta mi variable hambre?

El problema lo causan las variables estaticas ya que si mal no recuerdo los valores seran los mismos en todas las hormigas y cuando lo edites en una afecta al resto.
 
Solcuion: no usar variables estaticas, para lo cual en el segundo script tendrias que cambiar todos los HormigaHambre por other.gameObject.GetComponent<HormigaHambre>()
 

using UnityEngine;
using System.Collections;
public class Comida : MonoBehaviour
{
  void OnTriggerStay(Collider other)
  {
    if (other.gameObject.tag == "Hormiga")
    {
      other.gameObject.GetComponent<HormigaHambre>().estaComiendo = true;
      other.gameObject.GetComponent<HormigaHambre>().hambre -= 10f * Time.deltaTime;
     
      if (HormigaHambre.hambre <= 0f)
      {
        other.gameObject.GetComponent<HormigaHambre>().estaComiendo = false;
        Destroy(gameObject);   // Después de destruirse, otro script instancia de nuevo este objeto cada 10 segundos.
      }
    }
  }
}

 
De esta forma ya las variables del script HormigaHambre no tienen que ser estaticas

Cita de: Jose134 date=1472934184El problema lo causan las variables estaticas ya que si mal no recuerdo los valores seran los mismos en todas las hormigas y cuando lo edites en una afecta al resto.
   
   
      Solcuion: no usar variables estaticas, para lo cual en el segundo script tendrias que cambiar todos los HormigaHambre por other.gameObject.GetComponent<HormigaHambre>()
   
   

using UnityEngine;
using System.Collections;
public class Comida : MonoBehaviour
{
  void OnTriggerStay(Collider other)
  {
    if (other.gameObject.tag == "Hormiga")
    {
      other.gameObject.GetComponent<HormigaHambre>().estaComiendo = true;
      other.gameObject.GetComponent<HormigaHambre>().hambre -= 10f * Time.deltaTime;
     
      if (HormigaHambre.hambre <= 0f)
      {
        other.gameObject.GetComponent<HormigaHambre>().estaComiendo = false;
        Destroy(gameObject);   // Después de destruirse, otro script instancia de nuevo este objeto cada 10 segundos.
      }
    }
  }
}

   
      De esta forma ya las variables del script HormigaHambre no tienen que ser estaticas
   


Amigo, lo he hecho y funciona a las mil maravillas ahora.

No sabes cuanto te agradezco.


Aparte al fin podré dejar de usar variables innecesarias también.

Hola, sólo un apunte para el autor del post:
 
Acostumbraros a "clarificar" cuál es la consulta y de qué tipo es. Esto no es un chat privado, es un foro de soporte, y se espera que indiquéis claramente el motivo de postear vuestras consultas. De lo contrario, el post no queda ni claro ni accesible a nadie, y no podremos ayudaros.

Cita de: pioj date=1472992471Hola, sólo un apunte para el autor del post:
   
   
      Acostumbraros a "clarificar" cuál es la consulta y de qué tipo es. Esto no es un chat privado, es un foro de soporte, y se espera que indiquéis claramente el motivo de postear vuestras consultas. De lo contrario, el post no queda ni claro ni accesible a nadie, y no podremos ayudaros.
   


Por suerte Jose134 me ha ayudado.

Pero descuida, la próxima vez lo haré correctamente 

Etiquetas: