Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: brok en Noviembre 03, 2015, 11:47:40 PM

Título: AI , NavMeshAgent ,mecanim y C#
Publicado por: brok en Noviembre 03, 2015, 11:47:40 PM
 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);
        }    }} 
Título: AI , NavMeshAgent ,mecanim y C#
Publicado por: Antonio en Noviembre 03, 2015, 11:56:15 PM
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.
Título: AI , NavMeshAgent ,mecanim y C#
Publicado por: brok en Noviembre 04, 2015, 12:13:24 AM
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);
        }    }}  
Título: AI , NavMeshAgent ,mecanim y C#
Publicado por: brok en Noviembre 04, 2015, 01:10:50 AM
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());
        
    }
}
Título: AI , NavMeshAgent ,mecanim y C#
Publicado por: brok en Noviembre 04, 2015, 02:05:02 AM
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;    }   
}