簡體   English   中英

Unity3D中的NullReferenceException

[英]NullReferenceException in Unity3D

我正在嘗試編寫一個游戲,並在注冊系統中編寫代碼,如果返回代碼不是兩個,則顯示帶有錯誤消息的彈出窗口。 我制作了一塊帶有面板的新畫布。 附加在面板上的是按鈕和文本。 在我的代碼中,如果服務器離線,我想調用此函數:

Register.cs(類):

} catch(SocketException) {
    var uiclass = new UIManagerLoginRegister ();
    uiclass.displayErrorMessage ("Unable to connect to server. Please try again later.");
}

我必須使用該var,以便可以在另一個名為UIManagerLoginRegister.cs(類)的類中調用該函數。 從那里該功能應該這樣做:

UIManagerLoginRegister.cs(類):

public void displayErrorMessage(string message) {
    errorText.text = message;
    errorCanvas.enabled = true;
}

errorText是公共文本,已在上面聲明,我通過在編輯器中將其拖動來進行設置。 與errorCanvas相同,它在函數上方聲明,我通過在編輯器中將其拖動來進行設置。

但是我收到兩個錯誤。 第一個是:

您正在嘗試使用'new'關鍵字創建MonoBehaviour。 這是不允許的。 只能使用AddComponent()添加MonoBehaviours。 或者,您的腳本可以從ScriptableObject繼承,也可以根本沒有基類
UnityEngine.MonoBehaviour:.ctor()
UIManagerLoginRegister:.ctor()
注冊:attemptRegister()(位於Assets / _scripts / Register.cs:81)
UnityEngine.EventSystems.EventSystem:Update()

它不喜歡我如何設置var,因此我可以使用其他類函數。 那么我該如何解決。

我的第二個錯誤是:

NullReferenceException:對象引用未設置為對象UIManagerLoginRegister.displayErrorMessage(System.String消息)的實例(位於Assets / _scripts / UIManagerLoginRegister.cs:36)
Register.attemptRegister()(位於Assets / _scripts / Register.cs:82)
UnityEngine.Events.InvokableCall.Invoke(System.Object [] args)(在C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:153)
UnityEngine.Events.InvokableCallList.Invoke(System.Object []參數)(在C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:630)
UnityEngine.Events.UnityEventBase.Invoke(System.Object []參數)(在C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:765)
UnityEngine.Events.UnityEvent.Invoke()(在C:/buildslave/unity/build/Runtime/Export/UnityEvent_0.cs:53)
UnityEngine.UI.Button.Press()(在C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:35)
UnityEngine.UI.Button.OnPointerClick(UnityEngine.EventSystems.PointerEventData eventData)(位於C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:44)
UnityEngine.EventSystems.ExecuteEvents.Execute(IPointerClickHandler處理程序,UnityEngine.EventSystems.BaseEventData eventData)(在C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:52)
UnityEngine.EventSystems.ExecuteEvents.Execute [IPointerClickHandler](UnityEngine.GameObject目標,UnityEngine.EventSystems.BaseEventData eventData,UnityEngine.EventSystems.EventFunction`1函數)(位於C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI /EventSystem/ExecuteEvents.cs:269)UnityEngine.EventSystems.EventSystem:Update()

我不明白為什么會收到第二個錯誤。 請幫助我解決這些錯誤。

一旦使用了MonoBehaviour,就必須使用GameObject.AddComponent

因此,您將需要創建該類的新實例:

UIManagerLoginRegister uimlr = null;

完成此操作后,您可以在void Start函數內部設置它等於什么:

gameObject.AddComponent<UIManagerLoginRegister>();
uimlr = gameObject.GetComponent<UIManagerLoginRegister>();

從那里,您應該沒有更多問題了。

您正在嘗試使用'new'關鍵字創建MonoBehaviour。 這是不允許的。 只能使用AddComponent()添加MonoBehaviours。 或者,您的腳本可以從ScriptableObject繼承,也可以根本沒有基類

如果要繼承MonoBehaviour 則不能使用new關鍵字來創建新實例。

如果您具有public class UIManagerLoginRegister {}那么您的代碼將public class UIManagerLoginRegister {} 而不是public class UIManagerLoginRegister:MonoBehaviour {}

MonoBehaviour繼承后,您應該使用GameObject.AddComponentInstantiate

UIManagerLoginRegister loginRegister = null;
void Start()
{
   gameObject.AddComponent<UIManagerLoginRegister>();
   loginRegister = gameObject.GetComponent<UIManagerLoginRegister>();
}

要么

如果將UIManagerLoginRegister附加到其他游戲對象(例如UI面板),則可以將其實例化為預制。 使其成為預制件,然后實例化如下:

public GameObject loginRegisterPrefab;
UIManagerLoginRegister loginRegister;
void Start()
{
    GameObject tempObjct = Instantiate(loginRegisterPrefab) as GameObject;
    loginRegister = tempObjct.GetComponent<UIManagerLoginRegister>();
}

嘗試遵循您的錯誤消息建議。

您正在嘗試使用'new'關鍵字創建MonoBehaviour。 這是不允許的。 只能使用AddComponent()添加MonoBehaviours。 或者,您的腳本可以從ScriptableObject繼承,也可以根本沒有基類

您的UIManagerLoginRegister可能繼承自monobehaviour 如果您不要求將其作為monobehaviour ,因此不要求將其附加到游戲對象上,請考慮將其刪除。

至於你的第二個錯誤。 沒有更多的代碼來驗證它,我將假定未分配errorTexterrorCanvas 嘗試在編輯器中或通過start / awake來分配它們

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM