Jump to content
UnitySpain

Aceptamos donaciones vía Paypal.

UnitySpain.com es un servicio gratuito, pero mantener la Comunidad conlleva una serie de gastos.

Fondo Anual Unityspain: Donados 58,34€ de 150,00€

  • Servidor: Dominio.com y Hosting Web
  • Mantenimiento de los Foros
  • Contenido y Servicios Extras
  • Mantenimiento para Redes Sociales
B-£otus

Manipular variables de otro script [C#]

Recommended Posts

Quisiera saber como manipular variables de otro script en C#.

Ya busque en el foro pero solo encontre de javascript.

Edited by ¥-Shido

Share this post


Link to post
Share on other sites

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

Edited by ftejada

Share this post


Link to post
Share on other sites

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

¿porque no usar propiedades?

Share this post


Link to post
Share on other sites

Ahhh vale... Si... se puede hacer perfectamente y todo el codigo quedaría más limpio. Sobre todo cuando tienes muchisimo codigo

Gracias por la apreciación, un saludo

no hay de que para eso andamos para compartir ;) lo que hacias con los metodos es practicamente lo mismo que con las propiedades

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

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 :P:P:P:P:P

No creo equivocarme mucho al pensar que eso sucede porque la gente suda de estudiar programacion, por eso siempre aconsejo lo mismo y que no hace falta repetir en este momento pero la gente solo quiere hacer un videojuego ... no "molestarse" mas alla de copiar lo que digan en un videotutorial o preguntar en un foro como se hace todo.

Creo que es bueno cuando se quiere hacer un videojuego, como minimo molestarse en aprender programacion primero. 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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

×
×
  • Create New...