Помогите с кодом в юнити!
Хочу сделать так, чтобы объект (Plane) двигался вверх-вниз по нажатию кнопок на экране. Выдаёт ошибку при нажатии кнопок:
NullReferenceException: Object reference not set to an instance of an object
MoveButton.OnPointerDown (UnityEngine.EventSystems.PointerEventData eventData) (at Assets/Scripts/MoveButton.cs:18)
UnityEngine.EventSystems.ExecuteEvents.Execute (UnityEngine.EventSystems.IPointerDownHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at ./Library/PackageCache/com.unity.ugui/Runtime/UGUI/EventSystem/ExecuteEvents.cs:43)
UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1] functor) (at ./Library/PackageCache/com.unity.ugui/Runtime/UGUI/EventSystem/ExecuteEvents.cs:272)
UnityEngine.EventSystems.EventSystem:Update() (at ./Library/PackageCache/com.unity.ugui/Runtime/UGUI/EventSystem/EventSystem.cs:530)
Код:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
public class MoveButton : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
[SerializeField]
private GameObject plane;
private PlaneParentMove planeScript;
[SerializeField]
private int moveDirection;
public void OnPointerDown(PointerEventData eventData)
{
planeScript.moveDirection = moveDirection;
}
public void OnPointerUp(PointerEventData eventData)
{
planeScript.moveDirection = 0;
}
void Start()
{
planeScript = plane.GetComponent<PlaneParentMove>();
}
}
Другой код с настройками:
using UnityEngine;
public class PlaneParentMove : MonoBehaviour
{
Vector3 moveVector;
public int moveDirection = 0;
[SerializeField]
float speed = 5.0f;
void Start()
{
moveVector = new Vector3(0, speed);
}
// Update is called once per frame
void Update()
{
if (transform.position.y < 12.2 && moveDirection == 1)
{
transform.Translate(moveVector * Time.deltaTime);
}
else if (transform.position.y > 4 && moveDirection == -1)
{
transform.Translate(-moveVector * Time.deltaTime);
}
}
}
Метод OnPointerDown (и, возможно, OnPointerUp) вызывается до того, как выполнится метод Start в MoveButton. В Start вы присваиваете значение planeScript, а в OnPointerDown вы уже пытаетесь его использовать. Перенесите инициализацию planeScript в метод Awake. Awake вызывается всегда до Start и любых других событий, таких как нажатия кнопок.
public class MoveButton : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
[SerializeField]
private GameObject plane;
private PlaneParentMove planeScript;
[SerializeField]
private int moveDirection;
public void OnPointerDown(PointerEventData eventData)
{
planeScript.moveDirection = moveDirection;
}
public void OnPointerUp(PointerEventData eventData)
{
planeScript.moveDirection = 0;
}
void Awake() // Изменили Start на Awake
{
planeScript = plane.GetComponent<PlaneParentMove>();
// Дополнительная проверка на null
if (planeScript == null)
{
Debug.LogError("PlaneParentMove script not found on the Plane object!");
}
}
}
На объекте, который вы присвоили переменной plane в инспекторе, отсутствует компонент (скрипт) PlaneParentMove. Убедитесь, что на вашем объекте Plane в иерархии сцены прикреплен скрипт PlaneParentMove. Если его нет, добавьте его.
В инспекторе Unity, в компоненте MoveButton, вы не назначили (или назначили не тот) объект в поле plane. plane может быть null или указывать на другой объект, у которого нет PlaneParentMove. Перетащите ваш объект Plane из иерархии сцены в поле plane инспектора компонента MoveButton (который, вероятно, прикреплен к вашим кнопкам).
Объект plane (или объект с компонентом PlaneParentMove) уничтожается (Destroy()) до того, как вы пытаетесь получить к нему доступ через planeScript. Проверьте, нет ли в вашем коде мест, где вы уничтожаете объект plane. Если это так, убедитесь, что MoveButton не пытается взаимодействовать с planeScript после уничтожения объекта. Можно, например, отписаться от событий или обнулить planeScript в OnDestroy скрипта MoveButton, если он тоже уничтожается:
// В скрипте MoveButton
void OnDestroy()
{
planeScript = null; // Или отписаться от событий, если они есть
}
Print ('helo world')