繁体   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