2014-10-24 1 views
10

Ich habe gesucht und ich kann das nicht zur Arbeit bringen. Ich glaube, ich kenne einfach nicht die richtige Syntax oder begreife den Kontext einfach nicht.Wie kann man mit GetComponent auf eine Variable von einem anderen Skript in einem anderen Spielobjekt zugreifen?

Ich habe ein BombDrop-Skript, das eine öffentliche int enthält. Ich habe das mit öffentlichen Static arbeiten lassen, aber jemand hat gesagt, dass das eine wirklich schlechte Programmiergewohnheit ist und dass ich Kapselung lernen sollte. Hier ist, was ich schrieb:

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

} 
} 

So möchte ich die Bombe Skript, das auf dem prefabgameobject Bombprefab angebracht ist, die maxBombs integer in BombDrop zuzugreifen, so dass, wenn die Bombe zerstört wird fügt in BombDrop +1 zu maxBombs hinzu.

Und das ist das Bomb Skript, das die Referenz benötigt.

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

sein sollte, aber das funktioniert nicht. Vielleicht verstehe ich die Syntax hier einfach nicht. Soll es anderenGameObject sagen? Denn das tut nichts. Ich bekomme immer noch den Fehler: "Objektreferenz nicht gesetzt, mache eine Instanz eines Objekts" auf meiner BombDropScript.maxBombs in der explode()

+0

können Sie diese 'verwenden BombDropScript = this.GetComponent ();' –

+0

Hmm. Immer noch der gleiche Fehler. :/ – DoubleCode

+0

mögliche Duplikate von [Was ist eine NullReferenceException und wie behebe ich sie?] (Http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix- it) – LearnCocos2D

Antwort

18

Sie müssen die Gameobject finden zuweisen enthält die s cript Komponente, für die Sie eine Referenz erstellen möchten. Stellen Sie sicher, dass das GameObject bereits in der Szene ist, oder Find wird null zurückgeben.

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

Dann können Sie das Skript greifen:

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

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

bScript.foo(); 

Ich habe erkannt, dass ich eine sehr ähnliche Frage den anderen Tag beantwortet, hier überprüfen: Don't know how to get enemy's health


Ich werde ein bisschen auf Ihre Frage erweitern, da ich es schon beantwortet.

Was Ihr Code macht sagt „für eine BombDropScript in meinem Gameobject Schau, das Skript die meiste Zeit nicht an der gleichen Gameobject angebracht werden.

auch einen Setter und Getter für maxBombs verwenden.

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

    public int getMaxBoms() 
    { 
     return maxBombs; 
    } 
} 
+0

Das klingt nach richtig, aber eine Frage. Der bombPrefab ist ein Prefab, ich möchte nicht in der Szene bleiben. denn wenn es zerstört wird, ändert sich meine maxBombs-Zählung. Und wenn ich schon eine Bombe in der Szene habe, vermasselt es die Theke. Gibt es keine Möglichkeit, auf das vorgefertigte Skript zuzugreifen, ohne dass es in der Szene angezeigt wird? – DoubleCode

+0

Es gibt Möglichkeiten, ein Klassenobjekt am Leben zu erhalten, ohne dass es sich in der Szene befindet. Zum Beispiel statische Klasse, reguläre C# -Klasse, die kein MonoBehaviour ist, usw. Ihr Code besagt jedoch, dass 'BombDrop' wegen des' Update'-Codes, der Bombs erzeugt, in der Szene sein muss. Auch habe ich gerade festgestellt, dass Sie Ihren Code so viel einfacher schreiben können. Ich werde meine Antwort aktualisieren. – FunctionR

+0

Ja, mein Player hat das BombDrop-Skript, das den bombPrefab instanziiert. Das Prefab befindet sich also nicht in der Szene vor der Instanziierung. Aber vielleicht funktioniert das Ziel, sobald es instanziiert ist? Also findet es das Ziel sowieso? Ok, das wäre eine große Hilfe:) Mein Code ist genau das, was ich aus eigener schlechter Logik zusammensetzen könnte hehe. – DoubleCode

2

verwenden Sie es in Start statt wach und nicht verwenden Destroy(gameObject); Sie zerstören Ihr Spiel-Objekt dann wollen Sie etwas von ihm

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 ein Skript in einem anderen Gameobject zugreifen wollen, sollten Sie das Spiel-Objekt über Inspektor und Zugang es so, dass

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

Hmm, nein noch doesn arbeite nicht. Vielleicht ist es etwas mit der Explosionsmethode? – DoubleCode

+0

verwende nicht Destroy (gameObject); Sie zerstören Ihr Spiel Objekt dann wollen Sie etwas davon –

+0

Verwenden Sie zerstören, nachdem Sie mit dem Skript fertig sind –