c# suchmaschinen Wie kann man über GetComponent auf eine Variable aus einem anderen Skript in einem anderen Spielobjekt zugreifen?




meta title länge 2018 (2)

Ich habe herumgesucht und ich kann das einfach nicht zum Laufen bringen. Ich denke, ich kenne einfach nicht die richtige Syntax oder begreife den Kontext nicht ganz.

Ich habe ein BombDrop-Skript, das eine öffentliche int enthält. Ich habe das mit der öffentlichen Statik arbeiten lassen, aber Jemand hat gesagt, dass das eine wirklich schlechte Programmiergewohnheit ist und dass ich Einkapselung lernen sollte. Hier ist was ich geschrieben habe:

BombDrop-Skript:

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

 }
}

Also möchte ich, dass das Bomb-Skript, das an das prefabgameobject Bombprefab angehängt ist, auf die maxBombs-Ganzzahl in BombDrop zugreift, so dass, wenn die Bombe zerstört wird, + eins zu maxBombs in BombDrop hinzugefügt wird.

Und das ist das Bomb-Skript, das die Referenz braucht.

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

In der Dokumentation heißt es, dass es so etwas wie

BombDropScript = otherGameObject.GetComponent<BombDrop>();

Aber das funktioniert nicht. Vielleicht verstehe ich die Syntax hier nicht. Soll es anderesGameObject sagen? Denn das macht nichts. Ich bekomme immer noch den Fehler: "Objektreferenz nicht gesetzt eine Instanz eines Objekts" auf meinem BombDropScript.maxBombs unten in der explode ()


Answer #1

Sie müssen das GameObject finden, das die Skriptkomponente enthält, auf die Sie verweisen möchten. Vergewissern Sie sich, dass sich das GameObject bereits in der Szene befindet oder Find gibt null .

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

Dann können Sie das Skript greifen:

 BombDrop bScript = g.GetComponent<BombDrop>();

Dann können Sie auf die Variablen und Funktionen des Skripts zugreifen.

 bScript.foo();

Ich habe gerade gemerkt, dass ich neulich eine sehr ähnliche Frage beantwortet habe, schau hier nach: Ich weiß nicht, wie man die Gesundheit des Feindes bekommt

Ich werde meine Frage etwas erweitern, da ich sie bereits beantwortet habe.

Was dein Code tut, ist zu sagen: "Schau in mein GameObject für ein BombDropScript , die meiste Zeit wird das Skript nicht an dasselbe GameObject angehängt.

Verwende auch einen Setter und einen Getter für maxBombs .

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

    public int getMaxBoms()
    {
        return maxBombs;
    }
}

Answer #2

benutze es beim Start statt wach und benutze nicht Destroy(gameObject); du zerstörst dein Spiel Objekt dann willst du etwas davon

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

Wenn Sie auf ein Skript in einem anderen gameObject zugreifen möchten, sollten Sie das Spielobjekt über den Inspektor zuweisen und so darauf zugreifen.

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




unity3d