2
respostas

[Bug] PlayerAnim gerando o erro: NullReferenceException: Object reference not set to an instance of an object

Dei uma olhadinha no código fonte C# e aparentemente não tem nada de errado ou diferente do código do professor. Ele aparece no console da Unity quando eu executo o game, dizendo que o erro ocorre na linha 15, onde há o seguinte trecho: GameManager.Instance.InputManager.OnAttack += PlayAttackAnim;

Será que é alguma coisa que acabei esquecendo de fazer na Unity?

2 respostas

Bom dia!

Sim, esse erro provavelmente está relacionado a algo que ficou faltando configurar na Unity, e não diretamente ao código C#.

O erro:

NullReferenceException: Object reference not set to an instance of an object
na linha: GameManager.Instance.InputManager.OnAttack += PlayAttackAnim;

significa que algum dos objetos da cadeia GameManager.Instance.InputManager está null no momento em que essa linha é executada.

O GameManager está presente na cena?

  • Ve se o objeto que contém o script GameManager está na Hierarquia da cena no momento da execução.
  • Se ele for um singleton, ele precisa existir na cena antes de qualquer outro objeto que tente acessá-lo.

O Instance do GameManager está corretamente atribuído?

Dentro do GameManager, você deve ter algo como:

public static GameManager Instance;

void Awake()
{
    if (Instance == null)
        Instance = this;
    else
        Destroy(gameObject);
}
  • Essa linha Instance = this; precisa ser chamada no Awake() antes que outros scripts acessem o GameManager.

O InputManager está atribuído no GameManager?

Dentro do GameManager, normalmente você tem algo como:

public InputManager InputManager;
  • Confirme se esse campo InputManager foi arrastado no Inspector da Unity.
  • Se estiver null, o erro vai ocorrer exatamente como você relatou.

No Inspector:

  1. Selecione o objeto GameManager na Hierarquia.
  2. Veja se o campo InputManager aparece.
  3. Arraste para ele o GameObject que contém o script InputManager.

Abraços.

Bom dia, obrigado pela resposta! Sim, o problema aparentemente estava na Unity mesmo. O que eu fiz foi:

  • Inverter a lógica da estrutura condicional do GameManager para:
using UnityEngine;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;
    public InputManager InputManager { get; private set; }

    private void Awake()
    {
        if (Instance == null) Instance = this;
        else Destroy(this.gameObject);

        InputManager = new InputManager();
    }
}
  • Remover o componente do Gamemanager no game object e adicionar novamente.

Entretanto, o campo InputManager não aparece, isso é um problema, certo?