Noticias

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

Problema al actualizar una variable int de una struct

Iniciado por ftejada, Noviembre 14, 2015, 12:10:14 AM

Tema anterior - Siguiente tema
Hola a todos, tengo el siguiente problema.Tengo un script para actualizar las puntuaciones que salen en pantalla de varios coches.... Utilizo como metodo los "Text" de UI de Unity.El caso es que creo una struct para almacenar el nombre del coche y su puntuacion:
public struct DatosCar
    {
        public string name;
        public int puntuacion;

        public void setPuntuacion(int i)
        {
            puntuacion = i;
        }
        public void setName(string stg)
        {
            name = stg;
        }

        public string getName()
        {
            return name;
        }
        public int getPuntuacion()
        {
            return puntuacion;
        }
    }
Posteriormente creo una List para contener tantas struct como coches haya en escena:
List<DatosCar>         listDatosCars = new List<DatosCar>();
En la funcion Start de dicho script relleno la listDatosCars:
for (int i = 0; i < Arrays.getSingleton.getListCarsOnTheScene().Count; i++)
        {
            datosCar = new DatosCar();
            datosCar.name = Arrays.getSingleton.getListCarsOnTheScene().name;
            datosCar.puntuacion = Arrays.getSingleton.getListCarsOnTheScene().GetComponent<IA_CarStates>().getPuntuacion();
            listDatosCars.Add(datosCar);
        }
Ahora en cada frame actualizo la listDatosCars con los nuevos valores de los coches de la escena:
for(int i = 0; i < Arrays.getSingleton.getListCarsOnTheScene().Count; i++)
        {
            //Se introduce un nombre y una puntuacion
            listDatosCars.setName(Arrays.getSingleton.getListCarsOnTheScene().name);            
            listDatosCars.setPuntuacion(Arrays.getSingleton.getListCarsOnTheScene().GetComponent<IA_CarStates>().getPuntuacion());
        }
El caso es que las struct que van dento del array no se me estan actualizando y no se él porqué...Alguien me puede decir donde estoy fallando... qué estoy haciendo mal...?? Espero vuestra ayuda. Un saludo y gracias de antemano.

Es mas facil crear un componente y este añadirlo a cada Auto, aparte de que consume muchisimo menos recursos, pero aun no entiendo que quieres lograr, una lista de todos los jugadores ordenada?ejPedro 100
Juan 40
Alfredito 23 

Si es asi te doy una mano...

Noviembre 14, 2015, 09:16:38 AM #2 Ultima modificación: Noviembre 14, 2015, 09:18:01 AM por kaito
...cuando una estructura se pasa a un método, lo que se pasa realmente es una copia de la estructura; sin embargo, cuando se pasa una instancia de una clase, lo que se pasa es una referencia.[/quote] Referencia: https://msdn.microsoft.com/es-es/es/library/aa288471(v=vs.71).aspx">https://msdn.microsoft.com/es-es/es/library/aa288471(v=vs.71).aspx Por esta razón, cuando modificas el valor de una estructura, se modifica la referencia(se crea una nueva instancia de la estructura). Puede venir bien cuando no quieres sobreescribir los valores de una instancia anterior compartida por varios objetos. Soluciones:1) Utiliza class en lugar de struct. De este modo manejas una sola referencia (la instancia inicial).2) Sigue utilizando struct con las siguientes modificaciones:
public DatosCar setPuntuacion(int i)
        {
            puntuacion = i;
            return this; //devuelve referencia de la nueva instancia generada

        }
 Y en el listado le asignas la nueva referencia devuelta por el método:
listDatosCars = listDatosCars.setName(Arrays.getSingleton.getListCarsOnTheScene().name);
 

Cita de: francoe1 date=1447457765" data-ipsquote="" data-cite="francoe1" class="ipsQuoteEs mas facil crear un componente y este añadirlo a cada Auto, aparte de que consume muchisimo menos recursos, pero aun no entiendo que quieres lograr, una lista de todos los jugadores ordenada?ejPedro 100
Juan 40
Alfredito 23 

