1

Задача: игра от 1-го лица. Управление персонажем по джойстикам, пишется под смартфон. Персонаж должен подойти к объекту, увидеть кнопки и брать / бросать объект по тапу на кнопки.

Алгоритм:

  1. Игрок (Player) подходит к объекту, с которым нужно взаимодействовать - мяч (Ball)

  2. Игрок вступает в коллайдер, дочерний мячу – активируются UI-кнопки подбора (grabButton) и броска (throwButton) мяча:

    private void OnTriggerExit(Collider other)
    {
        if (other.gameObject.name == "Player")
        {
            grabButton.SetActive(false);
            throwButton.SetActive(false);
        }
    }
    
  3. При нажатии кнопки «Взять» - активируется метод «Grab»:

    public void Grab()
    {
        _rb.useGravity = false;
        _rb.isKinematic = true;
        _rb.MovePosition(_arm.position);
        _fpc.take = true;
    }
    
  4. При нажатии кнопки «Бросить» - активируется метод «Throw»:

    public void Throw()
    {
        _rb.AddForce(Camera.main.transform.forward * 800);
        _rb.useGravity = true;
        _rb.isKinematic = false;
        _fpc.take = false;
        //_throw.throwAbility = true;
    }
    

Вопрос: при нажатии на Throw – ошибка:
NullReferenceException: Object reference not set to an instance of an object ColliderGrab.Throw () (at Assets/ColliderGrab.cs:48)

Пробовал и метод OnClick, и через if (Input.Getkey) – результат тот же. Пожалуйста, подскажите, в чём проблема. Весь скрипт висит на коллайдере-триггере, дочернем к мячу.

P.S.: я начинающий и это мой первый вопрос, сори за возможные недочёты. Заранее спасибо!

Код целиком:

using UnityEngine;

public class ColliderGrab : MonoBehaviour { public GameObject grabButton; public GameObject throwButton;

public Rigidbody _rb;
private FpcParam _fpc;
public Transform _arm;

private void Start()
{
    _rb = GameObject.Find("Ball").GetComponent<Rigidbody>();
    _fpc = GameObject.Find("Player").GetComponent<FpcParam>();
}

private void OnTriggerStay(Collider other)
{
    if (other.gameObject.name == "Player")
    {
        grabButton.SetActive (true);
        throwButton.SetActive(true);
    }
}

private void OnTriggerExit(Collider other)
{
    if (other.gameObject.name == "Player")
    {
        grabButton.SetActive(false);
        throwButton.SetActive(false);
    }
}

public void Grab()
{
    _rb.useGravity = false;
    _rb.isKinematic = true;
    _rb.MovePosition(_arm.position);
    _fpc.take = true;
}

public void Throw()
{
    _rb.AddForce(Camera.main.transform.forward * 800);
    _rb.useGravity = true;
    _rb.isKinematic = false;
    _fpc.take = false;
    }

private void FixedUpdate()
{
    if (_rb.isKinematic == true)
    {
        _rb.gameObject.transform.position = _arm.position;
    }
}

}

Dark Space
  • 1,364
  • 3
  • 22
  • Когда вы обращаетесь к членам объекта через точку в то время когда сам объект null, возникает такое исключение. Попробуйте с помощью Debug.Log выяснить, что там на самом деле null. – aepot Dec 20 '23 at 12:12

0 Answers0