Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: Javierhakerone en Agosto 21, 2018, 06:48:47 PM

Título: Comunicación entre script
Publicado por: Javierhakerone en Agosto 21, 2018, 06:48:47 PM
Saludos...
 
Tengo una duda de como hacer para que una variable en el script X sea modificada por el script Y, la verdad noc como hacerlo y agradeceria me puedan ayudar...
 
Gracias de antemano
Título: Comunicación entre script
Publicado por: francoe1 en Agosto 21, 2018, 07:51:21 PM
Primero debes definir el contexto, por ejemplo si quieres trabajar con componentes (Monobehaviour) podrias hacer referencia al componente - 
 

public class ComponenteA : MonoBehaviour
{
}
public class ComponenteB : MonoBehaviour
{
public ComponenteA refComponentA;
}

 
También puedes utilizar una técnica llamada Singletone, esta consiste en crear un campo público y estático de la clase que lo engloba para así acceder a él desde cualquier lugar sin necesidad de referencias -
 

public class ComponenteA : MonoBehaviour
{
public static ComponenteA Singleton { get; private set; }
public string CampoTexto = "";

private void Awake()
    {
   Singleton = this;
    }
}
public class ComponenteB : MonoBehaviour
{
private void Start()
    {
   ComponenteA.Singleton.CampoTexto = "ABC";
    }
}

 
- EL EDITOR DE CÓDIGO DEL FORO TABULA MAL EL CONTENIDO -
 
 
Título: Comunicación entre script
Publicado por: Javierhakerone en Agosto 22, 2018, 12:24:42 AM
Creo no entendi :(
 
a ver si entiendo mejor usando mi codigo...
 

public class Desarrollo : MonoBehaviour
{
    public float minerales, tamano;
   
    // Use this for initialization
    void Start()
    {
       
    }
    // Update is called once per frame
    void Update()
    {
        tamano = minerales/100;
        transform.localScale += new Vector3(tamano, tamano);
       
    }
}

 
ese es el codigo #1
 

public class Mineral : MonoBehaviour {
    public float distancia;
   
// Use this for initialization
void Start () {
       
}

// Update is called once per frame
void Update () {
        distancia = Vector3.Distance(transform.position, GameObject.FindGameObjectWithTag("Player").transform.position);
   
        if (distancia <= 0.3)
        {
           
            GameObject.Destroy(gameObject);
        }
}
}

 
este es el script que debe modificar la variable minerales del script #1
 
 
 
intente con...
 

         Desarrollo sumar = GetComponent<Desarrollo>();
            sumar.minerales += 1;

 
pero me da el siguiente error
 



   
      NullReferenceException: Object reference not set to an instance of an object
      Mineral.Update () (at Assets/Script/Mineral.cs:22)
   

[/quote]
 
 
Título: Comunicación entre script
Publicado por: lightbug en Agosto 23, 2018, 05:33:50 AM
Ya hay varios post relacionados por aquí, en internet tenés mucha info, es más un problema de "referencia" que de otra cosa. Los pasos son:
 


  1.    desde donde querés modificar la variable encontrar la referencia del objeto de interés (instancia de Desarrollo)


  2.    acceder a la variable y hacer lo que quieras (en este caso es public así que podes)


Cita de: Javierhakerone date=1534890282intente con...
   
   

         Desarrollo sumar = GetComponent<Desarrollo>();
            sumar.minerales += 1;

   
      pero me da el siguiente error
   
   

      

         Quote
      
      
         
            NullReferenceException: Object reference not set to an instance of an object

            Mineral.Update () (at Assets/Script/Mineral.cs:22)
         
      
   

       
   

[/quote]
 
Decir GetComponent<X> significa: "Del objeto que tiene este script obtener el componente X" , por como tenes el código el Nullreference está, no porque no lo tenga, sino porque luego estas suponiendo que existe y estas modificando "minerales" (que en realidad no existe). Lo que tenes que hacer es acceder al gameObject que tiene el script con la clase Desarrollo (vos sabrás cual es), ya sea arrastrandolo hacia el inspector (a un "public Desarrollo"), buscandolo (Find "objquetieneelscriptDesarrollo"), que desarrollo sea un singleton, llamar a la instancia unica y ya tenes acceso, etc.
 
Para que te funcione aca bien rapidito podes usar algo así:
 

//Mineral.cs
//...
Desarrollo des;
void Start()
{   
des = GameObject.Find("Objeto Desarrollo").GetComponent<Desarrollo>();
}
...
 
//en donde sea  
des.minerales++;
     
     

 
 
Título: Comunicación entre script
Publicado por: Javierhakerone en Agosto 23, 2018, 05:07:10 PM
Gracias por responder @lightbug 
 
me funciono con 
 

GameObject Player = GameObject.FindGameObjectWithTag("Player");
        AltCamara = Player.GetComponent<Desarrollo>().tamano;

 
jaja al principio no sabia como hacer la referencia pero después de un rato logré averiguar cómo...
 
 
 
Cita de: lightbug date=1534995230en internet tenés mucha info
   


si ps, no cuento con internet de lleno, así que cuando puedo y no consigo entender bien lo de internet pregunto por aqui a ver si me ayudan...