Noticias

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

error de concepto en funcionamiento de datos entre variables

Iniciado por sirkain, Agosto 26, 2015, 06:27:29 AM

Tema anterior - Siguiente tema
Gente, buenas noches, soy Pablo, estoy dando vueltas y necesitaría una mano de como resolver algo que parece simple pero no me resulta tanto

el concepto base seria (para mi juego de estrategia) 

*armas o construcciones que gastan energía 
*generadores que suministran energía 
por cuestiones puramente estratégicas, necesito poder construir varios generadores 
y "juntar" todo lo generado. 

peeero he aquí el problema, lógicamente nosé ni cuantas armas ni cuantos generadores se van a construir! 

el concepto base seria 
consumo_total = arma1 + arma2 + arma3 ...etc 
generacion_total = generador1 + generador2 + generador3 ...etc 

pensé entonces colocar en un gameobject persistente el script de calculos 
y en cada arma o generador a instanciar coloco el script donde esta seteado el Consumo o Generación electrica
el problema es que si hay UN solo objeto instanciado o puesto a mano para pruebas, los calculos dan bien. 
si pongo 2, 3, 10, etc, solo se contabilizan los datos del 1er objeto colocado! 
(recuerden que no sé puede saber nunca cuantos objetos se van a colocar durante el juego) 

dejo un resumen de los 2 scripts para no agotar con codigos ajenos al tema 
/////////////////////////////////////////////////////////////////////////////////////////////// 
SCRIPT QUE VA DENTRO DE LOS GameObject ARMAS o GENERADORES 
//------------------------------------------------------- 
#pragma strict 

public var_Energ_Generada: int; //desde el inspector voy cambiando los valores para ver como reaciona el script calculador 
public var_Energ_Consumida : int; //desde el inspector voy cambiando los valores para ver como reaciona el script calculador 
var var_Diferencia_Cosumos: int; 

var ObjetoconScript : GameObject; 

private var scp_calculos: scp_ENERG_CALCULADOR; //aca arrastro el script calculador 

//------------------------------------------------------- 
function Start(){ 
scp_calculos = ObjetoconScript.GetComponent(scp_ENERG_CALCULADOR); //armo el sanwitch... 
} 
//------------------------------------------------------- 
function Update () { 
//envio datos al script encargado de calcularlos 

//creo que aca es donde algo estoy haciendo mal. 
//yo pense que en cada ciclo el programa leeria, el script del arma y lo agregadira a la variable, 
//luego leeira el del generador y lo agregaria a la variable, y al repetir los ciclos se agregarian 
//alternadamente los datos de cada script, pero solo se suman los del primer script  

scp_calculos.var_Energia_Total_Generada = Energ_Generada; //le paso lo que genera ESTE objeto 
scp_calculos.var_Energia_Total_Consumida = Energ_Consumida; //le paso lo que consume ESTE objeto 
} 

/////////////////////////////////////////////////////////////////////////////////////////////// 

/////////////////////////////////////////////////////////////////////////////////////////////// 

/////////////////////////////////////////////////////////////////////////////////////////////// 
SCRIPT ENCARGADO DE LOS CALCULOS (va en el GameObject persistente) 
//------------------------------------------------------- 
#pragma strict 

var var_Energia_Total_Generada: int; 
var var_Energia_Total_Consumida: int; 

function Update () { 
var_Diferencia_Consumos = var_Diferencia_Consumos + (var_Energia_Total_Generada - var_Energia_Total_Consumida); 
} 



//-------------muestra los textos en pantalla para tener una idea de que pasa------------ 
function OnGUI(){ 
GUI.BeginGroup (new Rect (100,0,6000,300));
GUI.Label(Rect(10,20,400,40), "DATOS RECIBIDOS:") ; 
GUI.Label(Rect(10,40,400,60), "GENERADOR: " + var_Energia_Total_Generada); 
GUI.Label(Rect(10,60,400,80), "MOTOR: " + var_Energia_Total_Consumida); 
GUI.Label(Rect(10,80,400,100), "Diferencia de consumos: " + var_Diferencia_Consumos); 
GUI.EndGroup (); 
} 
/////////////////////////////////////////////////////////////////////////////////////////////// 


Muchas veces he leido en el foro que cuando se agradece por adelantado muchos se quejan, pero que VOS pierdas TU tiempo en leer esto, ya es digno de agradecer! 
asi que MUCHAS GRACIAS POR TU TIEMPO, y si me das una mano espero algún día poder retribuir (NO sexualmente!!!! tampoco la pavada)

A ver si lo pillo. Arrastras el script pero luego lo vuelves a recoger de un gameobject en el start. Son iguales los scripts?

HOLA. Si bueno como dije antes en realidad solo extraje una porcion pequeña del codigo (la que ni me anda bien)  para no liar.Y tenia varias formas distintas de acceder al script persistente.  Y cuando no me funciono correctamente puse todos los objetos en escena para descartar errores ya que todo es instanciado y agregue la linea de "arrastre " y ahora que lo señalas veo que quedo de manera redundante.No estoy delante del pc. Pero no creo que eso afecte (aunque no estoy seguro ya que programar mediante scripts es muy distinto a lo que acostumbra  y suelo liarme al cominucarlos entre si)Gracias Y 

