Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

AI , NavMeshAgent ,mecanim y C#

Iniciado por brok, Noviembre 03, 2015, 11:47:40 PM

Tema anterior - Siguiente tema
Noviembre 03, 2015, 11:47:40 PM Ultima modificación: Noviembre 03, 2015, 11:54:04 PM por brok
 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);
        }    }} 

Noviembre 03, 2015, 11:56:15 PM #1 Ultima modificación: Enero 01, 1970, 01:00:00 AM por Antonio
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);
        }    }}  

Noviembre 04, 2015, 01:10:50 AM #3 Ultima modificación: Noviembre 04, 2015, 01:13:34 AM por brok
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;    }   
}    

Etiquetas: