Noticias

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

Mani***r variables de otro script [C#]

Iniciado por B-£otus, Febrero 20, 2016, 06:02:36 PM

Tema anterior - Siguiente tema
Febrero 20, 2016, 06:02:36 PM Ultima modificación: Febrero 20, 2016, 06:03:05 PM por ¥-Shido
Quisiera saber como mani***r variables de otro script en C#.Ya busque en el foro pero solo encontre de javascript.



Febrero 22, 2016, 01:06:45 PM #3 Ultima modificación: Febrero 22, 2016, 01:07:51 PM por ftejada
Si quieres trabajar o modificar variables de un script que NO sean public, te aconsejo que en dicho script crees dos funciones publicas por cada variable:
Tipo miVariable;    //de Tipo float, int, GameObject, etc

//Para modificar la variable "miVariable"
public void setNombreVariable(Tipo variable)    //el tipo de variable aquí debe ser el mismo que el de la variable que quieres modificar
{
    miVariable = variable;
}

//Para que te devuelva el valor de tu variable
public Tipo getNombreVariable()
{
    return miVariable;
}
 Esto son conocimientos basicos de programacion y deberias empaparte de este tipo de cosas antes, si aun no las sabes... simplemente se hace por seguridad para no cambiar el valor de las variables por accidente si fuesen publicas Ahora en el script donde vayas a necesitar acceder a estas variables, deberias crear una variable de dicho script y llamar a estas funciones desde el script que necesites utilizarlas
public class ScriptB : Mono....
{
    NombreScriptQueContieneLasVariables scriptA;
   

    void Start()
    {
       
        scriptA = GameObject.Find("NombreDelGameObjectQueContieneElScriptConLasVariables").GetComponent<NombreScriptQueContieneLasVariables>();
    }


    void Update()
    {
        //Ahora solo tienes que utilizar scriptA y las funciones que creastes
        //Para cambiar el valor
        scriptA.setNombreVariable(unValorDelMismoTipo);
       
        //Para obtener el valor de tu variable
        Tipo variable = scriptA.getNombreVariable();
    }
.....

}
 Saludos

[quote author=ftejada" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35229" data-ipsquote-contentcommentid="127426">Si quieres trabajar o modificar variables de un script que NO sean public, te aconsejo que en dicho script crees dos funciones publicas por cada variable:
Tipo miVariable;    //de Tipo float, int, GameObject, etc//Para modificar la variable "miVariable"
public void setNombreVariable(Tipo variable)    //el tipo de variable aquí debe ser el mismo que el de la variable que quieres modificar
{
    miVariable = variable;
}

//Para que te devuelva el valor de tu variable
public Tipo getNombreVariable()
{
    return miVariable;
}
 Esto son conocimientos basicos de programacion y deberias empaparte de este tipo de cosas antes, si aun no las sabes... simplemente se hace por seguridad para no cambiar el valor de las variables por accidente si fuesen publicas Ahora en el script donde vayas a necesitar acceder a estas variables, deberias crear una variable de dicho script y llamar a estas funciones desde el script que necesites utilizarlas
public class ScriptB : Mono....
{
    NombreScriptQueContieneLasVariables scriptA;
   

    void Start()
    {
       
        scriptA = GameObject.Find("NombreDelGameObjectQueContieneElScriptConLasVariables").GetComponent<NombreScriptQueContieneLasVariables>();
    }


    void Update()
    {
        //Ahora solo tienes que utilizar scriptA y las funciones que creastes
        //Para cambiar el valor
        scriptA.setNombreVariable(unValorDelMismoTipo);
       
        //Para obtener el valor de tu variable
        Tipo variable = scriptA.getNombreVariable();
    }
.....

}
 Saludos[/quote]¿porque no usar propiedades?

Cita de: isai date=1456856099" data-ipsquote="" data-cite="isai" class="ipsQuote¿porque no usar propiedades?
perdona pero no se a qué te refieres... Explicamelo si puedes Saludos

[quote author=ftejada" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35229" data-ipsquote-contentcommentid="127813">perdona pero no se a qué te refieres... Explicamelo si puedes Saludos[/quote]es esto https://msdn.microsoft.com/es-MX/library/w86s7x04.aspx" rel="external nofollow date=1457100180]https://msdn.microsoft.com/es-MX/library/w86s7x04.aspx

Marzo 04, 2016, 05:50:58 PM #7 Ultima modificación: Marzo 04, 2016, 05:51:57 PM por ftejada
Cita de: isai date=1457104905" data-ipsquote="" data-cite="isai" class="ipsQuote">es esto https://msdn.microsoft.com/es-MX/library/w86s7x04.aspx
Ahhh vale... Si... se puede hacer perfectamente y todo el codigo quedaría más limpio. Sobre todo cuando tienes muchisimo codigoGracias por la apreciación, un saludo

[quote author=ftejada" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35229" data-ipsquote-contentcommentid="127818">Ahhh vale... Si... se puede hacer perfectamente y todo el codigo quedaría más limpio. Sobre todo cuando tienes muchisimo codigoGracias por la apreciación, un saludo[/quote]no hay de que para eso andamos para compartir ;)

Hace un par de dias cree un script en C# para activar y desactivar variables tipo bool, me base en documentacion.
Si gustas puedo darte la ayuda

Muchas gracias a todos por responder.Ya puedo aprovechar el potencial del GetComponent XD

Un método adicional que funciona fácil y sencillo es también Advanced C# Messenger. Con él puedes enviar notificaciones de un script a otro, e incluso valores concretos de variables (esto sólo lo he hecho una vez, así que no te puedo aclarar mucho).  Tienes que incluir el script en tu proyecto, y a partir de ahí lo tienes disponible. Esto puede ser especialmente interesante cuando quieres mantener comunicación entre dos scripts que no están presentes en el mismo GameObject (obviamente, también puedes hacerlo a través de GetComponent, aunque puede ser algo más engorroso).Parece que es, además, muy eficiente en cuanto al consumo de recursos.Priotario -según mi opinión-: domina el Getcomponent, y prueba después con Advanced C# Messenger. A mí, desde luego, me va estupendo y es super fácil de usar. http://wiki.unity3d.com/index.php?title=Advanced_CSharp_Messenger" rel="external nofollow">http://wiki.unity3d.com/index.php?title=Advanced_CSharp_Messenger

No quiero que empecéis a lanzar piedras, pero yo nunca he tenido que utilizar mensajes entre componentes.Creo que la necesidad de hacerlo se deriva de una deficiente estructura en el modelo orientado a objetos y a la no utilización de delegates en algunos casos. Esto a la larga os va a crear un código descentralizado y no jerárquico que será más parecido a una matriz de matrices que a una estructura ordenada "top-down", donde la dependencia entre objetos os impedirá reutilizarlos en otros componentes. Un ejemplo simple:Tengo una pistola, que tiene componentes balas. Bala se dispara y si "choca" con un componente enemigo le baja un valor de salud. Según vuestro enfoque, bala le enviará un mensaje a enemigo con un valor de salud a cambiar. Esto genera una dependencia de bala con enemigo. Cuando cambiéis enemigo, o si aparece un componente pared y mostrar el balazo, tendréis problemas para reutilizar el código.Yo lo que digo es que, bala le dice a pistola que ha chocado con alguien. Pistola lo recibe y tal vez se lo pasa a otro componente superior (personaje por ejemplo) o lo procesa y este interactúa con enemigo restándole la salud, a través de una interface Enemigo, no a través de mensaje. Bala es independiente de enemigo, choque con lo que choque. Solamente procesa los choques y envía contra qué a un nodo superior hasta que alguno lo procese. La clase derivada con la interface Enemigo es también independiente de qué enemigo.Espero haberme explicado bien.

[quote author=iRobb date=1458820358" data-ipsquote="" data-cite="iRobb" class="ipsQuote">No quiero que empecéis a lanzar piedras, pero yo nunca he tenido que utilizar mensajes entre componentes. Creo que la necesidad de hacerlo se deriva de una deficiente estructura en el modelo orientado a objetos y a la no utilización de delegates en algunos casos.[/quote]buhhhh Creo que te deberia dar vergüenza insinuar que algunos tienen un deficiente conocimiento-practica en el modelo orientado a objetos ... aunque hubieras podido decir lo mismo de forma mas clara, por ejemplo "ni zorra idea de programacion" nada, si fuera otra persona quien esta escribiendo esto podrias dudar si lo digo en serio o en coña Pero ademas del enorme beneficio a corto plazo, que es tener mas autonomia a la hora de trabajar y hacer las cosas mejor, existe el factor a medio-largo plazo : hace unos años triunfaban programas como los makers studio o div studio entre otros ... y hoy tenemos Unity, Unreal o Cryengine que son un gran avance. El software informatico avanza a pasos de gigante, y sabiendo programacion puedes trabajar con cualquier de esos engine (o futuros) con el unico esfuerzo de aprender a manejar las caracteristicas especificas de software en cuestion la cual se puede en un plazo de tiempo muy limitado.No obstante, los que pretenden hacer videojuegos (y mas dedicarse a ello) sin molestarse en aprender primero programacion siempre tendras mi mas sincera admiracion ... como el que pretende hacer paracaidismo sin paracaidas, mejor no pensar en el resultado pero ese valor es digno de elogio xDDD

Intento aportar sin ponerme cínico. Sé hacerlo, pero creo que no ayuda al interesado. Otra cosa es que me hagan caso siendo respetuoso.

Etiquetas: