[英]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.AddComponent
或Instantiate
。
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
,因此不要求將其附加到游戲對象上,請考慮將其刪除。
至於你的第二個錯誤。 沒有更多的代碼來驗證它,我將假定未分配errorText
或errorCanvas
。 嘗試在編輯器中或通過start
/ awake
來分配它們
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.