Я следую серии уроков.
Я столкнулся с проблемой. Я понимаю, что сообщение об ошибке:
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 в моем случае. Однако для меня это не относится.
Сначала вам нужно сделать свои переменные общедоступными, иначе они не будут отображаться в инспекторе:
public class GameSetup : MonoBehaviour {
public Camera mainCam;
public BoxCollider2D topWall, bottomWall, leftWall, rightWall;
public Transform player1, player2;
// rest of your code...
}
Затем перетащите некоторые игровые объекты (с соответствующими компонентами, прикрепленными к нему) в новые поля в инспекторе. Это должно исправить сообщение об ошибке "Ссылка на объект, не установленное на экземпляр объекта". Это сообщение об ошибке в основном означает, что вы пытаетесь выполнить работу с переменной, которая не имеет значения.
Ян решил проблему, но я просто хотел предложить альтернативу, если вы хотите, чтобы ваши члены были частными.
Просто разместите украшение <Serialize>
на членах, которые вы хотите отобразить в инспекторе.
<Serialize>
Camera mainCam;
<Serialize>
private BoxCollider2D topWall, bottomWall, leftWall, rightWall;
<Serialize>
просто указывает компилятору подготовить эту переменную для сериализации (преобразования в поток байтов), что позволяет экспортировать поле из вашей программы в другие программы. Распространенным форматом сериализации является XML, который Unity использует для определения того, что отображается в инспекторе. Поскольку общедоступные переменные общедоступны, вам не нужно сериализоваться, чтобы получить к ним доступ.
topWall
и т. Д. В редакторе Unity?