2013-10-28 43 views
0

我正在嘗試向某個人添加一個Quest對象。它成功了一個,並給另一個nullreferenceexception,我在這裏做錯了什麼? P.S.播放器和請求者在Unity檢查器中設置。Unity中的NullReferenceException(C#)

public class GameCreator : MonoBehaviour { 
    private Quest quest; 
    public Player player; 
    public Requestor requestor; 

    void Start() { 
     quest = createQuest(); 
     requestor.thisPerson.SetQuest(quest); //this is the problem 
     player.thisPerson.SetQuest(quest); 
    } 
} 

public class Player : MonoBehaviour { 
    public Person thisPerson; 

    void Start() { 
      thisPerson = new Person("Name"); 
    } 
} 

public class Requestor: MonoBehaviour { 
    public Person thisPerson; 

    void Start() { 
      thisPerson = new Person("Name"); 
    } 
} 

public class Person { 
    public Quest quest; 

    void SetQuest(Quest quest) { 
      this.quest = quest; 
    } 
} 

任何建議爲什麼這會出錯?

+1

可能重複[什麼是NullReferenceException,我該如何解決它?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-doi-i-修復它) – LearnCocos2D

+0

不,那個問題只是關於一個NullReferenceException,我在Unity中專門針對C#中的人提出了一個問題。另外這個問題已經在兩年前得到了解答...... – Teysz

+0

NullReferenceException的原因以及如何解決它們總是相同的,至少參考問題正在很好地解釋原因,應該清楚爲什麼會發生錯誤(這裏requestor或thisPerson都是null)。 – LearnCocos2D

回答

3

移動你的變量初始化中Awake(),看到documentation爲以下(轉述):

清醒使用 比賽開始前必須初始化的變量或遊戲狀態....並使用啓動來回傳遞任何信息。

您編寫GameCreator.Start()的方式是依賴於Unity調用腳本的任意順序。 GameCreator可能是第一個調用的對象,在這種情況下,其他腳本都沒有初始化它們的值。

其他可能的錯誤:

  1. 你不顯式實例requestor,我要承擔這是在統一的檢查完成。
  2. 您沒有包含可能返回null的`createQuest()'。
1

正如Jordak所說,您的Start方法可以以任何可能的順序運行,因此您不能依賴其他某個組件的啓動。有幾種方法可以解決此問題:

  • 您可以將基本初始化代碼移動到Awake()。但是,這隻允許您進行兩個級別的初始化,並且在將來可能不足。
  • 您可以在項目設置中調整腳本優先級。然而,這不是真正的C#方式,因爲這會讓你的代碼依賴於它不明顯的邏輯。
  • 不是在類初始化中初始化thisPerson字段,而是創建一個公共屬性來訪問它。 (無論如何,公共字段在C#中是不好的練習)。在此屬性中,您可以在返回它之前檢查該字段是否爲空,如果是,則初始化它。
相關問題