[C#] Come accedere a una variabile da un altro script in un altro gameobject tramite GetComponent?



Answers

Destroy(gameObject); all'inizio invece che sveglio e non usare Destroy(gameObject); stai distruggendo il tuo oggetto Object, quindi ne vuoi qualcosa

void Start () {
     BombDropScript =gameObject.GetComponent<BombDrop> ();
     collider = gameObject.GetComponent<BoxCollider2D> ();

     // Call the Explode function after a few seconds
     Invoke("Explode", time);

 }

void Explode() {
//..
  //..
//at last
Destroy(gameObject);
 }

se vuoi accedere a uno script in un altro gameObject, devi assegnare l'oggetto del gioco tramite inspector e accedervi in ​​questo modo

 public gameObject another;
void Start () {
     BombDropScript =another.GetComponent<BombDrop> ();
}
Question

Ho cercato in giro e non riesco a farlo funzionare. Penso di non conoscere la sintassi corretta, o semplicemente non capisco il contesto.

Ho uno script BombDrop che contiene un pubblico int. Ho avuto modo di lavorare con la statica pubblica, ma qualcuno ha detto che si tratta di una pessima abitudine di programmazione e che dovrei imparare l'incapsulamento. Ecco cosa ho scritto:

Script di BombDrop:

 <!-- language: c# -->

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

 }
}

Quindi voglio che lo script Bomb sia allegato al prefabgameobject Bombprefab per accedere al numero intero di maxBombs in BombDrop, così che quando la bomba viene distrutta aggiunge + a maxBombs in BombDrop.

E questo è lo script Bomb che ha bisogno del riferimento.

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

 void Start () {

     collider = gameObject.GetComponent<BoxCollider2D> ();

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

Nella documentazione dice che dovrebbe essere qualcosa di simile

BombDropScript = otherGameObject.GetComponent<BombDrop>();

Ma questo non funziona. Forse non capisco la sintassi qui. Supponiamo di dire otherGameObject? Perché questo non fa nulla Ricevo ancora l'errore: "Il riferimento all'oggetto non impostato esegue un'istanza di un oggetto" sul mio BombDropScript.maxBombs in basso nello explode ()




Links