Noticias

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

Creando una Clase Básica de Inteligencia Artificial (AI)

Iniciado por Ele, Octubre 10, 2015, 07:58:44 PM

Tema anterior - Siguiente tema
Octubre 10, 2015, 07:58:44 PM Ultima modificación: Octubre 10, 2015, 11:05:52 PM por Ele
Saludos colegas y entusiastas de la programación, quiero iniciar este articulo diciéndoles de entrada que no voy a tocar todos los aspectos de la inteligencia artificial ni tampoco haré ejemplos extensos ya que si lo hiciera podría escribir un libro de al menos unas 500 paginas, al menos con mi conocimiento, estoy seguro que otros podrían escribir de mas paginas, ya que es un tema bastante extenso.Lo primero que debemos hacer (se aplica a todo en programación) es establecer el o los problemas, les recomiendo que busquen unahttp://wwwhatsnew.com/2014/03/28/herramientas-crear-mapas-mentales-internet/">herramienta* para crear mapas mentales o tener un pizarron  o mas simple un lápiz y un papel porque esto requerirá de unaLÓGICA ACERTADA, recuerden que lo que pretendemos hacer es crear una simulación de inteligencia, analicemos el siguiente mapa mental:https://eleazarcelis.files.wordpress.com/2015/10/captura__09_10_2015__224407.jpg">Lo que primero debemos saber es que nuestro actor con AI deberá tener un comportamiento principal, este comportamiento definirá sus acciones y movilidad. Este actor también deberá tener varios estados por ejemplo "en ***cucion" "default"(viene dado por el comportamiento, ejem.:  patrullando, explorando,...),"bajo ataque", "en alerta" y los que uds. consideren que pudiera aplicar, estos estados serán importante para informar a otros componentes que esta haciendo el actor.Lo segundo que deberemos definir es un área de acción en los casos de patrullaje y de defensa, esto sera necesario para definir la movilidad del actor.La movilidad de un actor puede gestionarse perfectamente a través de un navmesh, esto nos ahorrara mucho calculo. El navagent se encargara de encontrar una ruta hacia un punto este punto se puede definir en cualquier momento al igual que la velocidad a la que se dirigirá hacia él, y también la distancia de frenado, estos son 3 aspectos que nos harán la vida mas fácil. Ahora que tengamos esto listo podremos resolver nuestro siguiente problema y es quizás el punto mas importante en AI para videojuegos la percepción.La Percepción
La percepción se podría definir como "el primer conocimiento de una cosa por medio de las impresiones que comunican los sentidos". La percepción disparara comportamientos y acciones en nuestro actor con AI de allí su importancia en programarla. Lo primero que debemos definir son lossentidos que tendrá nuestro actor, como vieron en la imagen yo solo he definido la vista, el tacto y la audición, aunque pudieran definirse otros, inclusive sentidos de fantasía como la habilidad de percibir enemigos que estén detrás de las paredes por ejemplo.Empecemos por el menos complejo, el tacto. Digo que este sentido es el menos complejo ya que este ya viene preparado por uniti con los colliders, un simple OnCollisionEnter podrá notificar que algo o un enemigo ha sido detectado. Y esto nos llevara a un punto importante, ladireccion de dicha interacción, para ello podemos recurrir a la propiedad "contacts[0].point"http://docs.unity3d.com/ScriptReference/ContactPoint-point.html">* del objeto "Collision" que nos da OnCollisionEnter, con ello podemos calcular la dirección de dicha interaccion, por ejemplo:
1
2
3
void OnCollisionEnter(Collision other) {
    touchDirection = (other.contacts[0].point - transform.position);
}
y como pasaría en la vida real, dicha interacción provocaría una reacción motora inmediata la cual seria un giro y evasión. Con la información recogida por el sentido ya podríamos ser capaces de rotar hacia la dirección nuestro actor y moverlo en sentido opuesto al contacto con algo como esto:
1
2
3
4
5
void Update() {
    transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(touchDirection ), Time.deltaTime * turnSpeed);
    float step = speed * Time.deltaTime;
    transform.position = Vector3.MoveTowards(transform.position, touchDirection, step);
}
Ya tenemos la 'información recogida por el sentido' y la respuesta motora correspondiente, si por ejemplo estamos programando un shooter deberemos disparar o no en dirección al contacto o tomar alguna acción en consecuencia, y para ello nos apoyaríamos seguramente en otro sentido como la vista por ejemplo para poder apuntar o captar donde esta nuestro enemigo pero eso lo trataremos mas adelante, pasemos al siguiente sentido.La Audición
Para este sentido pudiéramos usar un SphereCollider y activar isTrigger, de manera de usar su radio como radio de detección, es decir el actor podrá "escuchar" todo lo con este dentro de este radio, para ello podríamos usar la función OnTriggerStay(Collider other) para gestionar la información, por ejemplo:
1
2
3
4
5
6
public void OnTriggerStay(Collider other) {
    AudioSource audioSource = other.transform.root.GetComponent<AudioSource>(); // asumiendo que el componente audiosource estara siempre en la raiz del enemigo
    if(audioSource != null && audioSource.isPlaying){
            // implementacion...
    }

Etiquetas: