2016-05-22 6 views
1

Ich lese dieses explanation of NullReferenceException in C#, konnte aber keine Antwort finden.Unbekannte NullReferenceException in C# mit Klassenreferenzen

Ich arbeite in Unity5 (2D) und versuche, eine Schaltfläche zu erstellen, die beim Anklicken eine Methode im Skript eines anderen Objekts aktiviert.

In den Klassen habe ich Kommentare wie // (Zeile #) hinzugefügt, so dass Sie leichter von der NRE verweisen können.

public class runePadController : MonoBehaviour { 
public void shoot() { 
    var fccClass = new friendlyCastleController(); 
    fccClass.shoot(); //(Line 23) 
} 
} 

Die Taste aktiviert die shoot() Methode in der obigen Klasse.

public class friendlyCastleController : MonoBehaviour { 
public void shoot() { 
    useElement (true, "fireBall"); //(Line 36) 
} 

public void useElement (bool atk, string type) 
{ 
    switch (type) 
    { 
     case "fireBall": 
      if (atk) 
      { 
       //Object clone; 
       Vector3 nPosition = new Vector3(); 
       float nX = transform.position.x + Random.Range(-5F, 5F); //(Line 48) 
       float nY = transform.position.y + 3F; 
       nPosition.Set(nX, nY, 0); 

       Quaternion nAngle = new Quaternion(); 
       nAngle.Set(Random.Range(-0.15F, 0.15F), 1, 0, 0); 
       //Debug.Log(nPosition + " :: " + nAngle); 

       //clone = (Instantiate(fireBallPF, nPosition, nAngle)) as GameObject; 
       Instantiate(fireBallPF, nPosition, nAngle); 
      } 
      else 
      { 

      } 

      break; 
     default: 
      Debug.Log ("Error: Default Switch Called in FriendlyCastleController"); 
      break; 
    } 
} 

... und dieser Teil der Klasse ist, die mit dem genannten Verfahren behandelt.

jedoch Unity führt dies bei mir:

NullReferenceException 
friendlyCastleController.useElement (Boolean atk, System.String type) (at Assets/Scripts/friendlyCastleController.cs:48) 
friendlyCastleController.shoot() (at Assets/Scripts/friendlyCastleController.cs:36) 
runePadController.shoot() (at Assets/Scripts/runePadController.cs:23) 
UnityEngine.Events.InvokableCall.Invoke (System.Object[] args) (at C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:144) 
UnityEngine.Events.InvokableCallList.Invoke (System.Object[] parameters) (at C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:621) 
UnityEngine.Events.UnityEventBase.Invoke (System.Object[] parameters) (at C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:756) 
UnityEngine.Events.UnityEvent.Invoke() (at C:/buildslave/unity/build/Runtime/Export/UnityEvent_0.cs:53) 
UnityEngine.UI.Button.Press() (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:35) 
UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:44) 
UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:52) 
UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:269) 
UnityEngine.EventSystems.EventSystem:Update() 

Für jeden, der dies besser versteht, können Sie mir in die richtige Richtung?

Danke! :)

+1

wir wissen nicht, wo ist Linie 48 –

+0

Vermutlich ist entweder "transform" null oder "transform.position" ist null. –

+0

Es sagt, wo Linie 48 ist. Schau in den Code der zweiten Klasse. :) – SolarSupremacy

Antwort

2

Versuchen Sie, die friendlyCastleController Klasse in die Gameobject Zuweisung von wo aus man transform.position Werte einnehmen, und in runePadController stattdessen für die Schaffung eines new friendlyCastleController Gebrauch

var fccClass = gameObjectName.getComponent<friendlyCastleController>(); 

OP, alles, was Sie tun ist völlig falsch:

Diese Aussage

var fccClass = new FriendlyCastleController(); 

ist völlig bedeutungslos und existiert nicht in Unity. Einheit ist nicht ein OO-System, es ist ein ECS-System. Dort ist keine Vererbung noch irgendwelche OO Konzepte überhaupt. Diese Linie

public class FriendlyCastleController:MonoBehaviour 

bedeutet, dass FriendlyCastleController ist a MonoBehavior. Was bedeutet das? Es bedeutet, dass es eine Komponente Sie an eine tatsächliche spezifische GameObject ist.

Es kann nicht allein existieren, kann es nur als Anlage vorhanden, um ein Spiel Objekt.

  1. im Editor ein neues Spiel-Objekt machen (vielleicht ein kleiner Würfel zum Beispiel) genannt AAA

  2. tatsächlich ein FriendlyCastleController Skript zu diesem Namen Test

  3. machen ein neues Skript Objekt anhängen. cs, auch ein monobehavior und befestigen Test.cs zu einem anderen Objekt namens BBB

  4. In Test.cs, tun dies

    public FriendlyCastleController friendlyCastle; 
    
  5. Jetzt schauen Sie im Editor bei BBB. Beachten Sie, dass Sie tatsächlich in den Schlitz ziehen können "friendlyCastle". Tun Sie das - ziehen Sie tatsächlich von AAA.

Jetzt verstehen Sie, wie Unity funktioniert.

in RunePadController Sie Muss haben eine

 public FriendlyCastleController friendlyCastle; 

und Sie ziehen Ihre "AAA" Objekt (im Beispiel hier), dass. Später können Sie lernen, wie Sie das "AAA" -Objekt während der Laufzeit von RunePadController "finden".

+1

In der Tat. Ich werde deine Antwort erweitern. – Fattie

+0

@JoeBlow Danke für die gründliche Erklärung, Sir. – CloudSL

+0

Versuchen Sie es jetzt. :) – SolarSupremacy

Verwandte Themen