Top.Mail.Ru
Ответы

Помогите с кодом в юнити!

Хочу сделать так, чтобы объект (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);
}
}
}

По дате
По рейтингу
Аватар пользователя
Оракул
4мес

Метод OnPointerDown (и, возможно, OnPointerUp) вызывается до того, как выполнится метод Start в MoveButton. В Start вы присваиваете значение planeScript, а в OnPointerDown вы уже пытаетесь его использовать. Перенесите инициализацию planeScript в метод Awake. Awake вызывается всегда до Start и любых других событий, таких как нажатия кнопок.

12345678910111213141516171819202122232425262728293031
 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, если он тоже уничтожается:

12345
 // В скрипте MoveButton 
void OnDestroy() 
{ 
    planeScript = null; // Или отписаться от событий, если они есть 
} 
Аватар пользователя
Знаток
4мес

Print ('helo world')