2016-06-27 8 views
0

Я пытаюсь закодировать игру и в системе регистрации, если код возврата - это нечто иное, чем два, чтобы показать всплывающее окно с сообщением об ошибке. Я сделал новый холст с прикрепленной панелью. Прикрепленное к панели - это кнопка и текст. В моем коде, если сервер отключился я хочу вызвать эту функцию:NullReferenceException in Unity3D

Register.cs (класс):

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

я должен использовать этот вар, так что я могу назвать эту функцию в другом классе называется UIManagerLoginRegister.cs (класс). Оттуда функция должна сделать это:

UIManagerLoginRegister.cs (класс):

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

ErrorText общественный текст, и объявляется выше, и я поставил его, перетащив его в через редактор. То же самое с errorCanvas, оно объявлено выше функции, и я устанавливаю его, перетаскивая его через редактор.

Но я получаю две ошибки. Первый:

Вы пытаетесь создать MonoBehaviour, используя ключевое слово 'new'. Это запрещено. MonoBehaviours можно добавлять только с помощью AddComponent(). Кроме того, ваш сценарий может наследовать от ScriptableObject или нет базового класса на всех
UnityEngine.MonoBehaviour: .ctor()
UIManagerLoginRegister: .ctor()
Регистрация: attemptRegister() (в Assets/_scripts/Register.cs: 81)
UnityEngine.EventSystems.EventSystem: Update()

Это не нравится, как я установил мой вар, так что я могу использовать другие функции классов. Так как я это исправить.

И моя вторая ошибка:

NullReferenceException: Ссылка на объект не указывает на экземпляр UIManagerLoginRegister.displayErrorMessage (System.String сообщение) объекта (на активы/_scripts/UIManagerLoginRegister.cs: 36)
Register.attemptRegister() (at 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/Время воспроизведения/Экспорт/UnityEvent.cs: 765)
UnityEngine.Events.UnityEvent.Invoke() (в C: /buildslave/unity/build/Runtime/Export/UnityEvent_0.cs: 53)
UnityEngine.UI.Button. Нажмите() (в 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, UnityEngi ne.EventSystems.BaseEventData eventData) (в C: /buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs: 52)
UnityEngine.EventSystems.ExecuteEvents.Execute [IPointerClickHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) (в C:/buildslave/unity/build/Extensions /guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:269) UnityEngine.EventSystems.EventSystem: Update()

Я не понимаю, почему я получаю эту вторую ошибку. Помогите мне исправить эти ошибки.

+0

Не первая ошибка вызывает вторую? Исправьте это, и я уверен, что он уходит. Например, что-то вроде этого: 'var uiclass = gameObject.AddComponent ();' (PS Я не Unity dev, просто хорошо в Google-fu) – DavidG

+0

NullReferenceException - одно из наименее полезных сообщений об ошибках в .Net , когда вы видите один взгляд на свой код в режиме отладки и проверяете всю свою переменную и находите ту, которая является нулевой, это обычно происходит, когда вы вызываете 'something.SomethingElse' и' something' является 'null', и потому что' null' doesn У вас есть свойство 'SomethingElse', вы получаете ошибку – MikeT

ответ

2

После того, как вы используете MonoBehaviour вы должны использовать GameObject.AddComponent

Таким образом, вы хотите, чтобы сделать новый экземпляр класса:

UIManagerLoginRegister uimlr = null; 

После того, как вы сделаете это, вы можете установить, что оно равно внутри функции аннулируются Start:

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

Оттуда у вас не должно быть больше проблем.

1

Вы пытаетесь создать MonoBehaviour, используя ключевое слово 'new'. Это запрещено. MonoBehaviours можно добавлять только с помощью AddComponent(). Кроме того, ваш сценарий может наследовать от ScriptableObject или нет базового класса на всех

Вам не использования new ключевых слов может создать новый экземпляр, если вы унаследовав от MonoBehaviour.

Ваш код сработал бы, если бы у вас был public class UIManagerLoginRegister {}. вместо public class UIManagerLoginRegister:MonoBehaviour {}

Как только вы наследуете от MonoBehaviour, вы должны либо использовать GameObject.AddComponent, либо Instantiate.

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

ИЛИ

Вы можете создать его экземпляр в качестве сборного если UIManagerLoginRegister присоединен к другим геймобжекты, таких как панели интерфейса. Сделайте это prefab, затем создайте экземпляр, как показано ниже:

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

Попробуйте следовать советам по ошибкам.

Вы пытаетесь создать MonoBehaviour, используя ключевое слово 'new'. Это запрещено. MonoBehaviours можно добавлять только с помощью AddComponent(). Кроме того, ваш сценарий может наследовать от ScriptableObject или нет базового класса на всех

Ваш UIManagerLoginRegister вероятно унаследован от monobehaviour. Если вы не требуете, чтобы он был monobehaviour, поэтому не нужно прикреплять его к игровому объекту, подумайте об этом.

Что касается вашей второй ошибки. Без дополнительного кода для его проверки я бы предположил, что либо errorText, либо errorCanvas не назначен. Попробуйте назначить их в редакторе, или через start/awake

 Смежные вопросы

  • Нет связанных вопросов^_^