Задача: игра от 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;
}
}
}