# Inteligencia artificial para videojuegos/Toma de decisiones/Behavior Designer Unity
## Primeros pasos

En este apartado vamos a explicar una forma muy básica de manejar el Unity NavMesh, Third Person Controller y Behavior Designer para empezar a utilizar los arboles de comportamiento en un proyecto de Unity.
Es necesario crear un proyecto incluyendo:
-Behavior Designer
-Third Person Controller

## Unity NavMesh

Vamos a crear una malla de navegación y un personaje que se mueva por ella.
* Crear una nueva escena y abrirla:
** Crear un Plane. Ubicarlo en (0,-1,0).
** Crear un Cube. Ubicarlo en (0,-1,0). Cambiar material a marker
** Duplicar Cube. Moverlo a (0,-1.4,3).
* Abrir ventana Navigation en Window > Navigation.
* Seleccionar todos los elementos creados.
** Marcar Navigation Static.
** Seleccionar pestaña Bake. Pulsar Bake. Se ha creado la malla de navegación.
* Crear un Personaje: Cylinder.
** Cambiar material a bot.
** Moverlo a (0,0,-3).
** Add Component: Nav Mesh Agent
* Crear New Script: MouseDetect:
* Seleccionar Plane.
** Add Component > MouseDetect
** Arrastrar Cylinder al campo NPC
Haciendo click en el plano, el personaje se mueve hacia allí, respetando la malla de navegación.

## Third Person Controller

Vamos a crear un personaje de Third Person Controller que se mueva por la malla de navegación.
* Abrir Tools -> Third Person Controller -> Start Window -> Setup Scene. Prepara la escena.
* Crear un soldado.
** Arrastrar a la escena Assets > Behavior Designer Samples/Third Person Controller/Models/Soldier.fbx
** En Soldier cambiar Materials:
*** Element 0: unity_soldier_head_dif_01
*** Element 1: unity_soldier_body_dif_wip
** En el arma. Cambiar Materials: AssaultRifle
* Abrir Tools -> Third Person Controller > Character Builder
** Arrastrar Soldier al campo Character.
** Marcar is AI Agent.
** Pulsar Build y Create.
* Añadir a soldier los componentes Nav Mesh Agent y NavMeshAgentBridge.
* Arrastrar a Plane > MouseDetect el soldier.
Haciendo click en el plano, el personaje se mueve hacia allí, respetando la malla de navegación

## Behavior Designer

Vamos a utilizar los arboles de comportamiento para que un personaje persiga a otro.
* Arrastrar a Plane > MouseDetect el Cylinder.
* Abrir Tools -> Behavior Designer -> Editor.
** Seleccionar a soldier.
** Pulsar “+” del editor de Behavior Designer. Esto añade un componente Behavior Tree al personaje.
** Añadir pursue. Buscando en el editor.
** Seleccionar la tarea pursue y en Inspector del editor, arrastrar Cylinder a Target.
Haciendo click en el plano, el Cylinder se mueve hacia allí, respetando la malla de navegación y soldier le persigue.

## Behavior Designer: Tutorial más completo

Vamos a implementar un árbol de comportamiento más complejo.
Enunciado del problema:
El ladrón merodea por el escenario sin un rumbo fijo. Si ve una casa, intentará robar en ella, para lo que se acercará hasta la puerta, la abrirá de algún modo, cruzará al interior de la casa y para terminar cerrará tras de sí la puerta, si es posible. Para abrir la puerta primero probará si es tan sencillo como girar el pomo (la puerta no está bloqueada), si no se pondrá a trabajar con su ganzúa hasta que se abra, y si no, directamente la derribará de una patada. Si en cualquier momento ve a un policía, volverá a merodear por el escenario sin un rumbo fijo.
* Crear una nueva escena:
** Crear Plane. Escalar a (5,1,5).
** Crear 2 Cylinder:
*** Policia(azul). Mover a (0,1,-5)
*** Ladrón(rojo). Mover a (0,1,5)
** Crear Cube:
*** Escalar a (3,3,3).
*** Textura Wood.
*** Añadir Rigidbody.
*** Mover a (0,1.5,0).
*** Layer: Cover.
*** Añadir componente: Nav Mesh Obstacle.
*** Llamarlo Casa y hacerlo Prefab.
*** Masa. La masa del objeto va a ser el tiempo que va a tardar el ladrón para entrar a robar la casa. 1 segundo por cada kilo por encima de 1.
*** Distribuir 10 casas por la escena, con masas diferentes.
** Ajustar la cámara para que vea toda la escena:
*** Position: (0,30,-25).
*** Rotation: (60,0,0).
** Policía y ladrón:
*** Añadir componente: Nav Mesh Agent.
** Crear malla de navegación:
*** Seleccionar a Plane.
*** Abrir ventana Navigation en Window > Navigation.
*** Marcar Navigation Static.
*** Seleccionar pestaña Bake. Pulsar Bake. Se ha creado la malla de navegación.
* Comportamiento del policía:
** Abrir Tools -> Behavior Designer -> Editor.
** Seleccionar a Policía.
** Añadir componente: Behavior Tree
** Añadimos tarea para que merodee: Wander:
*** Angular Speed: 180.
*** Arrive Distance: 3.
*** Min Wander Distance: 5.
*** Max Wander Distance: 30.
*** Wander Rate: 10.
* Comportamiento del ladrón:
** Copiar el árbol.
** Añadir variables: En pestaña Variables:
*** CasaObjetivo: GameObject. None.
*** PesoCasa: Float. 0.
*** CapacidadGanzua: Float. 3.
*** Posición Casa: Vector3. (0,0,0).
** Wander. Mismos parámetros que el policía.
** Detectar al policía -> Within Distance:
*** Indicar GameObject policía.
*** Radio detección: 10.
** Detectar casas -> Can See Object:
*** Layer: Cover. Para detectar solo Casas.
*** View Distance: 20.
*** Field of Angle: 120.
*** Returned Object: CasaObjetivo.
*** Tenemos que guardar el GameObject de la casa en la pizarra, para retener qué casa ha localizado.
** Detectar proximidad a casa -> WithinDistance:
*** Magnitude: 5.5.
*** Así evitamos bloqueos con las esquinas.
** Moverse a la casa -> Move Towards:
*** Speed: 10.
*** Arrive Distance de 0.1 para que nunca consiga llegar del todo.
** Robar más de una casa -> Repeat.
** Destruir casas -> Destroy
** El enunciado limita que si el policía interrumpe al ladrón, este tiene que volver a repetir todo el proceso entero de robo(tiempo de ganzúa y lo que sea).

## Assets: Enlaces y documentación

* Third Person Controller. Framework para crear cualquier tipo de juego 3D. Proporciona integración con Behavior Designer.
** Documentación
* Behavior Designer
** Árboles de comportamiento. Es la base de todos los demás.
** Permite crear árboles de comportamiento para IA.
** Permite crear tareas propias con su API y utilizar algunas ya construidas.
** Documentación.
** Addons:
*** Formations Pack.
*** Movement Pack.
*** Tactical Pack

## Participantes

* Raúl Serrano Gómez .
* Federico Peinado.