Necesito ayuda con mi script quiero que lanze la animacion idle, cuando este cerca y el de golpe, que hago mal me lanza este error.Severity Code Description Project File Line
Error NullReferenceException: Object reference not set to an instance of an object Solution 'curso' (3 projects) Assets/script/Player_ai.cs 40 using UnityEngine;
using System.Collections;
[RequireComponent(typeof(NavMeshAgent))]
public class Player_ai : MonoBehaviour
{
public Transform target;
Vector3 destination;
NavMeshAgent agent;
Animator Anim;
public float speed = 1f;
public int Range = 1; void Start()
{
agent = GetComponent<NavMeshAgent>();
destination = agent.destination;
} void Update()
{
var distance = Vector3.Distance(transform.position, target.transform.position); if (Vector3.Distance(destination, target.position) > speed) {
destination = target.position;
agent.destination = destination; } if (distance < Range)
{
Anim.SetBool("idle", false);
}
else
{
Anim.SetBool("idle", true);
} }}
línea 40, no has relacionado la variable Anim todavía. La has creado, (por lo que existe, el compilador la detecta y no da fallo) pero no le has dicho quien es (por eso al ejecutar el juego sale el error de que la referencia está incorrecta). En el start, tienes que usar un GetComponent para que decirle que Anim es el componente animator que tiene el target.
Lo he corregido y me sale la animacion de andar y luego salta idle. using UnityEngine;
using System.Collections;
[RequireComponent(typeof(NavMeshAgent))]
public class Player_ai : MonoBehaviour
{
public Transform Target;
Vector3 Destination;
NavMeshAgent Agent;
Animator Anim;
public float Speed = 1f;
public int Rango = 1; void Start()
{
Anim = GetComponent<Animator>();
Agent = GetComponent<NavMeshAgent>();
Destination = Agent.destination;
} void Update()
{
var distancia = Vector3.Distance(transform.position, Target.transform.position); if (Vector3.Distance(Destination, Target.position) > Speed) {
Destination = Target.position;
Agent.destination = Destination; } if (distancia < Rango)
{
Anim.SetBool("idle", true);
}
else
{
Anim.SetBool("idle", false);
} }}
ya lo he arreglado pero ahora va de una animacion a otra cuando la distancia es mayor siguen las animaciones no salta la de andar.using UnityEngine;
using System.Collections;
[RequireComponent(typeof(NavMeshAgent))]
public class Player_ai : MonoBehaviour
{
public Transform Target;
Vector3 Destination;
NavMeshAgent Agent;
Animator Anim;
public float Speed = 1.0f;
public float Rango;
public float distanciaS = 1.0f;
public float distanciaP = 2.0f; void Start()
{
Anim = GetComponent<Animator>();
Agent = GetComponent<NavMeshAgent>();
Destination = Agent.destination;
} void Update()
{
if (Vector3.Distance(Destination, Target.position) > Speed) {
Destination = Target.position;
Agent.destination = Destination;
StartCoroutine(idle());
}
}
IEnumerator idle()
{ yield return new WaitForSeconds(1f); if (Vector3.Distance(transform.position, Target.position) >= distanciaS)
{
Anim.SetFloat("idle", 0.0f);
if (Vector3.Distance(transform.position, Target.position) <= distanciaP)
{
Anim.SetFloat("idle", 1.0f);
StartCoroutine(patada());
} }
}
IEnumerator patada()
{ yield return new WaitForSeconds(1f);
if (Vector3.Distance(transform.position, Target.position) >= distanciaS)
{
Anim.SetInteger("patada", 1);
Anim.SetFloat("idle", 0.0f); }
else
{
Anim.SetInteger("patada", 0);
reset();
}
} void reset()
{
StopCoroutine(patada());
StopCoroutine(idle());
}
}
Lo consegui.using UnityEngine;
using System.Collections;
[RequireComponent(typeof(NavMeshAgent))]
public class Player_ai : MonoBehaviour
{
public Transform Target;
Vector3 Destination;
NavMeshAgent Agent;
Animator Anim;
public float Speed = 1.0f;
public float Rango;
public float distanciaS = 1.0f;
public float distanciaP = 2.0f; void Start()
{
Anim = GetComponent<Animator>();
Agent = GetComponent<NavMeshAgent>();
Destination = Agent.destination;
} void Update()
{
if (Vector3.Distance(Destination, Target.position) > Speed) {
Destination = Target.position;
Agent.destination = Destination;
StartCoroutine(idle());
}
}
IEnumerator idle()
{ yield return new WaitForSeconds(1f); if (Vector3.Distance(transform.position, Target.position) >= distanciaS)
{
Anim.SetFloat("idle", 0.0f);
if (Vector3.Distance(transform.position, Target.position) <= distanciaP)
{
Anim.SetFloat("idle", 1.0f);
StartCoroutine(patada());
} } yield return null;
}
IEnumerator patada()
{ yield return new WaitForSeconds(2f);
if (Vector3.Distance(transform.position, Target.position) >= distanciaS)
{
Anim.SetFloat("patada", 1.0f);
Anim.SetFloat("idle", 0.0f); if (Vector3.Distance(transform.position, Target.position) >= distanciaP)
{
Anim.SetFloat("patada", 0.0f);
Anim.SetFloat("idle", 0.0f);
} } yield return null; }
}