NullReferenceException: Object reference not set to an instance
4 participantes
Página 1 de 1
NullReferenceException: Object reference not set to an instance
preciso de ajuda. Estava criando a AI no unity, e simplesmente não funciona nenhuma das animações, e o AI fica dentro do chão (andando)
e diz, que tem um objecto de referencia não setado, mas eu não sei qual, me ajudem.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy1 : MonoBehaviour
{
public int rutina;
public float cronometro;
public Animator ani;
public Quaternion angulo;
public float grado;
// Start is called before the first frame update
void Start()
{
ani = GetComponent<Animator>();
}
// Update is called once per frame
public void Comportamiento_Enemy()
{
cronometro += 1 * Time.deltaTime;
if (cronometro >= 4)
{
rutina = Random.Range(0, 2);
cronometro = 0;
}
switch (rutina)
{
case 0:
ani.SetBool("walk", false);
break;
case 1:
grado = Random.Range(0, 360);
angulo = Quaternion.Euler(0, grado, 0);
rutina++;
break;
case 2:
transform.rotation = Quaternion.RotateTowards(transform.rotation, angulo, 0.5f);
transform.Translate(Vector3.forward * 1 * Time.deltaTime);
ani.SetBool("walk", true);
break;
}
}
void Update()
{
Comportamiento_Enemy();
}
}
e diz, que tem um objecto de referencia não setado, mas eu não sei qual, me ajudem.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy1 : MonoBehaviour
{
public int rutina;
public float cronometro;
public Animator ani;
public Quaternion angulo;
public float grado;
// Start is called before the first frame update
void Start()
{
ani = GetComponent<Animator>();
}
// Update is called once per frame
public void Comportamiento_Enemy()
{
cronometro += 1 * Time.deltaTime;
if (cronometro >= 4)
{
rutina = Random.Range(0, 2);
cronometro = 0;
}
switch (rutina)
{
case 0:
ani.SetBool("walk", false);
break;
case 1:
grado = Random.Range(0, 360);
angulo = Quaternion.Euler(0, grado, 0);
rutina++;
break;
case 2:
transform.rotation = Quaternion.RotateTowards(transform.rotation, angulo, 0.5f);
transform.Translate(Vector3.forward * 1 * Time.deltaTime);
ani.SetBool("walk", true);
break;
}
}
void Update()
{
Comportamiento_Enemy();
}
}
gamedevretro- Iniciante
- PONTOS : 651
REPUTAÇÃO : 0
Respeito as regras :
Re: NullReferenceException: Object reference not set to an instance
Olá amigo eu tenho uma AI simples para inimigos que funciona bem, é boa para inimigos tipo corpo a corpo, mais vc pode adicionar projetos sem problemas.
Fiz um pequeno vídeo de como utilizar o script ok, sempre verifica se vc esta usando Humanoides e se os parâmetros do Animator estão corretos e a conexão com as animações.
Este Script possui alguns Eventos para vc complementar com outros scripts ou dar mais vida ao Inimigo como Sons, Efeitos, etc.
Fiz um pequeno vídeo de como utilizar o script ok, sempre verifica se vc esta usando Humanoides e se os parâmetros do Animator estão corretos e a conexão com as animações.
Este Script possui alguns Eventos para vc complementar com outros scripts ou dar mais vida ao Inimigo como Sons, Efeitos, etc.
- Código:
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Events;
public class InimigoAI : MonoBehaviour
{
public NavMeshAgent agent;
[SerializeField] string PlayerTag = "Player";
Transform player;
public LayerMask whatIsGround, whatIsPlayer;
[SerializeField] float vidaInimigo;
//Patrulhamento
public Vector3 walkPoint;
bool walkPointSet;
[SerializeField] float pontoCaminhada;
//Atacante
[SerializeField] float tempoEntreAtaques;
bool PlayerAtacado;
//Estados
public float gamaVisao, raioAtaque;
public bool playerNaVisao, playerNoAlcanceAtaque;
public Animator anim;
public UnityEvent EventoInicio;
public UnityEvent EventoAtaque;
public UnityEvent EventoPatrulhamento;
public UnityEvent EventoBuscaPlayer;
public UnityEvent EventoMorte;
private void Start()
{
if (EventoInicio == null)
EventoInicio = new UnityEvent();
if (EventoAtaque == null)
EventoAtaque = new UnityEvent();
if (EventoPatrulhamento == null)
EventoPatrulhamento = new UnityEvent();
if (EventoBuscaPlayer == null)
EventoBuscaPlayer = new UnityEvent();
if (EventoMorte == null)
EventoMorte = new UnityEvent();
player = GameObject.FindWithTag(PlayerTag).transform;
anim.SetBool("Idle", true);
}
private void Awake()
{
player = GameObject.FindWithTag(PlayerTag).transform;
agent = GetComponent<NavMeshAgent>();
EventoInicio.Invoke();
}
private void Update()
{
playerNaVisao = Physics.CheckSphere(transform.position, gamaVisao, whatIsPlayer);
playerNoAlcanceAtaque = Physics.CheckSphere(transform.position, raioAtaque, whatIsPlayer);
if (!playerNaVisao && !playerNoAlcanceAtaque) Patrulhamento();
if (playerNaVisao && !playerNoAlcanceAtaque) BuscandoPlayer();
if (playerNoAlcanceAtaque && playerNaVisao) AttackPlayer();
}
private void Patrulhamento()
{
if (!walkPointSet) GerarPontoCaminho();
if (walkPointSet)
agent.SetDestination(walkPoint);
Vector3 distanceToWalkPoint = transform.position - walkPoint;
EventoPatrulhamento.Invoke();
if (distanceToWalkPoint.magnitude < 1f)
walkPointSet = false;
}
private void GerarPontoCaminho()
{
float randomZ = Random.Range(-pontoCaminhada, pontoCaminhada);
float randomX = Random.Range(-pontoCaminhada, pontoCaminhada);
walkPoint = new Vector3(transform.position.x + randomX, transform.position.y, transform.position.z + randomZ);
anim.SetBool("Attack", false);
anim.SetBool("Idle", false);
anim.SetBool("Walk", true);
if (Physics.Raycast(walkPoint, -transform.up, 2f, whatIsGround))
walkPointSet = true;
}
private void BuscandoPlayer()
{
agent.SetDestination(player.position);
EventoBuscaPlayer.Invoke();
anim.SetBool("Attack", false);
anim.SetBool("Idle", false);
anim.SetBool("Walk", true);
}
private void AttackPlayer()
{
agent.SetDestination(transform.position);
anim.SetBool("Idle", false);
transform.LookAt(player);
if (!PlayerAtacado)
{
///CODIGO DO ATAQUE
anim.SetBool("Walk", false);
anim.SetBool("Attack", true);
EventoAtaque.Invoke();
PlayerAtacado = true;
Invoke(nameof(ResetAtque), tempoEntreAtaques);
} else
{
anim.SetBool("Walk", true);
}
}
private void ResetAtque()
{
PlayerAtacado = false;
}
public void DanoNoInimigo(int damage)
{
vidaInimigo -= damage;
anim.SetBool("Hit", true);
anim.SetBool("Attack", false);
anim.SetBool("Idle", false);
anim.SetBool("Walk", false);
if (vidaInimigo <= 0) Invoke(nameof(InimigoMorreu), 0.5f);
}
private void InimigoMorreu()
{
anim.SetBool("Attack", false);
anim.SetBool("Idle", false);
anim.SetBool("Death", true);
EventoMorte.Invoke();
}
private void OnDrawGizmosSelected()
{
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(transform.position, raioAtaque);
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere(transform.position, gamaVisao);
}
}
Re: NullReferenceException: Object reference not set to an instance
obrigado amigo, eu vou testar aqui, qualquer coisa eu lhe informo. Vou seguir o video de exemplo.MadCow escreveu:Olá amigo eu tenho uma AI simples para inimigos que funciona bem, é boa para inimigos tipo corpo a corpo, mais vc pode adicionar projetos sem problemas.
Fiz um pequeno vídeo de como utilizar o script ok, sempre verifica se vc esta usando Humanoides e se os parâmetros do Animator estão corretos e a conexão com as animações.
Este Script possui alguns Eventos para vc complementar com outros scripts ou dar mais vida ao Inimigo como Sons, Efeitos, etc.
- Código:
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Events;
public class InimigoAI : MonoBehaviour
{
public NavMeshAgent agent;
[SerializeField] string PlayerTag = "Player";
Transform player;
public LayerMask whatIsGround, whatIsPlayer;
[SerializeField] float vidaInimigo;
//Patrulhamento
public Vector3 walkPoint;
bool walkPointSet;
[SerializeField] float pontoCaminhada;
//Atacante
[SerializeField] float tempoEntreAtaques;
bool PlayerAtacado;
//Estados
public float gamaVisao, raioAtaque;
public bool playerNaVisao, playerNoAlcanceAtaque;
public Animator anim;
public UnityEvent EventoInicio;
public UnityEvent EventoAtaque;
public UnityEvent EventoPatrulhamento;
public UnityEvent EventoBuscaPlayer;
public UnityEvent EventoMorte;
private void Start()
{
if (EventoInicio == null)
EventoInicio = new UnityEvent();
if (EventoAtaque == null)
EventoAtaque = new UnityEvent();
if (EventoPatrulhamento == null)
EventoPatrulhamento = new UnityEvent();
if (EventoBuscaPlayer == null)
EventoBuscaPlayer = new UnityEvent();
if (EventoMorte == null)
EventoMorte = new UnityEvent();
player = GameObject.FindWithTag(PlayerTag).transform;
anim.SetBool("Idle", true);
}
private void Awake()
{
player = GameObject.FindWithTag(PlayerTag).transform;
agent = GetComponent<NavMeshAgent>();
EventoInicio.Invoke();
}
private void Update()
{
playerNaVisao = Physics.CheckSphere(transform.position, gamaVisao, whatIsPlayer);
playerNoAlcanceAtaque = Physics.CheckSphere(transform.position, raioAtaque, whatIsPlayer);
if (!playerNaVisao && !playerNoAlcanceAtaque) Patrulhamento();
if (playerNaVisao && !playerNoAlcanceAtaque) BuscandoPlayer();
if (playerNoAlcanceAtaque && playerNaVisao) AttackPlayer();
}
private void Patrulhamento()
{
if (!walkPointSet) GerarPontoCaminho();
if (walkPointSet)
agent.SetDestination(walkPoint);
Vector3 distanceToWalkPoint = transform.position - walkPoint;
EventoPatrulhamento.Invoke();
if (distanceToWalkPoint.magnitude < 1f)
walkPointSet = false;
}
private void GerarPontoCaminho()
{
float randomZ = Random.Range(-pontoCaminhada, pontoCaminhada);
float randomX = Random.Range(-pontoCaminhada, pontoCaminhada);
walkPoint = new Vector3(transform.position.x + randomX, transform.position.y, transform.position.z + randomZ);
anim.SetBool("Attack", false);
anim.SetBool("Idle", false);
anim.SetBool("Walk", true);
if (Physics.Raycast(walkPoint, -transform.up, 2f, whatIsGround))
walkPointSet = true;
}
private void BuscandoPlayer()
{
agent.SetDestination(player.position);
EventoBuscaPlayer.Invoke();
anim.SetBool("Attack", false);
anim.SetBool("Idle", false);
anim.SetBool("Walk", true);
}
private void AttackPlayer()
{
agent.SetDestination(transform.position);
anim.SetBool("Idle", false);
transform.LookAt(player);
if (!PlayerAtacado)
{
///CODIGO DO ATAQUE
anim.SetBool("Walk", false);
anim.SetBool("Attack", true);
EventoAtaque.Invoke();
PlayerAtacado = true;
Invoke(nameof(ResetAtque), tempoEntreAtaques);
} else
{
anim.SetBool("Walk", true);
}
}
private void ResetAtque()
{
PlayerAtacado = false;
}
public void DanoNoInimigo(int damage)
{
vidaInimigo -= damage;
anim.SetBool("Hit", true);
anim.SetBool("Attack", false);
anim.SetBool("Idle", false);
anim.SetBool("Walk", false);
if (vidaInimigo <= 0) Invoke(nameof(InimigoMorreu), 0.5f);
}
private void InimigoMorreu()
{
anim.SetBool("Attack", false);
anim.SetBool("Idle", false);
anim.SetBool("Death", true);
EventoMorte.Invoke();
}
private void OnDrawGizmosSelected()
{
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(transform.position, raioAtaque);
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere(transform.position, gamaVisao);
}
}
gamedevretro- Iniciante
- PONTOS : 651
REPUTAÇÃO : 0
Respeito as regras :
Re: NullReferenceException: Object reference not set to an instance
Funcionou!!! As animações funcionaram.
Mas... a animação "Idle" não funciona, ela não inicia, e nem volta após um ataque, e a animação "walk" também. Ah, e AI entra no chão quando o player emburra ele...
Erro: Parameter 'Idle' does not exist.
UnityEngine.Animator:SetBool (string,bool)
InimigoAI:AttackPlayer () (at Assets/Scripts/InimigoAI.cs:121)
InimigoAI:Update () (at Assets/Scripts/InimigoAI.cs:76)
Mas... a animação "Idle" não funciona, ela não inicia, e nem volta após um ataque, e a animação "walk" também. Ah, e AI entra no chão quando o player emburra ele...
Erro: Parameter 'Idle' does not exist.
UnityEngine.Animator:SetBool (string,bool)
InimigoAI:AttackPlayer () (at Assets/Scripts/InimigoAI.cs:121)
InimigoAI:Update () (at Assets/Scripts/InimigoAI.cs:76)
gamedevretro- Iniciante
- PONTOS : 651
REPUTAÇÃO : 0
Respeito as regras :
Re: NullReferenceException: Object reference not set to an instance
É preciso adicionar um parâmetro do tipo Bool com o nome "Idle" no seu animator para a animação funcionar.gamedevretro escreveu:Funcionou!!! As animações funcionaram.
Mas... a animação "Idle" não funciona, ela não inicia, e nem volta após um ataque, e a animação "walk" também. Ah, e AI entra no chão quando o player emburra ele...
Erro: Parameter 'Idle' does not exist.
UnityEngine.Animator:SetBool (string,bool)
InimigoAI:AttackPlayer () (at Assets/Scripts/InimigoAI.cs:121)
InimigoAI:Update () (at Assets/Scripts/InimigoAI.cs:76)
Re: NullReferenceException: Object reference not set to an instance
eu coloquei, mas não funcionou, foi a primeira coisa que fiz.BlesseD escreveu:É preciso adicionar um parâmetro do tipo Bool com o nome "Idle" no seu animator para a animação funcionar.gamedevretro escreveu:Funcionou!!! As animações funcionaram.
Mas... a animação "Idle" não funciona, ela não inicia, e nem volta após um ataque, e a animação "walk" também. Ah, e AI entra no chão quando o player emburra ele...
Erro: Parameter 'Idle' does not exist.
UnityEngine.Animator:SetBool (string,bool)
InimigoAI:AttackPlayer () (at Assets/Scripts/InimigoAI.cs:121)
InimigoAI:Update () (at Assets/Scripts/InimigoAI.cs:76)
gamedevretro- Iniciante
- PONTOS : 651
REPUTAÇÃO : 0
Respeito as regras :
Re: NullReferenceException: Object reference not set to an instance
Olá verifica os parâmetros das animações são 5 Bool, Idle, Attack, Walk, Hit, Death
Para modificar o erro do Inimigo entrar no chão basta remover o transform.LookAt(player); em AttackPlayer() e por um Quaternion.
Código Atualizado;
Para modificar o erro do Inimigo entrar no chão basta remover o transform.LookAt(player); em AttackPlayer() e por um Quaternion.
Código Atualizado;
- Código:
using System.Collections;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.Events;
[RequireComponent(typeof(Animator))]
[RequireComponent(typeof(NavMeshAgent))]
public class InimigoAI : MonoBehaviour
{
public NavMeshAgent agent;
public Animator anim;
[SerializeField] string PlayerTag = "Player";
Transform player;
[Header("Layers do Piso")]
public LayerMask whatIsGround;
[Header("Layers do Player")]
public LayerMask whatIsPlayer;
[Space]
[SerializeField] float vidaInimigo;
[SerializeField] float velocidadeRotar;
[SerializeField] float pontoCaminhada;
[SerializeField] float tempoEntreAtaques;
[Range(0.2f, 1f)]
[SerializeField] float VolumeAudio = 0.7f;
bool PlayerAtacado;
//Patrulhamento
[Space]
public Vector3 walkPoint;
bool walkPointSet;
//Estados
public float gamaVisao, raioAtaque;
public bool playerNaVisao, playerNoAlcanceAtaque;
[Space]
[Header("Eventos")]
public UnityEvent EventoInicio;
public UnityEvent EventoAtaque;
public UnityEvent EventoPatrulhamento;
public UnityEvent EventoBuscaPlayer;
public UnityEvent EventoMorte;
//ADICIONAR
private Quaternion _lookVisaoRotate;
private Vector3 _direcao;
private AudioSource audioSource;
AnimatorClipInfo[] m_CurrentClipInfo;
private void Start()
{
if (EventoInicio == null)
EventoInicio = new UnityEvent();
if (EventoAtaque == null)
EventoAtaque = new UnityEvent();
if (EventoPatrulhamento == null)
EventoPatrulhamento = new UnityEvent();
if (EventoBuscaPlayer == null)
EventoBuscaPlayer = new UnityEvent();
if (EventoMorte == null)
EventoMorte = new UnityEvent();
player = GameObject.FindWithTag(PlayerTag).transform;
anim.SetBool("Idle", true);
}
private void Awake()
{
player = GameObject.FindWithTag(PlayerTag).transform;
agent = GetComponent<NavMeshAgent>();
EventoInicio.Invoke();
}
private void Update()
{
playerNaVisao = Physics.CheckSphere(transform.position, gamaVisao, whatIsPlayer);
playerNoAlcanceAtaque = Physics.CheckSphere(transform.position, raioAtaque, whatIsPlayer);
if (!playerNaVisao && !playerNoAlcanceAtaque) Patrulhamento();
if (playerNaVisao && !playerNoAlcanceAtaque) BuscandoPlayer();
if (playerNoAlcanceAtaque && playerNaVisao) AttackPlayer();
}
private void Patrulhamento()
{
if (!walkPointSet) GerarPontoCaminho();
if (walkPointSet)
agent.SetDestination(walkPoint);
Vector3 distanceToWalkPoint = transform.position - walkPoint;
EventoPatrulhamento.Invoke();
if (distanceToWalkPoint.magnitude < 1f)
walkPointSet = false;
}
private void GerarPontoCaminho()
{
float randomZ = Random.Range(-pontoCaminhada, pontoCaminhada);
float randomX = Random.Range(-pontoCaminhada, pontoCaminhada);
walkPoint = new Vector3(transform.position.x + randomX, transform.position.y, transform.position.z + randomZ);
anim.SetBool("Attack", false);
anim.SetBool("Idle", false);
anim.SetBool("Walk", true);
if (Physics.Raycast(walkPoint, -transform.up, 2f, whatIsGround))
walkPointSet = true;
}
private void BuscandoPlayer()
{
agent.SetDestination(player.position);
EventoBuscaPlayer.Invoke();
anim.SetBool("Attack", false);
anim.SetBool("Idle", false);
anim.SetBool("Walk", true);
}
private void AttackPlayer()
{
agent.SetDestination(transform.position);
anim.SetBool("Idle", false);
//transform.LookAt(player); // COMENTAR
//ADICIONAR
_direcao = (player.position - transform.position).normalized;
_lookVisaoRotate = Quaternion.LookRotation(_direcao);
transform.rotation = Quaternion.Slerp(transform.rotation, _lookVisaoRotate, Time.deltaTime * velocidadeRotar);
//FIM ADICIONAR
if (!PlayerAtacado)
{
///CODIGO DO ATAQUE
anim.SetBool("Walk", false);
anim.SetBool("Attack", true);
EventoAtaque.Invoke();
PlayerAtacado = true;
Invoke(nameof(ResetAtque), tempoEntreAtaques);
} else
{
anim.SetBool("Walk", true);
}
}
private void ResetAtque()
{
PlayerAtacado = false;
}
public void DanoNoInimigo(int damage)
{
vidaInimigo -= damage;
anim.SetBool("Hit", true);
anim.SetBool("Attack", false);
anim.SetBool("Idle", false);
anim.SetBool("Walk", false);
if (vidaInimigo <= 0) Invoke(nameof(InimigoMorreu), 0.5f);
}
private void InimigoMorreu()
{
anim.SetBool("Attack", false);
anim.SetBool("Idle", false);
anim.SetBool("Death", true);
EventoMorte.Invoke();
}
private void OnDrawGizmosSelected()
{
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(transform.position, raioAtaque);
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere(transform.position, gamaVisao);
}
}
Re: NullReferenceException: Object reference not set to an instance
funcionou! muito obrigado, nem sei como agradecer.
gamedevretro- Iniciante
- PONTOS : 651
REPUTAÇÃO : 0
Respeito as regras :
Re: NullReferenceException: Object reference not set to an instance
eu testei, e funciona, mas, no meu ele não anda, tipo. Ele simplesmente só se desloca, mas não efetua a animação de "Walk" e, também o "Idle" não efetua, ele não começa com o "idle" e não troca após atacar ou quando para.
Eu já verifiquei os bool, e os nomes das animação, e o ataque funciona certinho. É só esses dois que não funcionam bem...
Eu já verifiquei os bool, e os nomes das animação, e o ataque funciona certinho. É só esses dois que não funcionam bem...
DarknessShark- Iniciante
- PONTOS : 1087
REPUTAÇÃO : 5
Idade : 17
Respeito as regras :
Re: NullReferenceException: Object reference not set to an instance
DarknessShark escreveu:eu testei, e funciona, mas, no meu ele não anda, tipo. Ele simplesmente só se desloca, mas não efetua a animação de "Walk" e, também o "Idle" não efetua, ele não começa com o "idle" e não troca após atacar ou quando para.
Eu já verifiquei os bool, e os nomes das animação, e o ataque funciona certinho. É só esses dois que não funcionam bem...
Olá suas animações Walk e Idle estão marcadas como Loop ?
Re: NullReferenceException: Object reference not set to an instance
gamedevretro escreveu:funcionou! muito obrigado, nem sei como agradecer.
Por nada, se precisar de ajuda so chamar
Tópicos semelhantes
» Unity 5: Object reference not set to an instance of an object
» Error NullReferenceException: Object reference not set to an instance of an object
» Problemas com Object.Instantiate
» NullReferenceException Object reference not set to an instance of an object
» Null Reference Exception: Object reference not set to an instance of an object
» Error NullReferenceException: Object reference not set to an instance of an object
» Problemas com Object.Instantiate
» NullReferenceException Object reference not set to an instance of an object
» Null Reference Exception: Object reference not set to an instance of an object
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos