domingo, 6 de abril de 2014

Unity3D IA: Empezando a tratar la inteligencia artificial

Bien, el tutorial de hoy tratará sobre inteligencia artificial basado en Unity3D, esta parte de la programación, probablemente será mi favorita, ¿Por qué? fácil, me gusta resolver problemas, me gusta buscar, aprender y sobretodo tener la satisfacción y decir, lo he conseguido.

Si realmente estás interesado en este mundo, te aconsejo que mis referencias no sean las únicas que mires, posiblemente esté equivocado o pueda mejorarse mucho mas las cosas que hago como me han demostrado hace poco, lo cual me gusta.

En primer lugar hablaré del motor para IA que voy a usar ya que no es necesario reinventar la rueda, hay muchísimos motores que podemos encontrar, tanto para Unity3D como para el resto de sistemas.


Enlace a la Asset Store: http://u3d.as/43a

Bien, este motor, además de ser gratuito, está muy bien documentado, cuenta con sorporte, tutoriales creados por la comunidad, etcétera...

En esta primera entrada sobre este extra a añadir a Unity3D vamos a ver que, realmente es sencillo hacer una IA básica, recalcaré esto de básica porque si quieres un comportamiento como el de una persona, tan solo ponte a pensar en que, ¿Se pondrá enfermo? ¿Sen cansará? ¿Tendrá un rango de visión como el de una persona normal? ¿Hablará? y un sin fin de cosas por las cuales probablemente deberíamos plantear nuestro juego paso a paso, subamos escalones y no escalemos muros.

Para empezar, una vez tengamos el asset descargado podremos ver que trae ejemplos para los distintos lenguajes que trata Unity3D, C#, UnityScript (Javascript) y Boo, además de que, la única parte negativa de este plugin es estar creado como una librería de manera que a priori no podremos editar el código en caso de querer adaptar algo de los comportamientos que trae predefinidos este plugin.

En primer lugar deberíamos hacer un diagrama de comportamientos, podriamos plantearlo visualmente como una base de datos, de manera que planteemos todos los comportamientos que vamos a tener con nuestra IA, si va a caminar, por qué lo va a hacer, si va a hablar, en definitiva, como dije en la introducción tiempo atrás, reconocer ciertos patrones para ejecutar ciertas acciones.

Patrones básicos
Aquí tendremos unos patrones muy básicos que extraí de un pequeño curso que di en su día, y un ejemplo en un simple script para hacer lo dicho en el esquema anterior, es muy, muy importante hacerte tu propio esquema para tener claro antes de programar, que debe hacer tu inteligencia artificial, y no añadirle mas de lo justo y necesario, hay que optimizar los recursos tantos como puedas.

using UnityEngine;
using System.Collections;

public class Prueba : MonoBehaviour {

 public GameObject pj;

 void Start()
 {
  ruta_de_vigilancia();
 }

 //Transformamos nuestro Update en una función de control
 void Update()
 {
  //Si está mas cerca de 100
  if(Vector3.Distance(pj.transform.position, transform.position)<100)
  {
   //Y mas cerca de 5
   if(Vector3.Distance(pj.transform.position, transform.position)<5)
   {
    golpear(); 
   } else {
    perseguir();
   }
  } else {
   ruta_de_vigilancia();
  }
 }

 void ruta_de_vigilancia()
 {
  //El enemigo está vigilando
  Debug.Log("Estoy vigilando");
 }

 void perseguir()
 {
  //El enemigo persigue al personaje
  Debug.Log("Estoy persiguiendo");
 }

 void golpear()
 {
  //El enemigo golpear al personaje
  Debug.Log("Estoy golpeando");
 }
}
Este código tiene poco que explicar ya que esta vez lo he dejado dentro del código, para la próxima, daré explicaciones mas detalladas sobre el uso de RAIN, espero que haya servido de ayuda y haya dejado un poco mas claro, aunque posiblemente no mucho aún de como programar inteligencias artificiales.

Este código no está completo a posta, lo he dejado con debugs en vez de hacerlo avanzar o golpear ya que quiero mas adelante empezar con mecanim y usar ambas cosas combinadas mas adelante.

5 comentarios: