@mlbot

Как установить ссылку на объект в Unity?

подскажите пожалуйста по Unity Заранее спасибо
в общем пытаюсь создать объект по нажатию клавиши.
А потом его сдвигать вместе с картой
if(!oneApple){

if (Input.GetKeyUp(KeyCode.Q))
{
createApple();
GameObject apple = GameObject.Find("apple");
oneApple = true;
}

}
GameObject createApple(){

GameObject result = new GameObject("apple");

GameObject apple = null;
apple = apllePrefab;

Vector3 applePos = transform.position + new Vector3 (1, 0.5f,1);

if (apple !=null){
GameObject go = Instantiate(apllePrefab, applePos,Quaternion.identity);

}
return result;
}
вроде создается примерно там где надо
но когда пытюсь двигать
if (oneApple)
{

apple.transform.position -= new Vector3(0, 0, 5 * Time.deltaTime);

if (apple.transform.position.z < -15)
{
Destroy(apple);
oneApple =false;

}
}
вылетает ошибка что объект
NullReferenceException: Object reference not set to an instance of an object
createVegetables.Update () (at Assets/Scripts/createVegetables.cs:43)
несколько вариантов перепробовал но Unity все равно ругаеться
  • Вопрос задан
  • 63 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Ezekiel4
Охотник на пиратов и сборщик монолитов
Есть такое понятие как контекст. Если переменная создана внутри одного блока кода, она не будет видима нигде, кроме этого и дочерних ему блоков кода, коими являются как методы, так и конструкции типа if. В вашем коде есть два фрагмента:
if (!oneApple) {
	if (Input.GetKeyUp(KeyCode.Q)) {
		createApple();
		GameObject apple = GameObject.Find("apple");
		oneApple = true;
	}
}

if (oneApple) {
	apple.transform.position -= new Vector3(0, 0, 5 * Time.deltaTime);
	if (apple.transform.position.z < -15) {
		Destroy(apple);
		oneApple =false;
	}
}

Не понятно, идут они вместе или в разных методах, но даже на этом уровне видно, что контекст переменной apple находится исключительно внутри блока первого фрагмента кода. Решается это путём создания переменной класса. Если таковая уже есть, тогда из первого фрагмента удалите GameObject, чтобы получилось.
if (!oneApple) {
	if (Input.GetKeyUp(KeyCode.Q)) {
		createApple();
		apple = GameObject.Find("apple");
		oneApple = true;
	}
}

И, на будущее, вставляйте скрипты внутрь соответствующего тега.
Пара непрошенных советов
// Данный код
GameObject createApple() {
	GameObject result = new GameObject("apple");
	GameObject apple = null;
	apple = apllePrefab;
	Vector3 applePos = transform.position + new Vector3 (1, 0.5f,1);
	if (apple != null) {
		GameObject go = Instantiate(apllePrefab, applePos,Quaternion.identity);
	}
	return result;
}
// Можно заменить на такой без потери смысла
GameObject сreateApple() {
	var applePos = transform.position + new Vector3(1, 0.5f, 1);
	return Instantiate(apllePrefab, applePos, Quaternion.identity);
}
// Далее в этом фрагменте вы сначала помещаете объект на сцену, а затем пытаетесь его найти
if (!oneApple) {
	if (Input.GetKeyUp(KeyCode.Q)) {
		createApple();
		apple = GameObject.Find("apple");
		oneApple = true;
	}
}
// Не то чтобы метод GameObject.Find вообще не стоило
// никогда использовать, но обычно есть более практичные
// способы это сделать. Например передать прямую ссылку:
if (!oneApple) {
	if (Input.GetKeyUp(KeyCode.Q)) {
		apple = сreateApple();
		oneApple = true;
	}
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы