Noticias

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

AI con mecanim y C#

Iniciado por brok, Octubre 20, 2015, 03:42:33 PM

Tema anterior - Siguiente tema
Como puedo empezar a programar la inteligencia artificial en C# para que se hacerque al player y reproduca las animaciones, estoy muy perdido.

Busca info sobre las máquinas de estados


Cita de: juanma_teso date=1445349242" data-ipsquote="" data-cite="juanma_teso" class="ipsQuote">Busca info sobre las máquinas de estadosimg]Smileys/invision/default_smile.png]
Gracias buscado estoy.
Cita de: jordi_boni date=1445351297/img]Con esta seleccion de tutoriales cubres el pathfinding: http://unity3d.com/learn/tutorials/topics/navigation">http://unity3d.com/learn/tutorials/topics/navigationy aqui las animaciones: http://unity3d.com/learn/tutorials/topics/animation]http://unity3d.com/learn/tutorials/topics/animation
No hay otra manera que no sea NavMesh que sigua al personaje con la animacion de andar que no necesita parametros de tranform ya que la animacion de andar ya se mueve en las cordenadas.

Octubre 20, 2015, 05:21:23 PM #4 Ultima modificación: Octubre 20, 2015, 05:25:04 PM por brok
Este script hace que siga al personaje pero no se para cuando llega a el se juntan los personajes. Quiero que se pare y lanze idle.using UnityEngine;
using System.Collections;public class jack_ai : MonoBehaviour
{
    public Animator ani;
    public Transform player;
    public float distancia = 10.0f;
    public float distanciaS = 1.0f;
    public Transform target;
    void Start()
    {
        ani = GetComponent<Animator>();
    }
    void Update()
    {
      
        if (distancia < distanciaS)
        {
            ani.SetFloat("speed", 1.0f);
        }        else
        {
            ani.SetFloat("speed", 0.0f);
        }
        
        if (distancia > distanciaS)
        {
            ani.SetFloat("andar", 1.0f);
        }        else
        {
            ani.SetFloat("andar", 0.0f);
           
        }        if (distancia > distanciaS)
        {
            transform.LookAt(target);
        }
    }} 

Octubre 20, 2015, 07:43:42 PM #5 Ultima modificación: Octubre 20, 2015, 07:44:33 PM por brok
Lo he conseguido ahora solo me falta en ataque. using UnityEngine;
using System.Collections;public class jack_ai : MonoBehaviour
{
    public Animator ani;
    public float distancia=2.0f;
    public float distanciaS=1.0f;
    public Transform target;
 
   
    void Start()
    {
        ani = GetComponent<Animator>();
    }
    void Update()
    {        if (distancia < distanciaS)
        {
            ani.SetFloat("speed", 1.0f);
        }        if (distancia > distanciaS)
        {
            transform.LookAt(target);        }        if (Vector3.Distance(transform.position, target.position) >= distanciaS)
        {
            ani.SetFloat("andar", 1.0f);
            if (Vector3.Distance(transform.position, target.position) <= distancia)
            {
                ani.SetFloat("andar", 0.0f);
            }
           
        }
    }

Octubre 20, 2015, 08:54:21 PM #6 Ultima modificación: Octubre 20, 2015, 09:06:20 PM por brok
Me puede decir alguien donde fallo quiero que cada animacion de ataque se ejecute y no se que estoy haciendo mal.    IEnumerator Golpes()
    {
        int ramdom = Random.Range(0, 1);
        yield return new WaitForSeconds(1);
        ani.SetInteger("estado", 0);
        yield return new WaitForSeconds(1);
        ani.SetInteger("estado", 1);
    }

He conseguido hacer que funcione con una corrutina pero se queda atascado a veces, ¿no hay alguna forma de hacerlo mejor?using UnityEngine;
using System.Collections;public class jack_ai : MonoBehaviour
{
    public Animator ani;
    public float distancia=2.0f;
    public float distanciaS=1.0f;
    public float distanciaP = 1.0f;
    public Transform target;
    public int animacion = 0;    void Start()
    {
        ani = GetComponent<Animator>();
    }
    void Update()
    {        if (distancia < distanciaS)
        {
            ani.SetFloat("speed", 1.0f);
        }        if (distancia > distanciaS)
        {
            transform.LookAt(target);        }        if (Vector3.Distance(transform.position, target.position) >= distanciaS)
        {
            ani.SetFloat("andar", 1.0f);
            if (Vector3.Distance(transform.position, target.position) <= distancia)
            {
                ani.SetFloat("andar", 0.0f);
            }
            
        }
        
        StartCoroutine(Golpes(1));
    }
    IEnumerator Golpes(int tiempo)
    {
        while (true)
        {
            yield return new WaitForSeconds(tiempo);            ani.SetInteger("estado", 0);            yield return new WaitForSeconds(tiempo);            ani.SetInteger("estado", 1);
            yield return new WaitForSeconds(tiempo);            ani.SetInteger("estado", 2);
            yield return new WaitForSeconds(tiempo);            ani.SetInteger("estado", 3);
        }
        
     }
}

He modificado el codigo y he metido cada animacion en una corrutina distinta cada una, se repiten muchos las animaciones no son tan variadas son muy repetitivas.using UnityEngine;
using System.Collections;public class jack_ai : MonoBehaviour
{
    public Animator ani;
    public float distancia = 2.0f;
    public float distanciaS = 1.0f;
    public float distanciaP = 1.0f;
    public Transform target;
    public float animacion;    void Start()
    {
        ani = GetComponent<Animator>();
    }
    void Update()
    {        if (distancia < distanciaS)
        {
            ani.SetFloat("speed", 1.0f);
        }        if (distancia > distanciaS)
        {
            transform.LookAt(target);        }        if (Vector3.Distance(transform.position, target.position) >= distanciaS)
        {
            ani.SetFloat("andar", 1.0f);
            if (Vector3.Distance(transform.position, target.position) <= distancia)
            {
                ani.SetFloat("andar", 0.0f);
            }        }        StartCoroutine(Patadagiro());
        StartCoroutine(patada());
        StartCoroutine(Salto());
        StartCoroutine(Puno());
        StartCoroutine(Girar());
    }
    IEnumerator Patadagiro()
    {        yield return new WaitForSeconds(1.5f);        ani.SetInteger("estado", 1);            }
    IEnumerator patada()
    {        yield return new WaitForSeconds(2.5f);        ani.SetInteger("estado", 2);           }    IEnumerator Salto()
    {        yield return new WaitForSeconds(3.5f);        ani.SetInteger("estado", 3);       
    }
    IEnumerator Puno()
    {        yield return new WaitForSeconds(4.5f);        ani.SetInteger("estado", 4);            }
    IEnumerator Girar()
    {        yield return new WaitForSeconds(5.5f);        ani.SetInteger("estado", 5);     }

Octubre 22, 2015, 01:23:02 PM #9 Ultima modificación: Octubre 22, 2015, 01:23:42 PM por brok
Ya lo he conseguido jajaja. using UnityEngine;
using System.Collections;public class jack_ai : MonoBehaviour
{
    public Animator ani;
    public float distancia = 2.0f;
    public float distanciaS = 1.0f;
    public float distanciaP = 1.0f;
    public Transform target;
    public float animacion;    void Start()
    {
        ani = GetComponent<Animator>();
    }
    void Update()
    {        if (distancia < distanciaS)
        {
            ani.SetFloat("speed", 1.0f);
        }        if (distancia > distanciaS)
        {
            transform.LookAt(target);        }        if (Vector3.Distance(transform.position, target.position) >= distanciaS)
        {
            ani.SetFloat("andar", 1.0f);
            if (Vector3.Distance(transform.position, target.position) <= distancia)
            {
                ani.SetFloat("andar", 0.0f);
            }        }        StartCoroutine(Patadagiro());
        StartCoroutine(patada());
        StartCoroutine(Salto());
        StartCoroutine(Puno());
        StartCoroutine(Girar());
    }
    IEnumerator Patadagiro()
    {        yield return new WaitForSeconds(1.5f);        ani.SetInteger("estado", 1);        yield return null;    }
    IEnumerator patada()
    {        yield return new WaitForSeconds(3.0f);        ani.SetInteger("estado", 2);        yield return null;    }    IEnumerator Salto()
    {        yield return new WaitForSeconds(4.5f);        ani.SetInteger("estado", 3);        yield return null;
    }
    IEnumerator Puno()
    {        yield return new WaitForSeconds(6.0f);        ani.SetInteger("estado", 4);        yield return null;
    }
    IEnumerator Girar()
    {        yield return new WaitForSeconds(7.5f);        ani.SetInteger("estado", 5);        yield return null;    }

Etiquetas: