Noticias

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

Comunicación entre script

Iniciado por Javierhakerone, Agosto 21, 2018, 06:48:47 PM

Tema anterior - Siguiente tema
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

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 -
 
 

Agosto 22, 2018, 12:24:42 AM #2 Ultima modificación: Agosto 22, 2018, 08:34:12 AM por pioj
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]
 
 

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++;
     
     

 
 

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...

Etiquetas: