Olá, estou na aula 18 ( Controladores Mobile part II ) Do módulo construção extrema. Tudo funciona corretamente, porém estou obtendo um erro que ainda não entendo por que ocorre, toda vez que solto o cubo.
NullReferenceException: Object reference not set to an instance of an object
GeradorDeCubos.SoltarCubo () (at Assets/Scripts/GeradorDeCubos.cs:62)
NullReferenceException while executing ‘performed’ callbacks of ‘Player/SoltarCubo[/Keyboard/space,/Gamepad/buttonSouth]’
E este é meu código:
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.InputSystem;
public class GeradorDeCubos : MonoBehaviour
{
[SerializeField] private GameObject cuboPrefab; // Referência ao prefab gerado
[SerializeField] private GameObject ultimoCuboGerado; // Referência ao último gerado, para fins de controle e spawn.
private AlturaDaConstrucao alturaDaConstrucao; // Referência ao script AlturaDaConstrução
private Transform cameraPrincipal; // Referencia camera principal
[SerializeField] private UnityEvent OnSoltarCubo;
private Vector3 entradasJogador;
void Start()
{
cameraPrincipal = Camera.main.transform; // Recebe camera principal
alturaDaConstrucao = GetComponent<AlturaDaConstrucao>(); // Referência ao script AlturaDaConstrução
GerarCubo();
}
void Update()
{
// Se o último cubo gerado já tiver recebido null, cancela (ele recebe null quando o soltamos na plataforma)
if (ultimoCuboGerado == null) return;
// Captura entradas vertical e horizontal do teclado
//Vector3 entradasJogador = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
// Transforma os valores de eixos globais de entradasJogador para eixos locais da câmera
Vector3 direcaoCamera = cameraPrincipal.TransformDirection(entradasJogador);
// Eixo y recebe valor 0 constantemente.
direcaoCamera.y = 0;
// Faz com que consigamos mover o último cubo gerado
ultimoCuboGerado.transform.position += direcaoCamera.normalized * Time.deltaTime * 3;
}
private void GerarCubo()
{
// O último cubo gerado é a própria instância do cuboPrefab, no centro da plataforma, sem rotação e na altura atual, no script AlturaDaConstrução.
ultimoCuboGerado = Instantiate(cuboPrefab, new Vector3(Random.Range(-3, 4), alturaDaConstrucao.AlturaAtual() + 2, Random.Range(-3, 4)), Quaternion.identity);
// Valores aleatórios para spawnar o cubo
int tamanhoX = Random.Range(1, 7);
int tamanhoY = Random.Range(1, 5);
int tamanhoZ = Random.Range(1, 7);
// O último cubo gerado recebe um tamanho aleatório, no caso (localScale) baseado nas variáveis acima
ultimoCuboGerado.transform.localScale = new Vector3(tamanhoX, tamanhoY, tamanhoZ);
// O último cubo gerado recebe uma cor aleatória
ultimoCuboGerado.GetComponent<MeshRenderer>().material.color = Random.ColorHSV();
}
public void SoltarCubo()
{
// Aqui ativamos a gravidade, ou seja, soltamos o cubo, e então definimos ele como nulo, para que não possamos mais controla-lo
// no método update
ultimoCuboGerado.GetComponent<Rigidbody>().useGravity = true;
ultimoCuboGerado.transform.GetChild(0).gameObject.SetActive(false);
ultimoCuboGerado = null;
OnSoltarCubo.Invoke();
Invoke(nameof(GerarCubo), 2);
}
public void MoverCubo(InputAction.CallbackContext value)
{
Vector2 input = value.ReadValue<Vector2>();
entradasJogador = new Vector3(input.x, 0, input.y);
}
public void SoltarCubo(InputAction.CallbackContext value)
{
if (value.started)
{
SoltarCubo();
}
}
}