El problema es que no lo sumas, lo que estás haciendo es asignar:
 int total;
 int numero1;
 int numero 2;
 
 //Esto
 total = numero1 + numero2;
 //Es diferente a esto otr
 total += numero1 + numero2;
En el segundo script está bien que lo tengas así, pero en el primero deberías cambiarlo para que se le sume, claro que se le sumaría todos los frames esa cantidad y empezará a subir muy rápidamente, pero eso ya es otro problema 

Agosto 26, 2015, 02:51:04 PM #4 Ultima modificación: Agosto 26, 2015, 02:57:00 PM por sirkain
buenas, no me preocupa la velocidad que se sumaria frame a frame, de hecho esta bien asi aunque seria mejor ajustarla a un tiempo exacto como decima de segundo en vez del fluctuante fps.en lo que escribi arrida de todo en texto el concepto de sumarlo lo puse, pero  si yo este script 1 que va en todas las armas o generadores x igual donde el umico dato que tendrian distinto es que en el de arma, coloco un consumo... 10 y en los generadores una generacion....5 para obligar a poner 2 generadores x arma x ejemploque es lo que estaria sumando segun lo que aportas?osea si yo supiese de antemando.... que habran 25 armas y 73 generadores.... en el script persistene colocaria un for que recorra, tome los datos y calcule, pero nose cuantos habra. se me ocurrio poner un contador de objetos similares para decirle al For cuantos items recorrer, pero tambien deberia listar el nombre de cada clon para poder identificarlos individualmente y tomar los datos de cuanto genera cada uno o cuanto gasta cada uno para hacer los calculos pertinentes.espero haber sido claro en el problema base.... sino pensare otra forma de explicarlo que resulte menos confusagracias  PD: tal vez se resuelva haciendo algo parecido a lo que opinas..... tomando la variable y sumandole a ella misma lo que quieroscp_calculos.var_Energia_Total_Generada = Energ_Generada   //originalscp_calculos.var_Energia_Total_Generada = scp_calculos.var_Energia_Total_Generada + Energ_Generada   //si era asi de facil..... me martillo un dedo ! !  cuando llegue al pc lo pruebo con varios items
si estoy segurisimo que es asi, ahora que lo pienso bien y releo mi pregunta me doy cuenta que en la jerarquia puse varios items de ejemplo y solo me tomaba los valores del ultimo de ellos, y claro en cada ciclo reemplazaba los valores leidos en cada item x el siguiente en el orden de jerarquia, hasta el ultimo.el codigo original es larguisimo, hay decenas de variables casi iguales que envian datos y otras que reciben, cuando me trave en esta pavada, se me bloqueo el cerebruto!!  confirmo mas tarde pero seguro que vuelvo con el dedo martillado.jajaj saludos 

Agosto 28, 2015, 01:40:35 PM #5 Ultima modificación: Agosto 28, 2015, 02:02:14 PM por elanguido
Aver, creo que tienes un pequeño error de concepto, lo que debes hacer es calcular en cada frame los totales que se está generando y consumiendo, no generar y consumir, no sé si entiendes la diferencia. Como dices, los frames fructuan, tendrías que multiplicar por el deltaTime, los resultados no serían exactos y te daría demasiados problemas en general.Te dejo cómo lo haría yo, los he hecho en C# pero bueno, puedes traducirlo fácilmente. He dividido el código en 3 clases/ficheros (recuerda: separación de responsabilidades), un script para los generadores de energía, otro para los consumidores y un gestor encargado de hacer los cálculos:
public class GeneradorEnergia : MonoBehaviour 
{
    public int CantidadGeneracion;

    void OnEnable()
    {
        // Cuando se crea un nuevo generador, se añade al gestor.
        FindObjectOfType<GestorEnergia>().Generadores.Add(this);
    }

    void OnDestroy()
    {
        // Cuando se destruye un generador, se elimina del gestor.
        FindObjectOfType<GestorEnergia>().Generadores.Remove(this);
    }
}
public class ConsumidorEnergia : MonoBehaviour
{
    public int CantidadConsumo;

    void OnEnable()
    {
        // Cuando se crea un nuevo consumidor, se añade al gestor.
        FindObjectOfType<GestorEnergia>().Consumidores.Add(this);
    }

    void OnDestroy()
    {
        // Cuando se destruye un consumidor, se elimina del gestor.
        FindObjectOfType<GestorEnergia>().Consumidores.Remove(this);
    }
}
public class GestorEnergia : MonoBehaviour 
{
    // Listados con todos los generadores y consumidores de la escena
    public List<GeneradorEnergia> Generadores = new List<GeneradorEnergia>();
    public List<ConsumidorEnergia> Consumidores = new List<ConsumidorEnergia>();

    // Totales
    public int GeneracionTotal;
    public int ConsumoTotal;
    public int Diferencia;

    void Update()
    {
        // En cada Frame se realizan los cálculos
        GeneracionTotal = Generadores.Sum(x => x.CantidadGeneracion);
        ConsumoTotal = Consumidores.Sum(x => x.CantidadConsumo);
        Diferencia = GeneracionTotal - ConsumoTotal;
    }
}
 De esta forma, cuando se instancia un nuevo generador/consumidor a la escena, automáticamente se tendrá en cuenta en los cálculos. De igual modo, si un generador/consumidor es destruido, dejará de contar.Espero que te sirva y un saludo.

Etiquetas: