Jump to content
UnitySpain

Search the Community

Showing results for tags 'inteligencia artificial'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Inicio
    • Proyectos
    • Offtopic
    • Unity Feeds
    • Website
  • Mesa de ayuda
    • Unity
    • Arte
    • Otras Especialidades
    • Builds & Dispositivos
  • Aportes de la Comunidad
    • Recursos
    • Eventos
    • Buenas Prácticas
  • Bolsa de trabajo & Colaboraciones
    • Ofertas y Demandas
  • Post Antiguos
    • General (Antiguo)

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Especialidad

Found 7 results

  1. Pues eso. ¿Cómo se programaría la IA de algún simulador de personas? No es un proyecto serio, más bien un prototipo que estoy mirando por curiosidad. Jugando al Fallout 4, he visto su sistema de asentamientos que a pesar de ser una pequeña parte del juego, pues lo cierto es que me ha gustado bastante. Fallout 4 es un juego sand box, en él, el jugador puede ir conquistando asentamientos por el mapa y colocar transmisores de radio, entonces a medida que pasa el tiempo de juego, van llegando colonos que viven en el asentamiento (no más de 21). Estos colonos se les asigna una tarea (recolectar comida, defensa, comercio, desguace, y creo que ya está XD) y entonces, a lo largo del día, pues van teniendo sus vidas, duermen, se levantan por la mañana, se ponen a trabajar desde las 9 hasta las ¿20? tras lo cual se ponen a pasear por ahí (o se van a la cantina) hasta que llega la hora de dormir. En el transcurso, puede ocurrir que el jugador hable con ellos, lo que para su actividad un momento para decir la bobada de turno. También puede ocurrir que el asentamiento sea atacado, en ese momento todos dejan su actividad para luchar contra los invasores. A ver si puedo imitar algo así, creo que sería útil para varios tipos de juegos. El asunto de irse a dormir y a trabajar, es fácil, he hecho un código que gestione la hora global, y entonces cada colono, mira dicha hora para decidir su estado e irse a la cama o al puesto de trabajo. Pero me gustaría ir un poco más allá, ¿cómo podría imitar cierto libre albedrío? especialmente para sus horas libres, me viene a la cabeza los sims, que tienen una serie de variables (energía, comodidad, hambre, sociedad, higiene, etc...) y van realizando ciertas acciones dependiendo un poco de lo que necesiten y los objetos que tengan a su alcance, (que por cierto, ¿qué sería mejor? guardarlos en listas a medida que se incorporen al asentamiento, o decirle al colono que haga un casteo para ver los objetos cercanos él mismo?) En fin, lo de las barras de necesidades tipo sims podría ser una manera, pero tengo curiosidad por el tema, ¿se os ocurren otros métodos? O.ò
  2. Necesito que alguien me de una script de IA que ataca y te siegue saca vida etc, me ayudan.
  3. Hola a todos Estoy haciendo un juego de ajedrez para Android y me gustaría saber como puedo crear y configurar una Inteligencia Artificial para que simule el comportamiento del rival. Un saludo y gracias de antemano.
  4. ¡Buenas, compañer@s! Me paso por el foro para dejar un aporte: no es un script complejo para nada, pero puede seros útil para maquetar proyectos o incluso lo poidéis adaptar a vuestro juego en el caso de que queráis y os venga bien. Se trata de un Pathfinder que funciona lanzando Raycasts (de arriba a abajo) alrededor del objeto que queramos que se mueva conforme a un objetivo (inteligencia artificial). Hace un mes aproximadamente vi que en el foro alguien había subido un script de las mismas características, sin embargo, los enlaces estaban caídos y decidí desarrollarlo un poco por mi cuenta. Tengo la costumbre de programar en inglés, supongo que no tendréis problemas con el idioma... xD Y por si acaso quedaran dudas con respecto al funcionamiento del script, dejo comentarios sobre todas y cada una de las funciones y las variables principales (en ESPAÑOL). Es bastante intuitivo a la hora de usarlo, pero repito: es una solución simple, lo he programado porque necesitaba YA un pathfinder que funcionara a grosso modo en un mundo generado de forma procedural. Sin más, os dejo el archivo en adjuntos, está programado en C#. Espero que sirva de utilidad, y si se os ocurre cualquier cosa, comentadlo, a ver qué podemos hacer. PD: Si esta no es la sección apropiada, por favor, moved el tema a la sección correspondiente. Gracias. Kace. PathCalculator.cs
  5. Ultimamente he tratado de empesar a realizar la AI de mi juego(The Valor Frontier), pero en lo que simpre tengo problemas es en reproducir animaciones, ya que yo no soy muy bueno para eso,y simpre que trato de hacer que un NPC(Non-Player Character) se mueva hacia un punto en especifico, este acaba moviendose hacia aya pero mostrando la animacion hacia otro lugar. Tambien queria saber para que sirve y donde se puede encontrar el Mecanim software del Unity
  6. Ultimamente he tratado de empesar a realizar la AI de mi juego(The Valor Frontier), pero en lo que simpre tengo problemas es en reproducir animaciones, ya que yo no soy muy bueno para eso,y simpre que trato de hacer que un NPC(Non-Player Character) se mueva hacia un punto en especifico, este acaba moviendose hacia aya pero mostrando la animacion hacia otro lugar. Tambien queria saber para que sirve y donde se puede encontrar el Mecanim software del Unity
  7. 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 unaherramienta* 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: 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 persecucion” “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ónLa 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”* del objeto “Collision” que nos da OnCollisionEnter, con ello podemos calcular la dirección de dicha interaccion, por ejemplo: 123void 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: 12345void 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ónPara 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: 123456public 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... }}de esta manera podría saber si el objeto dentro del rango de audición esta reproduciendo algún sonido e inclusive podríamos aplicar algunas atenuantes de sonido, por ejemplo el volumen, la obstrucción por parte de muros y otros objetos, e incluso otros sonidos cercanos. Como en el sentido anterior esta recepción de información de igual forma disparara una reacción motora solo que esta podría ser mas relajada, ya que normalmente la percepción de un sonido aumenta desde 0 a medida que el origen se acerca a la posición del actor, por ello la reacción seria mas de “curiosidad”, como en la vida real un sonido nos puede alertar que algo esta cerca y gracias a que tenemos dos oídos tenemos la habilidad de escuchar en stereo, eso, una sutil diferencia de decibeles entre un oído y el otro puede dar la dirección aproximada del origen del sonido y con ello podríamos ir a investigar. Podemos usar el mismo principio que aplicamos en el sentido anterior para rotar el actor debido a que estamos gestionando el sentido a través de un trigger podemos obtener la posición exacta de la fuente con algo parecido: 12345678public 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 de atenuacion... soundDirection = (other.transform.position - transform.position); transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(soundDirection), Time.deltaTime * turnSpeed); }}inclusive si usamos un navmesh podríamos definir other.transform.position como punto de destino a fin de investigar oexplorar si el origen esta tras un muro y así tomar una acción en consecuencia bien sea apoyándose en la vista para confirmar que fue lo que causo el sonido o tomar una acción ciegamente por ejemplo disparar sin confirmación visual. Como pudimos notar tanto el sentido del tacto como el auditivo, pueden llevar al actor a apoyarse en el sentido de la vista para tomar una acción definitiva, si por ejemplo disparar o interactuar con el origen de la información, por esto he dejado este sentido de ultimo pero ahora debemos considerarlo. La VisiónPara la visión debemos establecer dos variables importantes el campo visual y el rango de visión estos son dos factores importantes para la detección visual de otra entidad en el videojuego. El campo visual lo expresaremos en grados y este sera el angulo con respecto al frente del actor, lo normal seria establecer un campo de visión de 90° esto nos dará un angulo total de 180° en frente de nuestro personaje. El rango de visión lo expresaremos con un float y sera el resultado de Vector3.Distance. Siempre es muy recomendable crear un GameControl o como lo quieran llamar, un script que gestione en general aspectos del juego o el nivel: 1234567891011121314public class GameControl : MonoBehaviour{ // implementacion singletone public static GameControl mainGameControl; public List<GameObject> actores = new List<GameObject>(); public void Awake() { if (mainGameControl == null) { mainGameControl = this; } }}como notaron tenemos una variable llamada actores, la que llenaremos a través de los diferentes scripts que tengamos para cargar enemigos o jugadores en la escena. De esta manera podemos tener una lista de los actores activos en la escena de manera de poder recurrir a esta para verificar la posición de cada enemigo y distancia del actor para saber si esta dentro del campo y rango visual, veamos el siguiente ejemplo: 1234567891011public void Update(){ IEnumerable<GameObject> actores = GameControl.mainGameControl.actores.Where(e => (e != null || e.transform != null || e.transform.root != null || e.transform.root.gameObject != null) && !e.GetInstanceID().Equals(gameObject.GetInstanceID()) && nameIsEnemy.Any(nk => e.transform.root.tag.Contains(nk) || e.transform.root.name.Contains(nk) ) && Vector3.Distance(transform.position, e.transform.root.position) < maxDistanceSight );}en el ejemplo anterior creamos un IEnumerable de los GameObjects que cumplen las condiciones dadas, existen en la escena, no es el mismo actor, también podemos usar un listado de strings llamado “nameIsEnemy” para definir que los objetos que contenga cierta palabra en el tag o en el nombre serán considerados como enemigos, y una variable llamada “maxDistanceSight” donde pudiéramos definir la distancia máxima de visión de manera de limitar el rango visual, noten también que estamos accediendo a la lista de actores del GameControl con la linea GameControl.mainGameControl.actores una de las ventajas de usar una implementacion singletone de un componente. Hasta ahora tenemos los actores activos que son enemigos potenciales y que están en rango visual, pero todavía no sabemos si están en campo de visión y si de hecho no están obstaculizados, no sabemos aun si son visibles o no. Yo he creado una clase que nos ayudara a filtrar esos actores para encontrar el enemigo al que se le deberá poner atención, el que cumpla ciertas condiciones que antes mencionamos, que no este obstaculizado y este en el campo de visión 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778public class Enemies : System.Object{ [SerializeField] public Vector3 point { get; set; } [SerializeField] public float distance { get; set; } [SerializeField] public float angle { get; set; } [SerializeField] public bool isVisible { get { return _isVisible; } set { _isVisible = value; } } public RaycastHit raycastHitInformation { get; private set; } AIEnums.Senses _sensoryModalities; public AIEnums.Senses sensoryModalities { get { return _sensoryModalities; } set { __sensoryModalities = value; _sensoryModalities = value; } } private GameObject _gameObject; public GameObject gameObject; { get { return _gameObject; } set { _gameObject = value; if (_monoBehaviour != null && _maxDistanceSight > 0) { this.isVisible = CheckForVisibility(_monoBehaviour, _maxDistanceSight); } } } public AIEnums.Senses __sensoryModalities; public bool _isVisible; private MonoBehaviour _monoBehaviour { get; set; } private float _maxDistanceSight { get; set; } public Enemies() { } public Enemies(MonoBehaviour monoBehaviour, float maxDistanceSight) { this._monoBehaviour = monoBehaviour; this._maxDistanceSight = maxDistanceSight; } public bool CheckForVisibility(MonoBehaviour monoBehaviour, float maxDistanceSight) { Vector3 itemFollowingPos = Vector3.zero; Vector3 actorPos = Vector3.zero; itemFollowingPos = gameObject.transform.position; actorPos = monoBehaviour.transform.position; Vector3 enemyDir = (itemFollowingPos - actorPos); RaycastHit hit; if (Physics.Raycast(actorPos, enemyDir, out hit, maxDistanceSight)) { if (gameObject == hit.transform.gameObject) { raycastHitInformation = hit; return true; } } raycastHitInformation = hit; return false; }}como pueden notar he creado un campo llamado gameObject que contendrá el gameObject del enemigo y en el cuerpo del set de este campo se ejecutara un método llamado “CheckForVisibility” el cual envía un rayo a dicho enemigo para verificar si hace hit es porque no esta obstaculizado y devuelve true o en caso contrario devuelve false y lo guarda en el campo llamado isVisible, ademas tenemos las propiedades point, distance y angle que nos serán de utilidad mas tarde. Volviendo a nuestro componente de AI debemos recabar la informacion que nos interesa de cada actor: 12345678IEnumerable<Enemies> enemies = actores.Select(x => new Enemies(monoBehaviour, maxDistanceSight){ gameObject = x, distance = Vector3.Distance(monoBehaviour.transform.position, x.transform.root.position), angle = Vector3.Angle(monoBehaviour.transform.gameObject.transform.forward, (x.transform.position - monoBehaviour.transform.gameObject.transform.position)), point = x.transform.position, sensoryModalities = AIEnums.Senses.Vision,});entonces tendremos una lista con cada enemigo, la distancia, el angulo en relación al frente de nuestro actor y la posición del enemigo. Con el listado como esta y asumiendo que contenga algún ítem, solo bastaría ordenar la lista de la siguiente manera con linq: 12345List<Enemies> enemysInRange = new List<Enemies>();if (enemies.Count() > 0){ enemysInRange = enemies.OrderBy(e => e.isVisible).ThenBy(e => e.angle).ThenBy(e => e.distance).ToList();}ordenamos primero si isVisible esta en true primero, luego los que tengan menor valor en la propiedad angle y por ultimo los que tengan menos distancia. Ya de esta manera lo que debemos es obtener el primer elemento de esta coleccion 1234567891011if (enemysInRange.Count > 0){ Enemies enemy = enemysInRange.First(); if (enemy.isVisible) { if(enemy.angle < FOV) { } }}ya acá podemos saber si el enemigo esta en el campo visual, donde FOV es como les comente anteriormente el campo visual y esta expresado en grados, este sera el angulo en relación al forward o el frente de nuestro actor donde forward es 0 y sin importar si esta a la derecha o a la izquierda si el angulo del enemigo es menor a FOV quiere decir que esta dentro del campo visual. Podemos incluso verificar un segundo angulo para saber si esta en angulo de tiro y así accionar el disparador en el caso de que sea un shooter 1if (enemy.angle < FOVForFire)Otro tema importante es el performance del componente, como pudieron observar para llegar a este punto debimos de hacer unas cuantas comprobaciones y estas comprobaciones deben ser efectuadas a cada instante por ello en el componente pudieron notar que estaba en la función Update ejecutándose en cada frame, pero esto no es lo mas idóneo ya que esto significaría un uso cuantioso por el numero de comprobaciones y constante por lo que lo mejor seria ejecutarla en una corutina o coroutine para que puedan aplicar bien este concepto les recomiendo que pasen por el articulo Entendiendo las Coroutines (Co-Rutinas) donde explico mejor este tema. Como les dije al comienzo no toque todos los aspectos de la inteligencia artificial ya que seria muy extenso el articulo, pero espero haberles dado una base o una idea de como armar su propia clase, tratare de en futuros artículos profundizar mas en algunos puntos de la AI por separado, por ejemplo, que el actor persiga al enemigo, tocare otros temas acerca de la navegación por navmesh, y otros comportamientos que pudieran presentarse en un juego. Nuevamente espero que le saquen provecho e inclusive puedan mejorar este tema con sus comentarios y sugerencias, lamento haberles alargado tanto la lectura pero como un iceberg esto es solo la punta. Saludos! fuente: https://eleazarcelis.wordpress.com/2015/10/10/creando-una-clase-basica-de-inteligencia-artificial-ai-en-unity/
×
×
  • Create New...