2016-04-14 9 views
4

In meiner Unity 4.3 funktionieren alle gut, aber nach Upgrade auf 5 habe ich ein Problem mit GetComponent. Um zu testen, eine neue deprecable GetComponent ich die offizielle Tutorial habenGetComponent Upgrade von 4 auf 5 funktioniert nicht

using UnityEngine; 
using System.Collections; 
public class test : MonoBehaviour { 
public GameObject otherGameObject; 
private AnotherScript anotherScript; 
void Awake() 
{ 
    anotherScript = GetComponent<AnotherScript>(); 
} 

void Update() 
{ 
    Debug.Log("The player's score is " + anotherScript.playerScore); 
} 
} 

und das zweite Skript

using UnityEngine; 
using System.Collections; 
public class AnotherScript : MonoBehaviour { 
public int playerScore = 9001; 
} 

Dies ist nur für Test,

ich habe das gleiche Beispiel für die Einheit verwendet Tutorial https://unity3d.com/learn/tutorials/modules/beginner/scripting/getcomponent

Danach habe ich die beiden Objekte im Editor zugeordnet Aber der Laufbericht ist:

Nullreferenceexception: Objektverweis nicht auf eine Instanz eines Objekts test.Update() (bei Assets/Test.cs: 22)

in Einheit gut 4,3 Arbeit.

+0

Versuchen Sie, der 'AnotherScript'-Klasse einen Konstruktor hinzuzufügen, wie' public AnotherScript() {playerScore = 9001;} 'dies bedeutet auch, dass Sie bei der Deklaration der Variablen den Wert –

+1

@AlfieGoodacre entfernen sollten. Nein. ** Benutze niemals den Konstruktor in einem Unity-Skript, das von 'MonoBehavior' abgeleitet ist. – Programmer

+0

@Programmer sorry Ich bin nicht der Beste mit Unity, daher habe ich nicht antworten, 'Start()' dann vielleicht? :) –

Antwort

4

Sie sollten versuchen, die Referenz in der Startmethode zu erhalten. Stellen Sie sicher, dass sowohl test als auch AnotherScript Skripte an das gleiche GameObject im Editor angehängt sind, dann sollte der folgende Code funktionieren.

using UnityEngine; 
using System.Collections; 

public class test: MonoBehaviour 
{ 
    public int playerScore; 

    void Start() 
    { 
     anotherScript = gameObject.GetComponent<AnotherScript>(); 
    } 

    void Update() 
    { 
     Debug.Log("The player's score is " + anotherScript.playerScore); 
    } 
} 

Wenn beide Skripte sind nicht an dem-selben Gameobject dann verwenden:

anotherScript = GameObject.Find("Name of GameObject AnotherScript is Attched To").GetComponent<AnotherScript>(); 
+0

Wenn ich sagte, es in Start zu tun, meinte ich 'GetComponent ();' in Start-Funktion statt Awake. Das -1 ist nicht von mir. Es wurde für dich behoben. – Programmer

+0

@Programmer Es sollte aber in Awake sein. Und die aktuelle Antwort macht keinen Sinn, du hast diese beiden Skripte zu einem zusammengefasst. – FINDarkside

+0

@ FINDarkside. Nein. Es muss nicht im Erwachen getan werden. Angenommen, beide Skripte sind mit demselben GameObject verknüpft, sollte dies funktionieren. – Programmer

2

Sind Sie sicher, dass AnotherScript auch auf den gleichen Gameobject Sie Test-Skript ist an angebracht ist?

Die GetComponent-Methode sucht nur nach Komponenten, die an GameObjects angehängt sind.

Der einfache Weg wäre sicher, ein anderesScript-Mitglied öffentlich zu machen (so dass es im Inspektor verfügbar ist) und Drag'n'Drop, um die Referenz zu erhalten.

3

Sie müssen FindObjectOfType<AnotherScript>() verwenden, wenn die Skripte nicht mit demselben GameObject verknüpft sind.

3

Ich glaube, dies so sein sollte:

public GameObject otherGameObject; 


private AnotherScript anotherScript; 


void Awake() 
{ 
    anotherScript = otherGameObject.GetComponent<AnotherScript>(); 

} 

void Update() 
{ 
    Debug.Log("The player's score is " + anotherScript.playerScore); 
} 

} 

Und sollten Sie im Editor anhängen otherGameObject.

Verwandte Themen