2016-11-18 8 views
0

EDITUnity - C# - Nullreferenceexception: Objektverweis nicht auf eine Instanz eines Objekts festgelegt

Meine Frage ist anders (ich glaube, ..), weil das letzte Bild ermöglicht, eine Gameobject auf die Mitteilung der Nachricht einstellen und Kommunikationsnachricht. ABER, beim Spielen wird es sofort auf None (Text) und None (Button) zurückgesetzt. Ich weiß nicht, warum das passiert oder wie man das löst!


Ich bin mir bewusst, dass diese Frage breit abgedeckt ist, aber immer noch kann ich das nicht lösen. Ich hoffe, jemand hat eine Lösung für mich.

Was ich

habe ich arbeite mit Verhalten Designer, einen Vermögenswert für die Einheit. Ich mache Verhaltensbäume und das Problem trat auf, wenn ein behavior tree reference verwendet wurde.

Zuerst musste ich mein Verhalten Baum wie folgt aus:

Behavior Tree - Search door

Es sucht die Haustür. Wenn es gefunden wird, bewegt es sich darauf zu und kommuniziert mit dem Menschen, der das Spiel spielt.

Das funktionierte vor, aber jetzt habe ich diesen Baum Verhalten in einem Verhalten Baum Referenz, wie folgt aus:

Behavior Tree Reference

Wenn ich den Referenz Doppelklick auf die ersten Shows Bild. ABER, wo es schief geht, ist dies:

Human Instructions

Problem

Dies ist der menschliche Anweisungen Knoten in dem ersten Bild. Es lädt die Kommunikationsnachricht und die Kommunikationsschaltfläche nicht. Wenn ich die entsprechende Schaltfläche lade, wird sie sofort beim Abspielen des Szenarios zurückgesetzt. Das passierte, als ich dieses Verhalten in der Verhaltensbaumreferenz lud, und das Problem trat nicht auf, wenn ich dieses vom ursprünglichen Baum self spielte.

NullReferenceException: Object reference not set to an instance of an object 
HumanInstructions.CommunicationElements (Boolean activeOrNot) (at Assets/HumanInstructions.cs:54) 
HumanInstructions.OnAwake() (at Assets/HumanInstructions.cs:19) 
BehaviorDesigner.Runtime.BehaviorManager.EnableBehavior (BehaviorDesigner.Runtime.Behavior behavior) 
BehaviorDesigner.Runtime.Behavior.EnableBehavior() 
BehaviorDesigner.Runtime.Behavior.Start() 

Irgendwelche Ideen, was diese dazu führen können, und wie diese zu lösen?

Der Code von HumanInstructions

using UnityEngine; 
using UnityEngine.UI; 
using BehaviorDesigner.Runtime; 
using BehaviorDesigner.Runtime.Tasks; 
using UnityStandardAssets.Characters.FirstPerson; 

public class HumanInstructions : Action 
{ 
    public string humanInstructionsText; // The string in inspector that shows up on-screen for the human operator to communicate with UGV. 
    public string messageToConsole; // Print this message to console when the action is performed SUCCESSFUL. 
    public string textOnButton; // See inspector in Behavior Designer. Is used as text on button. 
    public Text CommunicationMessage; 
    public Button CommunicationButton; 
    bool boolClicked; // Is false; when the button is clicked, it will turn TRUE, calling the IF function, returning Taskstatus SUCCESS. 


    public override void OnAwake() 
    { 
     CommunicationElements (false); 
    } 

    public override void OnStart() 
    { 
     boolClicked = false; 
     CommunicationElements (false); 
     CommunicationButton.onClick.AddListener (ButtonClicked); 
    } 

    public override TaskStatus OnUpdate() 
    { 
     CommunicationMessage.text = humanInstructionsText; 
     CommunicationButton.GetComponentInChildren<Text>().text = textOnButton; 
     CommunicationElements (true); // The communication elements are VISIBLE on screen. 
     TriggerStatusCameraView (false); 
     if (boolClicked == true) { // this IF function is active when the button is clicked. See ButtonClicked() function. 
      CommunicationElements (false); // Removes the communication elements from screen. 
      TriggerStatusCameraView (true); 
      return TaskStatus.Success; 
     } else { 
      return TaskStatus.Running; 
     } 
    } 

    // The following function is called when the CommunicationButton is clicked on screen. 
    void ButtonClicked() 
    { 
     boolClicked = true; // Changes the value to true, so it will trigger the IF function in OnUpdate(); 
     Debug.Log (messageToConsole); // Sends this message to the console. 
    } 

    // The following function can be called upon and turn all UI elements (such as text, buttons or images) ACTIVE or not. 
    void CommunicationElements (bool activeOrNot) 
    { 
     CommunicationButton.gameObject.SetActive (activeOrNot); 
     CommunicationMessage.gameObject.SetActive (activeOrNot); 
    } 

    // The following code will DISABLE camera control if the communication screen is active for the human operator 
    void TriggerStatusCameraView(bool activeOrNot) 
    { 
     GameObject.Find ("FPSController").GetComponent<RigidbodyFirstPersonController_custom>().enabled = activeOrNot; 
    } 
} 
+0

nur eine Vermutung: Wenn Sie eine vorfabrizieren und verweisen Sie ihr Mitglied auf Szene Objekte, und dann versuchen, instanziieren von diesem vorfabrizieren, dann die Referenz-Links werden gebrochen. vielleicht etwas damit zu tun haben – Bijan

Antwort

2

Die Lösung war einfach. Danke, dass du dir das angeschaut hast.

Verwandte Themen