2016-03-22 2 views
0

Das Problem tritt auf, wenn ein Prefab mit einem Skript UnitScript instanziiert wird. Wenn das Fertig instanziiert wird, möchte ich manuell eine Variable setzen:Festlegen der Objekteigenschaft und Einchecken von Start(), wenn es null funktioniert

GameObject unit = newUnit(this.transform.position); // Returns a prefab in the given position 
unit.GetComponent<UnitScript>().myProperty = new MyObject(unit.GetComponent<UnitScript>()); 
print("myProperty was set"); 

Das Problem an dieser UnitScript im Start() Methode erscheint, wo myProperty erscheint als null stattdessen den Wert, den ich vor gab:

void Start() { 
    if (myProperty == null) { 
     print("myProperty is null"); 
    } 
} 

Beachten Sie, dass die Konsole in dieser Reihenfolge protokolliert: myProperty wurde festgelegt, myProperty ist null

Methode:

return Instantiate(myPrefab, position, rotation) as GameObject; 
// myPrefab is a public GameObject var that has a prefab given by the inspector 

Die MyObject-Klasse sieht wie folgt aus:

public class MyObject: Object { 

    private UnitScript unit; 

    public MyObject(UnitScript unit) { 
     this.unit = unit; 
    } 
} 

Vielen Dank im Voraus, ich wette, das Problem ein Dumme ist ...

+0

Sind Sie sicher, dass Ihre 'unit.GetComponent ()' gibt die gleiche Instanz wie die 'UnitScript' Instanz, druckt "myProperty null ist"? Instanziieren Sie das Spielobjekt mit 'Instantiate()'? – LibertyLocked

+0

Können Sie Ihre newUnit-Methode anzeigen? :) – JoRouss

+0

@LibertyLocked ja – aramusss

Antwort

2

Rückkehr Instantiate (Gameobject, Position, Rotation) als GameObject; // Gameobject ist eine öffentliche Gameobject var, die ein Fertighaus vom Inspektor

Versuchen Sie, den Namen des „Gameobject“ Variable gegeben hat, da es bereits vorhanden ist. gameObject verweist auf das GameObject, an das Ihr Skript angehängt ist.

public GameObject PREFAB_GO; 

Vergessen Sie nicht, es im Inspektor neu zuzuweisen.

So wird es wie folgt aussehen:

return Instantiate(PREFAB_GO, position, rotation) as GameObject; 

EDIT

Versuchen Sie, ob Sie MyObject() null ist.

GameObject unit = newUnit(this.transform.position); // Returns a prefab in the given position 
    var test = new MyObject(); 
    if (test == null) 
    { 
     print("test IS NULL"); 
    } 
    unit.GetComponent<UnitScript>().myProperty = test; 
    print("myProperty was set"); 

ANTWORT

gefunden, das Problem/Lösung: MyObject-Klasse war Unterklasse UnityEngine.Object, aus irgendeinem Grund mit der Initialisierung neuer funktioniert nicht. In System.Object geändert, und alles ist OK.

Dies ist die Antwort des Autors in den Kommentaren versehen

+0

Sorry für die Verwirrung. Die Sache ist, dass ich Methoden habe, die dieses GameObject als eine Variable hat, aber die eigentliche öffentliche Klasseneigenschaft wird nicht gameObject genannt, also sollte dies nicht das Problem sein. Das Beispiel wurde zum besseren Verständnis aktualisiert. – aramusss

+0

Versuchen Sie meine bearbeiten und fügen Sie die Protokolle – JoRouss

+0

Sie haben Recht: MyObject ist null! Ich habe den Konstruktor im OP hinzugefügt ... Ich dachte nicht einmal darüber nach, weil ich den gleichen Konstruktor woanders verwende und es funktioniert .... – aramusss

0

Wenn MyObject-Klasse erbt von MonoBehaviour ist es ein Grundverhalten.

In der Tat können Sie keinen Konstruktor einer Klasse als erben von MonoBehaviour aufrufen. Und wenn Sie das tun, wird Constructor null zurückgeben. Deshalb können Sie ein Null-Attribut haben.

Wenn MyObject von MonoBehaviour erben muss, erstellen Sie eine Init-Methode, die die Klasse initialisiert. In Ihrem Fall können Sie die AddComponent-Methode verwenden, die eine neue Instanz Ihres Skripts anfügt.Vergessen Sie nicht, alles von Ihrem Konstruktor in eine Start- oder eine Wachmethode zu verschieben.

Sie sollten haben: unit.GetComponent(). MyProperty = gameObject.AddComponent();

Wir müssen MyObject-Klasse sehen, um Ihnen mehr zu helfen.

Sorry für mein schlechtes Englisch :)

+0

Danke, aber 'MyObject' erbt von' Object'. Das Problem bestand zwischen UnityEngine.Object und System.Object, wodurch ein neues UnityEngine.Object erstellt wurde, das 'new' verwendet und' null' zurückgibt. – aramusss

+0

Ok !! Es ist einfach: Schreiben Sie System.Object anstelle von Object – Alexandre

Verwandte Themen