¿Cómo acceder a una variable desde otro script en otro gameobject a través de GetComponent?

He buscado y no puedo hacer que esto funcione. Creo que simplemente no sé la syntax adecuada, o simplemente no capto el contexto.

Tengo una secuencia de comandos BombDrop que contiene una int pública. Lo hice funcionar con estática pública, pero alguien dijo que ese es un hábito de progtwigción realmente malo y que debería aprender a encapsularlo. Esto es lo que escribí:

Script de BombDrop:

 public class BombDrop : MonoBehaviour { public GameObject BombPrefab; //Bombs that the player can drop public int maxBombs = 1; // Update is called once per frame void Update () { if (Input.GetKeyDown(KeyCode.Space)){ if(maxBombs > 0){ DropBomb(); //telling in console current bombs Debug.Log("maxBombs = " + maxBombs); } } } void DropBomb(){ // remove one bomb from the current maxBombs maxBombs -= 1; // spawn bomb prefab Vector2 pos = transform.position; pos.x = Mathf.Round(pos.x); pos.y = Mathf.Round(pos.y); Instantiate(BombPrefab, pos, Quaternion.identity); } } 

Así que quiero que la secuencia de comandos de la bomba adjunta al prefabgameobject Bombprefab acceda al entero de maxBombs en BombDrop, de modo que cuando la bomba se destruya, agregue + uno a maxBombs en BombDrop.

Y este es el script de Bomb que necesita la referencia.

  public class Bomb : MonoBehaviour { // Time after which the bomb explodes float time = 3.0f; // Explosion Prefab public GameObject explosion; BoxCollider2D collider; private BombDrop BombDropScript; void Awake (){ BombDropScript = GetComponent (); } void Start () { collider = gameObject.GetComponent (); // Call the Explode function after a few seconds Invoke("Explode", time); } void OnTriggerExit2D(Collider2D other){ collider.isTrigger = false; } void Explode() { // Remove Bomb from game Destroy(gameObject); // When bomb is destroyed add 1 to the max // number of bombs you can drop simultaneously . BombDropScript.maxBombs += 1; // Spawn Explosion Instantiate(explosion, transform.position, Quaternion.identity); 

En la documentación, dice que debería ser algo así como

 BombDropScript = otherGameObject.GetComponent(); 

Pero eso no funciona. Tal vez simplemente no entiendo la syntax aquí. ¿Se supone que debe decir otherGameObject? Porque eso no hace nada. Todavía obtengo el error: “Referencia de objeto no establecida hacer una instancia de un objeto” en mi BombDropScript.maxBombs abajo en el explode ()

Necesita encontrar el GameObject que contiene el Componente de script al que planea obtener una referencia. Asegúrate de que GameObject ya esté en la escena, o Find devolverá null .

  GameObject g = GameObject.Find("GameObject Name"); 

Entonces puedes agarrar el guion:

  BombDrop bScript = g.GetComponent(); 

Luego puede acceder a las variables y funciones del Script.

  bScript.foo(); 

Me di cuenta de que respondí una pregunta muy similar el otro día, mira aquí: No sé cómo obtener la salud del enemigo


Expandiré un poco tu pregunta ya que ya la contesté.

Lo que está haciendo tu código es decir: “Busca dentro de mi GameObject un BombDropScript , la mayoría de las veces el script no se adjuntará al mismo GameObject.

También use un setter y getter para maxBombs .

 public class BombDrop : MonoBehaviour { public void setMaxBombs(int amount) { maxBombs += amount; } public int getMaxBoms() { return maxBombs; } } 

Destroy(gameObject); en el inicio en lugar de en el modo despierto y no use Destroy(gameObject); Estás destruyendo tu juego Objeto, entonces quieres algo de él

 void Start () { BombDropScript =gameObject.GetComponent (); collider = gameObject.GetComponent (); // Call the Explode function after a few seconds Invoke("Explode", time); } void Explode() { //.. //.. //at last Destroy(gameObject); } 

si quieres acceder a un script en otro gameObject, debes asignar el objeto del juego a través de un inspector y acceder de esa manera

  public gameObject another; void Start () { BombDropScript =another.GetComponent (); }