Проблемы со ссылками на объекты в Unity

1

Я следую серии уроков.

Я столкнулся с проблемой. Я понимаю, что сообщение об ошибке:

Object reference not set to an instance of an object

значит, но я не уверен, почему появилось это сообщение. Я не уверен, почему он не может ссылаться на него. Я совершенно новый для Единства.

Я также создал свой проект в documents/UnityProjects/PongTutorial, где PongTutorial - это название этого проекта.

Я создал папку для своих проектов Unity, чтобы держать их вместе. Могут ли быть проблемы с созданием моих проектов Unity в папке UnityProjects вместо создания каждого проекта в папке " My Documents "?

Я создал gameManager и прикрепил к нему сценарий под названием GameSetup, где код внутри этого скрипта:

using UnityEngine;
using System.Collections;

public class GameSetup : MonoBehaviour 
{
    Camera mainCam;
    BoxCollider2D topWall, bottomWall, leftWall, rightWall;
    Transform player1, player2;

    // Use this for initialization
    void Start () 
    {
    }

    // Update is called once per frame
    void Update () 
    {
        topWall.size = new Vector2(mainCam.ScreenToWorldPoint(new Vector3(Screen.width * 2f, 0f, 0f)).x, 1f);
        topWall.center = new Vector2(0f, mainCam.ScreenToWorldPoint(new Vector3(0f, Screen.height, 0f)).y + 0.5f);
    }
}

Я очистил, построил и перестроил Assembly-CSharp в MonoDevelop для этого скрипта, а PongTutorial в MonoDevelop также, где я получаю предупреждения о mainCam и всех переменных типа BoxCollider2D.

Эти предупреждения говорят, что они никогда не назначены, поэтому будет иметь нулевое значение, которое истинно. Тем не менее, я получаю object reference not set to an instance of an object на object reference not set to an instance of an object для topWall.size и topWall.center.

Я только что попытался создать новые объекты. Например, в Start меня есть mainCam = new Camera(), но это не работает. В видео переменные видны в Инспекторе для GM или GameManager в моем случае. Однако для меня это не относится.

  • 0
    Вы помните, чтобы прикреплять экземпляры к переменным topWall и т. Д. В редакторе Unity?
  • 0
    Извините, я не совсем уверен, что вы имеете в виду.
Показать ещё 1 комментарий
Теги:
unity3d
scripting
object-reference

2 ответа

4
Лучший ответ

Сначала вам нужно сделать свои переменные общедоступными, иначе они не будут отображаться в инспекторе:

public class GameSetup : MonoBehaviour {

public Camera mainCam;
public BoxCollider2D topWall, bottomWall, leftWall, rightWall;
public Transform player1, player2;

// rest of your code...

}

Затем перетащите некоторые игровые объекты (с соответствующими компонентами, прикрепленными к нему) в новые поля в инспекторе. Это должно исправить сообщение об ошибке "Ссылка на объект, не установленное на экземпляр объекта". Это сообщение об ошибке в основном означает, что вы пытаетесь выполнить работу с переменной, которая не имеет значения.

  • 0
    Оу ... упс: S ... я забыл об общедоступной части ... так как этот урок написан на JavaScript, и я, очевидно, использую C #, они только что использовали var, а не public .... Спасибо за помощь ... это было глупой ошибкой для меня ... теперь это работает, но у меня возникает отдельная проблема, когда ширина topWall больше, чем игровая область / игровой экран ... dw я отмечу это как правильный ответ ... еще раз спасибо :)
2

Ян решил проблему, но я просто хотел предложить альтернативу, если вы хотите, чтобы ваши члены были частными.

Просто разместите украшение <Serialize> на членах, которые вы хотите отобразить в инспекторе.

<Serialize>
Camera mainCam;
<Serialize>
private BoxCollider2D topWall, bottomWall, leftWall, rightWall;
  • 0
    Спасибо за решение, но я не уверен, что означает Serialize, так как я на самом деле не использовал его раньше ... Я обычно хотел бы, чтобы участники были частными, так как меня учили, что это лучшая привычка, и общественность может вызвать некоторые проблемы или разрешить ненужный доступ к определенным переменным.
  • 0
    Декорация <Serialize> просто указывает компилятору подготовить эту переменную для сериализации (преобразования в поток байтов), что позволяет экспортировать поле из вашей программы в другие программы. Распространенным форматом сериализации является XML, который Unity использует для определения того, что отображается в инспекторе. Поскольку общедоступные переменные общедоступны, вам не нужно сериализоваться, чтобы получить к ним доступ.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню