Como acessar uma variável de outro script em outro object de jogo através de GetComponent?

Eu procurei por aí e não consigo fazer isso funcionar. Eu acho que não sei a syntax correta, ou simplesmente não entendo bem o contexto.

Eu tenho um script BombDrop que contém um int público. Eu tenho isso para trabalhar com a estática pública, mas alguém disse que isso é um hábito de programação muito ruim e que eu deveria aprender o encapsulamento. Aqui está o que eu escrevi:

Roteiro 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); } } 

Então, eu quero o script Bomb que está anexado ao prefabgameobject Bombprefab para acessar o inteiro maxBombs no BombDrop, para que quando a bomba for destruída, ele adicione + um a maxBombs no BombDrop.

E este é o script Bomb que precisa da referência.

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

Na documentação diz que deve ser algo como

 BombDropScript = otherGameObject.GetComponent(); 

Mas isso não funciona. Talvez eu não entenda a syntax aqui. É suposto dizer otherGameObject? Porque isso não faz nada. Eu ainda recebo o erro: “Referência de object não definida fazer uma instância de um object” no meu BombDropScript.maxBombs para baixo no explode ()

    Você precisa encontrar o GameObject que contém o componente de script para o qual você planeja obter uma referência. Certifique-se de que o GameObject já esteja na cena, ou o Find retornará null .

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

    Então você pode pegar o script:

      BombDrop bScript = g.GetComponent(); 

    Então você pode acessar as variables ​​e funções do Script.

      bScript.foo(); 

    Acabei de perceber que respondi uma pergunta muito semelhante no outro dia, confira aqui: Não sei como obter a saúde do inimigo


    Eu vou expandir um pouco a sua pergunta desde que eu já respondi.

    O que seu código está fazendo é dizer “Olhe dentro do meu GameObject para um BombDropScript , na maioria das vezes o script não será anexado ao mesmo GameObject.

    Use também um setter e getter para maxBombs .

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

    use-o no começo em vez de acordado e não use Destroy(gameObject); você está destruindo o seu jogo Objeto, então você quer algo dele

     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); } 

    se você quiser acessar um script em outro gameObject, você deve atribuir o object de jogo via inspector e acessá-lo assim

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