Si es asi te doy una mano...
Gracias Kaito, me ha servido lo que me has puesto y ya está solucionado.francoe1 gracias por contestar tambien. No se muy bien a qué te refieres con la frase de "Es mas facil crear un componente y este añadirlo a cada Auto", pero me interesa mucho esa idea si consume bastante menos... Asi que me gustaría que me lo explicases mejor.Y lo que pretendía es exactamente lo que dices... una lista de todos los jugadores ordenadas de mas puntos a menos puntos para sacarla por pantalla con la UI.... Saludos

Lo que dice es que las variables name y puntuacion la coloques en un script para cada auto, asi que cuando necesites esa informacion haces un recorrido por los autos que tienes y accedes a su script que contiene dichas variables.

Noviembre 15, 2015, 01:21:31 AM #5 Ultima modificación: Noviembre 15, 2015, 01:22:26 AM por francoe1
Te paso algo que te va a funcionar mucho mejor.
using UnityEngine;
using System.Collections;
using System.Linq;
using System;
using System.Collections.Generic;

public class CarGestion : MonoBehaviour
{
    public List<CarInfo> ListCar;


    public void UpdateListCar()
    {
        ListCar = GameObject.FindObjectsOfType<CarInfo>().ToList();
    }

    void Start()
    {
        ListCar = GameObject.FindObjectsOfType<CarInfo>().ToList();
        CarInfo.ChangeScore += UpdateUI;
        UpdateUI();
    }

    private void UpdateUI()
    {
        SortList();        
    }

    private void SortList()
    {
        ListCar.Sort();
    }
}
 
using UnityEngine;
using System.Collections;
using System;

public class CarInfo : MonoBehaviour, IComparable<CarInfo>
{
    public int Score;
    public string Name;

    public delegate void Change();
    public static event Change ChangeScore;

    public void AddScore()
    {
        Score++;
        if (ChangeScore != null) ChangeScore();
    }

    public int CompareTo(CarInfo other)
    {

        int result1 = Score.CompareTo(other.Score);
        if (result1 != 0)
        {
            return result1;
        }

        return 0;
    }
}
 Está probado y funciona correctamente, lo único que la lista la devuelve de menor a mayor.... Suerte, espero te sirva

[quote author=francoe1 date=1447546891" data-ipsquote="" data-cite="francoe1" class="ipsQuote">Te paso algo que te va a funcionar mucho mejor.
using UnityEngine;using System.Collections;
using System.Linq;
using System;
using System.Collections.Generic;

public class CarGestion : MonoBehaviour
{
    public List<CarInfo> ListCar;


    public void UpdateListCar()
    {
        ListCar = GameObject.FindObjectsOfType<CarInfo>().ToList();
    }

    void Start()
    {
        ListCar = GameObject.FindObjectsOfType<CarInfo>().ToList();
        CarInfo.ChangeScore += UpdateUI;
        UpdateUI();
    }

    private void UpdateUI()
    {
        SortList();        
    }

    private void SortList()
    {
        ListCar.Sort();
    }
}
 
using UnityEngine;
using System.Collections;
using System;

public class CarInfo : MonoBehaviour, IComparable<CarInfo>
{
    public int Score;
    public string Name;

    public delegate void Change();
    public static event Change ChangeScore;

    public void AddScore()
    {
        Score++;
        if (ChangeScore != null) ChangeScore();
    }

    public int CompareTo(CarInfo other)
    {

        int result1 = Score.CompareTo(other.Score);
        if (result1 != 0)
        {
            return result1;
        }

        return 0;
    }
}
 Está probado y funciona correctamente, lo único que la lista la devuelve de menor a mayor.... Suerte, espero te sirva[/quote]Ok. muchas gracias. Voy a hacer algunas pruebas para ver el rendimiento de esta manera que me indicas y como lo tengo ahora... a ver que tal va y asi de camino pruebo algo diferente . Saludos  

Etiquetas: