Aprende a desarrollar una IA para tus NPCs parte 1

By Danilo Giardina, 10 julio, 2017

inteligencia artificial Unity (IA)

Hola a todos bienvenidos a nuestra primer edición sobre inteligencia artificial para videojuegos. En esta guía mostraremos a modo de ejemplo como se realiza una IA en Unity. Si bien hay varias técnicas que se pueden utilizar en este motor, como el sistema de navigation que trae incluido el engine , pero en este caso vamos a hacer una programación basada en waypoint (puntos de camino).

Creación de WayPoints

Lo primero que debemos hacer es crear un nuevo proyecto en Unity. Crear un nuevo C# script en la pestaña de proyectos. (Recuerden tener su pestaña de proyecto bien organizada con carpetas de scripts, prefabs, scenes, entre otras). Una vez creado vamos a escribir el siguiente código.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NavPointCreator : MonoBehaviour {
    public int id;
    GameObject wp;
	
	
	void Update () {
        if (Input.GetKeyUp(KeyCode.Space))
            CreateTarget();
	}
    void CreateTarget()
    {
        if (wp != null)
            Destroy(wp);
        GameObject waypoint = GameObject.CreatePrimitive(PrimitiveType.Cube);
        waypoint.transform.position = new Vector3(Random.Range(7.0f, -7.0f), 0.03f, 
        Random.Range(7.0f, -7.0f));
        waypoint.name = "Waypoint " + id;
        id++;
        waypoint.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
        //waypoint.GetComponent<MeshRenderer>().enabled = false;
        wp = waypoint;
    }
}

Explicación del código C#

Para resumir lo que hace este código es simplemente crear un cubo en un punto aleatorio dentro de un rango, si el cubo esta creado lo destruye y crea otro en otra posición. Esto sirve para crear los destinos u objetivos para nuestro NPC, lo que le dará un comportamiento más natural a comparación de un comportamiento lineal o por animación.Ahora pasamos a una explicación mas detalla del código.
“`public int id;GameObject wp;“`Declaramos una variable publica de tipo entero llamado id, la cual usaremos para identificar cada waypoint. También declaramos una variable privada de tipo GameObject nombrada wp, la cual contendrá al objeto cubo que representa al waypoint.

void Update () {
        if (Input.GetKeyUp(KeyCode.Space))
            CreateTarget();
	}

Si tocamos la tecla espacio llamará al método de crear objetivo.

void CreateTarget()
    {
        if (wp != null)
            Destroy(wp);
        GameObject waypoint = GameObject.CreatePrimitive(PrimitiveType.Cube);
        waypoint.transform.position = new Vector3(Random.Range(7.0f, -7.0f), 0.03f, 
        Random.Range(7.0f, -7.0f));
        waypoint.name = "Waypoint " + id;
        id++;
        waypoint.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
        //waypoint.GetComponent<MeshRenderer>().enabled = false;
        wp = waypoint;
    }

Por último tenemos el método crear objetivo. Primero se comprueba si wp no esta vacio , en ese caso se destruye el wp existente, luego se crea un cubo nuevo en una posicion aleatoria dentro de un rango , se le asigna un nombre incluyendo en él su id, se le asigna un tamaño de 0.5 y luego se guarda el nuevo waypoint en la variable wp.Existe un código comentado que sirve para ocultar la parte visible del cubo, ya que a fines prácticos nosotros no queremos ver los waypoints de nuestros NPC’s.
Bien eso sería todo, espero que les guste, no se olviden de comentar y compartir si les gusto el post.

En la siguiente edición como detectar la distancia y dirección para que el NPC se dirija al waypoint.
curso sobre desarrollo de videojuegos en unity

Pulsa en la imagen para ir al curso.

What do you think?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *