{"id":67284,"date":"2025-05-24T04:09:00","date_gmt":"2025-05-24T09:09:00","guid":{"rendered":"https:\/\/niixer.com\/?p=67284"},"modified":"2025-05-26T14:35:11","modified_gmt":"2025-05-26T19:35:11","slug":"desarrollo-videojuego-en-realidad-mixta-con-unity-e-inteligencia-artificial","status":"publish","type":"post","link":"https:\/\/niixer.com\/index.php\/2025\/05\/24\/desarrollo-videojuego-en-realidad-mixta-con-unity-e-inteligencia-artificial\/","title":{"rendered":"Desarrollo de un videojuego en Realidad Mixta con Unity e Inteligencia Artificial"},"content":{"rendered":"\n<p>\u00bfC\u00f3mo se Desarrollo un videojuego en Realidad Mixta con <a href=\"https:\/\/niixer.com\/index.php\/2024\/03\/03\/unity-desde-cero\/\">Unity<\/a>?<\/p>\n\n\n\n<p>Este art\u00edculo presenta el desarrollo de un videojuego de disparos en realidad mixta (MR) dise\u00f1ado para las gafas <a href=\"https:\/\/www.xataka.com\/realidad-virtual-aumentada\/microsoft-abandona-hololens-como-decirles-a-meta-a-apple-que-invertir-realidad-aumentada-error\">Microsoft HoloLens 1<\/a>. El juego se compone de tres niveles con dificultad progresiva, integrando elementos de inteligencia artificial, interacci\u00f3n espacial, y dise\u00f1o inmersivo. A continuaci\u00f3n, se describe el proceso de dise\u00f1o, implementaci\u00f3n y despliegue.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1200\" height=\"675\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-504-edited.png\" alt=\"\" class=\"wp-image-67364\" style=\"width:1140px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-504-edited.png 1200w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-504-edited-300x169.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-504-edited-1024x576.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-504-edited-768x432.png 768w\" sizes=\"auto, (max-width: 1200px) 100vw, 1200px\" \/><\/figure>\n\n\n\n<p><strong>\u00bfQu\u00e9 son las HoloLens y la realidad mixta?<\/strong><br>Las Microsoft <a href=\"https:\/\/niixer.com\/index.php\/2023\/05\/23\/productividad-con-hololens-2-una-mirada-a-la-realidad-mixta\/\">HoloLens<\/a> son un dispositivo de computaci\u00f3n hologr\u00e1fica que combina realidad aumentada con capacidades avanzadas de sensores y procesamiento espacial, permitiendo superponer elementos digitales interactivos sobre el entorno f\u00edsico del usuario. Este tipo de tecnolog\u00eda se enmarca dentro de lo que se conoce como <strong>realidad mixta (MR, por sus siglas en ingl\u00e9s)<\/strong>, la cual integra el mundo real y virtual para permitir interacciones en tiempo real entre objetos f\u00edsicos y digitales. A diferencia de la realidad aumentada (que solo a\u00f1ade elementos visuales) o la realidad virtual (que a\u00edsla al usuario en un entorno simulado), la realidad mixta permite que los objetos digitales respondan a las superficies, obst\u00e1culos y movimientos del mundo real, ofreciendo experiencias inmersivas y funcionales para juegos, educaci\u00f3n, medicina e ingenier\u00eda.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1.Planteamiento del Proyecto<\/h2>\n\n\n\n<p>La idea central del proyecto fue desarrollar un<a href=\"https:\/\/metamandrill.com\/es\/mejores-juegos-de-realidad-mixta\/\"> <strong>shooter inmersivo en realidad mixta<\/strong><\/a> en el que el jugador pudiera interactuar directamente con su entorno f\u00edsico, integrando elementos del mundo real con experiencias digitales din\u00e1micas. El objetivo principal del juego es eliminar enemigos virtuales que se desplazan inteligentemente por el espacio disponible en la habitaci\u00f3n del usuario, aprovechando las capacidades de mapeo espacial de las HoloLens 1.<\/p>\n\n\n\n<p>Para aumentar el nivel de desaf\u00edo y mantener el inter\u00e9s del jugador, se dise\u00f1aron <strong>tres niveles progresivos<\/strong>, en los cuales la <strong>dificultad incrementa<\/strong> no solo por la cantidad de enemigos, sino principalmente por el aumento en la <strong>velocidad de desplazamiento de estos<\/strong>, as\u00ed como por su comportamiento m\u00e1s reactivo al entorno. Cada vez que un enemigo logra acercarse al jugador y establecer contacto, se produce una reducci\u00f3n en la salud del jugador, simulando da\u00f1o, lo cual obliga al usuario a mantenerse en constante movimiento y alerta.<\/p>\n\n\n\n<p>Una <strong>referencia clave<\/strong> en el dise\u00f1o conceptual del juego fue el t\u00edtulo <em><strong><a href=\"https:\/\/www.meta.com\/es-es\/experiences\/drop-dead-the-cabin\/4691479430874595\/\">Drop Dead: The Cabin \u2013 Home Mixed Reality<\/a><\/strong><\/em>, un juego desarrollado para plataformas avanzadas de realidad mixta que combina acci\u00f3n en primera persona con navegaci\u00f3n espacial y mec\u00e1nicas de combate intuitivas.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Oculus Meta Quest 2 \/ 3 Drop Dead The Cabin Home Invasion Mixed Reality Gameplay + Review\" width=\"800\" height=\"450\" src=\"https:\/\/www.youtube.com\/embed\/51d8Dp4Vp7c?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">2.Tecnolog\u00eda Utilizada<\/h2>\n\n\n\n<p>Se utiliz\u00f3 el motor <strong>Unity 2021.3.45f LTS<\/strong>, una versi\u00f3n robusta y estable, ideal para realidad mixta por su compatibilidad con las herramientas dise\u00f1adas para HoloLens. Desde las etapas iniciales del <strong>desarrollo del <a href=\"https:\/\/niixer.com\/index.php\/2025\/03\/21\/red-dead-redemption-un-hito-en-el-desarrollo-de-videojuegos-y-su-impacto-en-mi-infancia\/\">videojuego<\/a><\/strong>, se emple\u00f3 el emulador de Microsoft HoloLens 1 para simular el comportamiento del entorno real y validar la experiencia de usuario sin necesidad de recurrir constantemente al hardware f\u00edsico. Adem\u00e1s, la l\u00f3gica del videojuego fue completamente programada en C#, el lenguaje nativo de Unity, lo cual facilit\u00f3 enormemente el <strong>desarrollo del videojuego<\/strong> al integrar componentes clave como f\u00edsicas, navegaci\u00f3n espacial e interacciones gestuales de forma fluida y modular.<\/p>\n\n\n\n<p>Para la inteligencia artificial de los enemigos se implement\u00f3 el sistema <strong>NavMesh de Unity<\/strong>, que permite definir \u00e1reas navegables y generar rutas din\u00e1micas dentro del entorno f\u00edsico del jugador. Los <strong>modelos 3D<\/strong> de enemigos y partes del escenario fueron obtenidos desde plataformas como <strong>Sketchfab<\/strong> y <strong><a href=\"https:\/\/niixer.com\/index.php\/2025\/04\/12\/renderizado-realista-de-utilizando-blender\/\">BlenderKit<\/a><\/strong>, seleccionando recursos con licencias adecuadas y optimiz\u00e1ndolos para su uso en realidad mixta. Finalmente, la interfaz de usuario y la l\u00f3gica de progresi\u00f3n entre niveles se desarrollaron con <strong>Unity Canvas<\/strong>, dise\u00f1ados para flotar en el espacio y ser activados mediante gestos, lo que garantiza una experiencia interactiva completamente inmersiva y natural.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Dispositivo objetivo<\/strong>: Emulador de Microsoft HoloLens 1<\/li>\n\n\n\n<li><strong>Lenguaje de programaci\u00f3n<\/strong>: C#<\/li>\n\n\n\n<li><strong>IA y navegaci\u00f3n<\/strong>: Sistema de NavMesh de Unity<\/li>\n\n\n\n<li><strong>Modelos 3D<\/strong>: Sketchfab y <a href=\"https:\/\/niixer.com\/index.php\/2025\/04\/12\/renderizado-realista-de-utilizando-blender\/\">BlenderKit<\/a><\/li>\n\n\n\n<li><strong>Interfaz y progresi\u00f3n<\/strong>: Unity Canvas<\/li>\n\n\n\n<li><strong>Motor de juego<\/strong>: Unity 2021.3.45f LTS<\/li>\n<\/ul>\n\n\n\n<p>Con la version de unity 2021.3.45f1 creamos un <a href=\"https:\/\/www.microsoft.com\/en-us\/download\/details.aspx?id=102778\">nueva Scene<\/a><\/p>\n\n\n\n<p>Realizamos la descarga de esta herramienta, esta herramienta va a descargar los paquetes para realidad mixta.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcEG_gOxbHxUTh1k957ttpi3qAVTFBWPOqTJZ67Qzf4Ml3D0OSfnCe3sRC3wQPuhYxB_jjRlLjjtgo1t1upyBl9XK5HVCI1UsKLJfd8QVD0eatN152RQdR0_N8z-Vwvz3dDDNhtXV2tQbhrM7wAzdM?key=DCdNNqY2eNO4lEgE8hCQkg\" alt=\"\"\/><\/figure>\n\n\n\n<p>seleccionamos estas opciones y le damos en descargar<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXd123EC4JeySOReEQ-9eAoxF3EwQWHdmXAuIyHIp7Wf4CPviErd1xkuPe-uB86ot6U00gRiMmnoOXCxbFBSBqfa_fTd5fZ52BXNapA-DkpDQkzmgiew-pIykKN1LzasrtMnGHSmnsKiHDVTapiDkB8?key=DCdNNqY2eNO4lEgE8hCQkg\" alt=\"\" style=\"width:790px;height:auto\"\/><\/figure>\n\n\n\n<p>seleccionamos estas otras opciones y le damos siguiente<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXeOzal5oq1FxSY34aH5l8m3v7fAtqw_K_eSJrAyLtO57bsVQ57HladBeeCLbFQuwG8vHIzcXOo-eFA2GKyhYSBAXpoa1S98UI4m1ydB9DrICFMAn_YcazrbsFJGwXlVkMvFqEy-NL0f6ur5VWu_ah4?key=DCdNNqY2eNO4lEgE8hCQkg\" alt=\"\"\/><\/figure>\n\n\n\n<p>una vez seleccionado&nbsp; la carpeta del proyecto seleccionamos estas opciones<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Mixed Reality Toolkit Foundation<\/strong> (el n\u00facleo del sistema MRTK)  <\/li>\n\n\n\n<li><strong>Mixed Reality Toolkit Examples<\/strong> (opcional pero \u00fatil para probar)<\/li>\n\n\n\n<li><strong>Mixed Reality Toolkit Extensions<\/strong> (a\u00f1ade funciones extra como conectores)<\/li>\n\n\n\n<li><strong>Mixed Reality Toolkit Tools<\/strong> (para utilidades y ajustes en escena)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">3. Dise\u00f1o de la Jugabilidad<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Configuraci\u00f3n de Enemigos y Componentes de Movimiento<\/h3>\n\n\n\n<p>Cada modelo de enemigo fue programado individualmente con sus propios par\u00e1metros de comportamiento y combate. Todos ellos cuentan con el componente <strong>NavMesh Agent<\/strong> de Unity, lo que les permite moverse de forma aut\u00f3noma dentro del entorno real delimitado, siguiendo rutas din\u00e1micas hacia el jugador.<\/p>\n\n\n\n<p>A cada enemigo se le asignaron las siguientes propiedades:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Vida<\/strong>: Define cu\u00e1ntos impactos puede recibir antes de ser eliminado.<\/li>\n\n\n\n<li><strong>Velocidad de movimiento<\/strong>: Controla qu\u00e9 tan r\u00e1pido se desplaza el enemigo hacia el jugador. Este valor se ajusta seg\u00fan el nivel de dificultad.<\/li>\n\n\n\n<li><strong>Velocidad de ataque<\/strong>: Determina la frecuencia con la que el enemigo puede causar da\u00f1o una vez est\u00e1 dentro del rango del jugador.<\/li>\n\n\n\n<li><strong>Rango de ataque<\/strong>: Es la distancia m\u00ednima requerida entre el enemigo y el jugador para que se ejecute una acci\u00f3n ofensiva.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"747\" height=\"747\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.15.18-PM-edited.jpeg\" alt=\"\" class=\"wp-image-67391\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.15.18-PM-edited.jpeg 747w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.15.18-PM-edited-300x300.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.15.18-PM-edited-150x150.jpeg 150w\" sizes=\"auto, (max-width: 747px) 100vw, 747px\" \/><\/figure>\n\n\n\n<p>Animaciones y Comportamiento de los Enemigos<\/p>\n\n\n\n<p>Cada tipo de enemigo del juego cuenta con un conjunto espec\u00edfico de animaciones y comportamientos, lo que aporta diversidad visual y mejora la experiencia inmersiva del jugador. Las <strong>animaciones principales<\/strong> fueron obtenidas desde la plataforma <strong><a href=\"https:\/\/niixer.com\/index.php\/2025\/04\/08\/animacion-de-avatares-3d-una-guia-practica-con-ready-player-me-mixamo-y-blender\/\">Mixamo<\/a><\/strong>, aplic\u00e1ndolas individualmente a los modelos compatibles.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Galleta y Pizza<\/strong>: Estos enemigos cuentan con tres animaciones principales:\n<ul class=\"wp-block-list\">\n<li><strong>Correr<\/strong>: Se activa cuando detectan al jugador y se dirigen hacia \u00e9l.<\/li>\n\n\n\n<li><strong>Movimiento base<\/strong>: Utilizada para patrullar o desplazarse sin detectar al jugador.<\/li>\n\n\n\n<li><strong>Ataque<\/strong>: Se ejecuta al entrar en contacto con el jugador, simulando un golpe o embestida.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Fantasmas<\/strong>: A diferencia de los otros enemigos, los fantasmas no poseen animaciones importadas de Mixamo. Su comportamiento es m\u00e1s et\u00e9reo:\n<ul class=\"wp-block-list\">\n<li>Se <strong>desplazan en l\u00ednea recta<\/strong> hacia el jugador de forma continua.<\/li>\n\n\n\n<li>Realizan <strong>peque\u00f1as pausas o tambaleos<\/strong>, generando una sensaci\u00f3n de inestabilidad o levitaci\u00f3n.<\/li>\n\n\n\n<li>Al morir, <strong>simplemente desaparecen<\/strong> sin animaci\u00f3n de muerte.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>Independientemente del tipo de enemigo, todos emiten un <strong>efecto de sonido caracter\u00edstico al morir<\/strong>, lo que refuerza el feedback auditivo del juego y permite al jugador percibir claramente cu\u00e1ndo ha derrotado a un oponente.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"591\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.17.38-PM-1024x591.jpeg\" alt=\"\" class=\"wp-image-67394\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.17.38-PM-1024x591.jpeg 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.17.38-PM-300x173.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.17.38-PM-768x443.jpeg 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.17.38-PM.jpeg 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">\u00c1rbol de Animaciones y Transiciones<\/h2>\n\n\n\n<p>El comportamiento animado de los personajes <strong>galleta<\/strong> y <strong>pizza<\/strong> se gestiona mediante un <strong>Animator Controller<\/strong> en Unity, estructurado como un \u00e1rbol de estados. Este \u00e1rbol define los diferentes <strong>estados de animaci\u00f3n<\/strong> y las <strong>transiciones<\/strong> entre ellos, controladas por <strong>condiciones l\u00f3gicas<\/strong> que se eval\u00faan en tiempo real durante el juego.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Estados principales:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Idle\/Movimiento base<\/strong>: Estado por defecto cuando el enemigo est\u00e1 activo pero a\u00fan no ha detectado al jugador.<\/li>\n\n\n\n<li><strong>Correr<\/strong>: Se activa cuando el enemigo ha detectado al jugador y comienza a perseguirlo.<\/li>\n\n\n\n<li><strong>Atacar<\/strong>: Se ejecuta cuando el enemigo entra en el rango de ataque.<\/li>\n\n\n\n<li><strong>Morir<\/strong>: Se activa cuando la vida del enemigo llega a cero.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Transiciones:<\/h3>\n\n\n\n<p>Las <strong>flechas<\/strong> que conectan los estados representan las <strong>condiciones<\/strong> necesarias para cambiar de uno a otro. Por ejemplo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>De <em>Idle<\/em> a <em>Correr<\/em> si el jugador est\u00e1 en rango de detecci\u00f3n.<\/li>\n\n\n\n<li>De <em>Correr<\/em> a <em>Atacar<\/em> si la distancia al jugador es menor al rango de ataque.<\/li>\n\n\n\n<li>De cualquier estado a <em>Morir<\/em> si la vida del enemigo es igual a cero.<\/li>\n<\/ul>\n\n\n\n<p>Cada transici\u00f3n est\u00e1 acompa\u00f1ada de un <strong>efecto de sonido espec\u00edfico<\/strong>, que refuerza la acci\u00f3n (por ejemplo, gru\u00f1idos al atacar y efectos al morir), generando una experiencia audiovisual m\u00e1s inmersiva. Cabe aclarar que los <strong>fantasmas<\/strong> no utilizan este sistema, ya que no cuentan con animaciones complejas, sino con un movimiento simple y desaparici\u00f3n al ser derrotados.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1016\" height=\"599\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.20.13-PM.jpeg\" alt=\"\" class=\"wp-image-67395\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.20.13-PM.jpeg 1016w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.20.13-PM-300x177.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.20.13-PM-768x453.jpeg 768w\" sizes=\"auto, (max-width: 1016px) 100vw, 1016px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Script1: Base de Comportamiento para Enemigos<\/h2>\n\n\n\n<p>El <strong>primer script<\/strong> desarrollado para los enemigos act\u00faa como <strong>componente base<\/strong> del comportamiento general que comparten todos los tipos de enemigos en el juego. Este script centraliza las funciones esenciales para la interacci\u00f3n con el jugador y la toma de decisiones b\u00e1sicas dentro del entorno de realidad mixta.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>using System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\n#if UNITY_EDITOR\nusing UnityEditor;\n#endif\n\npublic class Enemigo : MonoBehaviour\n{\n    public Estados estado;\n    public float distanciaSeguir;\n    public float distanciaAtacar;\n    public float distanciaEscapar;\n    public bool autoseleccionarTarget = true;\n    public Transform target;\n\n    public float distancia;\n    public bool vivo = true;\n\n    protected virtual void Awake()\n    {\n        if (autoseleccionarTarget)\n        {\n            GameObject player = GameObject.FindGameObjectWithTag(\"Player\");\n            if (player != null)\n                target = player.transform;\n        }\n\n        StartCoroutine(CalcularDistancia());\n    }\n\n    private void LateUpdate()\n    {\n        if (vivo &amp;&amp; target != null)\n            CheckEstado();\n    }\n\n    private void CheckEstado()\n    {\n        switch (estado)\n        {\n            case Estados.idle:\n                EstadoIdle();\n                break;\n            case Estados.seguir:\n                EstadoSeguir();\n                break;\n            case Estados.atacar:\n                EstadoAtacar();\n                break;\n            case Estados.muerto:\n                Estadomuerto();\n                break;\n        }\n    }\n\n    public void CambiarEstado(Estados e)\n    {\n        switch (e)\n        {\n            case Estados.muerto:\n                vivo = false;\n                break;\n        }\n\n        estado = e;\n    }\n\n    public virtual void EstadoIdle()\n    {\n        if (distancia &lt; distanciaSeguir)\n            CambiarEstado(Estados.seguir);\n    }\n\n    public virtual void EstadoSeguir()\n    {\n        if (distancia &lt; distanciaAtacar)\n            CambiarEstado(Estados.atacar);\n        else if (distancia &gt; distanciaEscapar)\n            CambiarEstado(Estados.idle);\n    }\n\n    public virtual void EstadoAtacar()\n    {\n        if (distancia &gt; distanciaAtacar + 0.4f)\n            CambiarEstado(Estados.seguir);\n    }\n\n    public virtual void Estadomuerto()\n    {\n        \/\/ Por defecto no hace nada. Puede sobreescribirse.\n    }\n\n    IEnumerator CalcularDistancia()\n    {\n        while (vivo)\n        {\n            if (target != null)\n                distancia = Vector3.Distance(transform.position, target.position);\n\n            yield return new WaitForSeconds(0.3f);\n        }\n    }\n\n#if UNITY_EDITOR\n    private void OnDrawGizmosSelected()\n    {\n        Handles.color = Color.red;\n        Handles.DrawWireDisc(transform.position, Vector3.up, distanciaAtacar);\n\n        Handles.color = Color.yellow;\n        Handles.DrawWireDisc(transform.position, Vector3.up, distanciaSeguir);\n\n        Handles.color = Color.green;\n        Handles.DrawWireDisc(transform.position, Vector3.up, distanciaEscapar);\n    }\n#endif\n\n    private void OnDrawGizmos()\n    {\n        int icono = (int)estado;\n        icono++;\n        Gizmos.DrawIcon(transform.position + Vector3.up * 1.2f, \"@\" + icono + \".png\", false);\n    }\n\n    public enum Estados\n    {\n        idle = 0,\n        seguir = 1,\n        atacar = 2,\n        muerto = 3\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Script2: Comportamiento Espec\u00edfico con Navegaci\u00f3n Inteligente<\/h2>\n\n\n\n<p>El script extiende la funcionalidad general definida en la clase base <code>Enemigo<\/code>, proporcionando una implementaci\u00f3n espec\u00edfica para enemigos que requieren movimiento controlado mediante el componente <strong>NavMeshAgent<\/strong> de Unity. Esta clase se encarga de ejecutar acciones contextuales como <strong>perseguir al jugador, detenerse al atacar y desactivarse al morir<\/strong>, todo dentro del entorno de realidad mixta.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Principales funcionalidades del script:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Inicializaci\u00f3n del NavMeshAgent<\/strong><br>En el m\u00e9todo <code>Awake()<\/code>, se obtiene una referencia al componente <code>NavMeshAgent<\/code>, que es obligatorio gracias al atributo <code>[RequireComponent(typeof(NavMeshAgent))]<\/code>. Esto garantiza que el GameObject tenga siempre el componente necesario para navegar por el espacio.<\/li>\n\n\n\n<li><strong>Estado Idle (reposo)<\/strong><br>El enemigo se detiene completamente y no se dirige a ning\u00fan destino: csharpCopiarEditar<code>agente.SetDestination(transform.position);<\/code><\/li>\n\n\n\n<li><strong>Estado Seguir (persecuci\u00f3n)<\/strong><br>Cuando el jugador est\u00e1 dentro del rango de detecci\u00f3n, el enemigo se activa y comienza a seguirlo: csharpCopiarEditar<code>agente.SetDestination(target.position);<\/code><\/li>\n\n\n\n<li><strong>Estado Atacar<\/strong><br>El enemigo se detiene al alcanzar el rango de ataque y rota hacia el jugador usando <code>transform.LookAt<\/code>, manteniendo la coherencia visual y estrat\u00e9gica: csharpCopiarEditar<code>agente.SetDestination(transform.position); transform.LookAt(target, Vector3.up);<\/code><\/li>\n\n\n\n<li><strong>Estado Muerto<\/strong><br>Se desactiva el <code>NavMeshAgent<\/code> para detener todo movimiento al morir: csharpCopiarEditar<code>agente.enabled = false;<\/code><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">C\u00f3mo implementar este script en Unity<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Preparaci\u00f3n del terreno<\/strong><br>Aseg\u00farate de que el entorno donde se mover\u00e1n los enemigos tiene un plano o superficie que pueda actuar como malla de navegaci\u00f3n.<\/li>\n\n\n\n<li><strong>Hornear (bakear) el NavMesh<\/strong>\n<ul class=\"wp-block-list\">\n<li>Ve al men\u00fa <strong>Window &gt; AI &gt; Navigation<\/strong>.<\/li>\n\n\n\n<li>Selecciona los objetos del entorno (por ejemplo, el suelo) y m\u00e1rcalos como <strong>Navigation Static<\/strong>.<\/li>\n\n\n\n<li>En la pesta\u00f1a <strong>Bake<\/strong>, ajusta los par\u00e1metros (altura, radio, pendiente m\u00e1xima) y presiona <strong>Bake<\/strong> para generar el NavMesh.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Configuraci\u00f3n del enemigo<\/strong>\n<ul class=\"wp-block-list\">\n<li>Asigna al GameObject del enemigo el <strong>componente NavMeshAgent<\/strong> (si no se ha agregado autom\u00e1ticamente).<\/li>\n\n\n\n<li>A\u00f1ade el script <code>Enemigo2<\/code> al GameObject.<\/li>\n\n\n\n<li>Define un <code>Transform<\/code> objetivo (por ejemplo, el jugador).<\/li>\n\n\n\n<li>Configura los valores de velocidad, rango de ataque y estados desde el inspector o c\u00f3digo.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>using System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UnityEngine.AI;\n\n&#91;RequireComponent(typeof(NavMeshAgent))]\npublic class Enemigo2 : Enemigo\n{\n    private NavMeshAgent agente;\n\n    protected override void Awake()\n    {\n        base.Awake();\n        agente = GetComponent&lt;NavMeshAgent&gt;();\n    }\n\n    public override void EstadoIdle()\n    {\n        base.EstadoIdle();\n        if (agente.enabled)\n            agente.SetDestination(transform.position);\n    }\n\n    public override void EstadoSeguir()\n    {\n        base.EstadoSeguir();\n        if (agente.enabled &amp;&amp; target != null)\n            agente.SetDestination(target.position);\n    }\n\n    public override void EstadoAtacar()\n    {\n        base.EstadoAtacar();\n        if (agente.enabled)\n        {\n            agente.SetDestination(transform.position);\n            transform.LookAt(target, Vector3.up);\n        }\n    }\n\n    public override void Estadomuerto()\n    {\n        base.Estadomuerto();\n        if (agente != null)\n            agente.enabled = false;\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Script: Manejo de F\u00edsica y Colisi\u00f3n con Proyectiles<\/h2>\n\n\n\n<p>El script <code>Enemy<\/code> implementa la l\u00f3gica de <strong>respuesta f\u00edsica cuando un enemigo es alcanzado por una bala<\/strong> (objeto tipo <code>Sphere<\/code>). Este comportamiento se encarga de simular una reacci\u00f3n realista en el enemigo al momento del impacto, a\u00f1adiendo un efecto visual y f\u00edsico antes de su destrucci\u00f3n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Funcionalidad principal<\/h3>\n\n\n\n<p>Al detectar una colisi\u00f3n mediante el m\u00e9todo <code>OnCollisionEnter<\/code>, el script verifica si el objeto que ha impactado al enemigo tiene un nombre que contiene la palabra <code>\"Sphere\"<\/code> (nombre asignado com\u00fanmente a las balas en el juego). Si se cumple esta condici\u00f3n:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Se obtiene el componente <code>Rigidbody<\/code><\/strong> del enemigo, que normalmente est\u00e1 configurado como <em>cinem\u00e1tico<\/em> para permitir control por c\u00f3digo sin interferencia de la f\u00edsica de Unity. csharpCopiarEditar<code>Rigidbody rb = GetComponent&lt;Rigidbody&gt;();<\/code><\/li>\n\n\n\n<li><strong>Se activa la f\u00edsica<\/strong> del enemigo al desactivar <code>isKinematic<\/code> y habilitar la gravedad: csharpCopiarEditar<code>rb.isKinematic = false; rb.useGravity = true;<\/code><\/li>\n\n\n\n<li><strong>Se destruye el enemigo con un retardo de 1 segundo<\/strong>, permitiendo que la animaci\u00f3n f\u00edsica tenga tiempo de ejecutarse (por ejemplo, que el enemigo caiga o colapse): csharpCopiarEditar<code>Destroy(gameObject, 1f);<\/code><\/li>\n<\/ol>\n\n\n\n<p>Este enfoque mejora la sensaci\u00f3n de impacto en el juego, ofreciendo una respuesta visual satisfactoria cuando el jugador acierta un disparo.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>using UnityEngine;\n\npublic class Enemy : MonoBehaviour\n{\n    void OnCollisionEnter(Collision collision)\n    {\n        if (collision.gameObject.name.Contains(\"Sphere\"))\n        {\n            Rigidbody rb = GetComponent&lt;Rigidbody&gt;();\n            rb.isKinematic = false;\n            rb.useGravity = true;\n\n            Destroy(gameObject, 1f); \/\/ se destruye con retardo\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Script: Control de Instancia \u00danica (Singleton)<\/h2>\n\n\n\n<p>La clase <code>Personaje<\/code> implementa el patr\u00f3n de dise\u00f1o <strong>singleton<\/strong>, lo cual garantiza que solo exista una instancia activa de este objeto en la escena en un momento dado. Este patr\u00f3n es especialmente \u00fatil cuando se quiere tener un <strong>enemigo especial, jefe o entidad \u00fanica<\/strong> que no debe ser duplicada accidentalmente durante el juego o la carga de escenas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Funcionalidad principal<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Propiedad est\u00e1tica <code>singleton<\/code><\/strong>:<br>Se utiliza para almacenar la \u00fanica instancia permitida del objeto <code>Personaje<\/code>.<\/li>\n\n\n\n<li><strong>M\u00e9todo <code>Awake()<\/code><\/strong>:<br>Este m\u00e9todo se ejecuta al iniciar el objeto en la escena. Su l\u00f3gica es:\n<ul class=\"wp-block-list\">\n<li>Si a\u00fan no existe una instancia (<code>singleton == null<\/code>), esta instancia se registra como la \u00fanica.<\/li>\n\n\n\n<li>Si ya existe una instancia activa, la nueva se <strong>destruye inmediatamente<\/strong> usando <code>DestroyImmediate<\/code>, eliminando cualquier duplicado no deseado: csharpCopiarEditar<code>DestroyImmediate(this.gameObject);<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Referencia a componente <code>Vida<\/code><\/strong>:<br>La clase tambi\u00e9n mantiene una referencia p\u00fablica al componente <code>Vida<\/code>, lo cual puede ser \u00fatil si se desea controlar la salud de esta entidad especial de forma global.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>using UnityEngine;\nusing Microsoft.MixedReality.Toolkit;\nusing Microsoft.MixedReality.Toolkit.Input;\n\npublic class Shooter : MonoBehaviour, IMixedRealityPointerHandler\n{\n    public GameObject bulletPrefab;\n    public float bulletSpeed = 10f;\n    public int health = 5;\n    public AudioSource dmgSound;\n    void Start()\n    {\n        CoreServices.InputSystem?.RegisterHandler&lt;IMixedRealityPointerHandler&gt;(this);\n    }\n\n    void OnDestroy()\n    {\n        CoreServices.InputSystem?.UnregisterHandler&lt;IMixedRealityPointerHandler&gt;(this);\n    }\n\n    public void OnPointerClicked(MixedRealityPointerEventData eventData)\n    {\n        Fire();\n    }\n\n    void Fire()\n    {\n        Debug.Log(\"\u00a1Disparo!\");\n        GameObject bullet = Instantiate(bulletPrefab, Camera.main.transform.position, Quaternion.identity);\n        Rigidbody rb = bullet.GetComponent&lt;Rigidbody&gt;();\n        bullet.GetComponent&lt;Renderer&gt;().material.color = Color.red;\n        rb.velocity = Camera.main.transform.forward * bulletSpeed;\n        Destroy(bullet, 5f);\n        transform.GetComponent&lt;AudioSource&gt;().Play();\n    }\n\n    public void OnDamage()\n    {\n        dmgSound.Play();\n    }\n\n    public void OnPointerDown(MixedRealityPointerEventData eventData) { }\n    public void OnPointerDragged(MixedRealityPointerEventData eventData) { }\n    public void OnPointerUp(MixedRealityPointerEventData eventData) { }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Sistema de Spawners y Dise\u00f1o de Oleadas<\/h2>\n\n\n\n<p>El sistema de <strong>spawners<\/strong> fue dise\u00f1ado para controlar de forma estrat\u00e9gica la aparici\u00f3n de enemigos en cada nivel del juego. Estos spawners son <strong>puntos definidos en el mapa<\/strong> desde donde emergen los enemigos, y su distribuci\u00f3n var\u00eda seg\u00fan el nivel para aumentar gradualmente la dificultad.<\/p>\n\n\n\n<p>Cada nivel cuenta con un <strong>conjunto espec\u00edfico de spawners<\/strong> ubicados en distintas posiciones del entorno virtual, lo que permite:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Generar <strong>oleadas m\u00e1s impredecibles<\/strong>.<\/li>\n\n\n\n<li>Obligar al jugador a desplazarse constantemente y mantener la atenci\u00f3n en m\u00faltiples direcciones.<\/li>\n\n\n\n<li>Controlar el <strong>ritmo y la intensidad del combate<\/strong> en funci\u00f3n del progreso del jugador.<\/li>\n<\/ul>\n\n\n\n<p>Al avanzar de nivel, se incrementa:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>El <strong>n\u00famero de spawners activos<\/strong>.<\/li>\n\n\n\n<li>La <strong>frecuencia de aparici\u00f3n<\/strong> de enemigos.<\/li>\n\n\n\n<li>La <strong>complejidad del patr\u00f3n de ataque<\/strong>, ya que los enemigos pueden surgir desde \u00e1ngulos inesperados.<\/li>\n<\/ul>\n\n\n\n<p>Este sistema permite dise\u00f1ar una <strong>experiencia escalonada y din\u00e1mica<\/strong>, haciendo que cada nivel represente un nuevo reto espacial y estrat\u00e9gico dentro del entorno de realidad mixta.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"846\" height=\"878\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.21.47-PM.jpeg\" alt=\"\" class=\"wp-image-67396\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.21.47-PM.jpeg 846w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.21.47-PM-289x300.jpeg 289w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.21.47-PM-768x797.jpeg 768w\" sizes=\"auto, (max-width: 846px) 100vw, 846px\" \/><\/figure>\n\n\n\n<p>Script:Sistema de Spawners y Dise\u00f1o de Oleadas<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>using System.Collections;\nusing UnityEngine;\n\npublic class SpawnerEnemigos : MonoBehaviour\n{\n    &#91;SerializeField] private GameObject&#91;] enemigos; \/\/ Prefabs\n    &#91;SerializeField] private float tiempoMin = 1f;\n    &#91;SerializeField] private float tiempoMax = 3f;\n\n    &#91;SerializeField] private Transform puntoSpawn =&gt; transform;\n\n    private GameManager gameManager;\n\n    private void Start()\n    {\n        gameManager = GameManager.Instance;\n        StartCoroutine(SpawnLoop());\n    }\n\n    private IEnumerator SpawnLoop()\n    {\n        while (!gameManager.NivelFinalizado)\n        {\n            SpawnEnemigo();\n            float tiempoAleatorio = Random.Range(tiempoMin, tiempoMax);\n            yield return new WaitForSeconds(tiempoAleatorio);\n        }\n    }\n\n    private void SpawnEnemigo()\n    {\n        int index = Random.Range(0, enemigos.Length);\n        GameObject enemigoGO = Instantiate(enemigos&#91;index], puntoSpawn.position, Quaternion.identity);\n        EnemigoBase enemigo = enemigoGO.GetComponent&lt;EnemigoBase&gt;();\n        enemigo.SetJugador(gameManager.Jugador);\n\n        enemigoGO.AddComponent&lt;EnemigoReportador&gt;().Init(gameManager);\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Script: Gesti\u00f3n de Salud y Evento de Muerte<\/h2>\n\n\n\n<p>El script <code>Vida<\/code> se encarga de gestionar el sistema de salud de los enemigos u otros objetos da\u00f1ables en el juego. Esta clase es modular y puede ser reutilizada para diferentes personajes, ya que define la <strong>vida inicial<\/strong>, el <strong>da\u00f1o recibido<\/strong> y un <strong>evento personalizado<\/strong> que se ejecuta cuando el objeto muere.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Funcionalidades principales:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Inicializaci\u00f3n de vida<\/strong>:<br>En el m\u00e9todo <code>Start()<\/code>, se asigna a <code>vidaActual<\/code> el valor definido en <code>vidaInicial<\/code>, permitiendo configurar f\u00e1cilmente la resistencia de cada enemigo desde el editor de Unity.<\/li>\n\n\n\n<li><strong>M\u00e9todo <code>CausarDa\u00f1o(float cuanto)<\/code><\/strong>:<br>Este m\u00e9todo reduce la vida actual en funci\u00f3n del da\u00f1o recibido (<code>cuanto<\/code>). Si la vida llega a cero o menos:\n<ul class=\"wp-block-list\">\n<li>Se imprime un mensaje en consola con el nombre del objeto muerto.<\/li>\n\n\n\n<li>Se ejecuta el <code>eventoMorir<\/code> mediante <code>eventoMorir.Invoke()<\/code>.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>using System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\nusing UnityEngine.Events;\n\npublic class Vida : MonoBehaviour\n{\n    public float vidaInicial;\n    public float vidaActual;\n    public UnityEvent eventoMorir;  \/\/ Evento que se dispara al morir\n\n    void Start()\n    {\n        vidaActual = vidaInicial;\n    }\n\n    public void CausarDa\u00f1o(float cuanto)\n    {\n        vidaActual -= cuanto;\n        if (vidaActual &lt;= 0)\n        {\n            print(\"Muerto!! -&gt; \" + gameObject.name);\n            eventoMorir.Invoke();  \/\/ Dispara el evento asociado\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Script : Enemigo Derivado con Comportamiento Especializado<\/h2>\n\n\n\n<p>La clase <code>Dulce<\/code> representa un tipo de enemigo dentro del videojuego y hereda de la clase abstracta <code>EnemigoBase<\/code>, lo que permite estructurar el comportamiento com\u00fan de todos los enemigos y especializarlo para cada caso. Esta clase se encarga de definir caracter\u00edsticas espec\u00edficas como <strong>velocidad de movimiento, velocidad de ataque<\/strong> y el tipo de acci\u00f3n que ejecuta al alcanzar al jugador.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Herencia y estructura<\/h3>\n\n\n\n<p><code>Dulce<\/code> sobrescribe m\u00e9todos abstractos definidos en <code>EnemigoBase<\/code>, estableciendo sus propios valores y animaciones. Esto permite una arquitectura de <strong>programaci\u00f3n orientada a objetos clara y escalable<\/strong>, ya que nuevos enemigos pueden crearse f\u00e1cilmente heredando la misma base.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Funcionalidades clave:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Velocidades personalizadas<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>GetVelocidad()<\/code>: Define la velocidad de movimiento del enemigo (1.5 unidades por defecto).<\/li>\n\n\n\n<li><code>GetVelocidadAtaque()<\/code>: Controla la frecuencia con la que puede atacar al jugador (0.5 segundos por intento).<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Animaci\u00f3n de ataque y da\u00f1o al jugador<\/strong>:\n<ul class=\"wp-block-list\">\n<li><code>EjecutarAtaque()<\/code>: Al entrar en rango, se llama a la funci\u00f3n de da\u00f1o desde el <code>GameManager<\/code>, restando salud al jugador, y se dispara la animaci\u00f3n correspondiente: csharpCopiarEditar<code>GameManager.Instance.RecibirDa\u00f1o(1); animator.SetTrigger(\"Atacar\");<\/code><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Inicializaci\u00f3n del <code>Animator<\/code><\/strong>:<br>Se asigna el <code>Animator<\/code> serializado en Unity al campo heredado para controlar las transiciones de animaciones, como correr, patrullar o atacar.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Mec\u00e1nicas b\u00e1sicas<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Disparo<\/strong>: Activado mediante gesto de air-tap.<\/li>\n\n\n\n<li><strong>Da\u00f1o recibido<\/strong>: Cuando un enemigo entra en contacto con el jugador.<\/li>\n\n\n\n<li><strong>Progresi\u00f3n<\/strong>: Canvas del bot\u00f3n de reset y avanzar al siguiente nivel autom\u00e1ticamente.<\/li>\n<\/ul>\n\n\n\n<p>using System;<br>using System.Collections;<br>using System.Collections.Generic;<br>using UnityEngine;<\/p>\n\n\n\n<p>public class Dulce : EnemigoBase<br>{<br>[SerializeField] private float velocidad = 1.5f;<br>[SerializeField] private float velocidadAtaque = 0.5f;<br>[SerializeField] private Animator Animator;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>public GameObject player;\n\nprivate void Start()\n{\n    base.Start(); \n    base.animator = Animator;\n}\n\nprotected override float GetVelocidad()\n{\n    return velocidad;\n}\n\nprotected override float GetVelocidadAtaque()\n{\n    return velocidadAtaque;\n}\n\nprotected override void EjecutarAtaque()\n{\n    GameManager.Instance.RecibirDa\u00f1o(1); \n    animator.SetTrigger(\"Atacar\");\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Script: Estructura General de Comportamiento para Enemigos<\/h2>\n\n\n\n<p>La clase abstracta <code>EnemigoBase<\/code> define el <strong>comportamiento gen\u00e9rico de todos los enemigos<\/strong> del juego. Act\u00faa como una plantilla base que puede ser extendida por clases concretas como <code>Dulce<\/code>, <code>Pizza<\/code> o <code>Fantasma<\/code>, permitiendo personalizar aspectos espec\u00edficos como velocidad, tipo de ataque o reacciones al da\u00f1o.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Caracter\u00edsticas principales<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Gesti\u00f3n de movimiento y ataque<\/strong><br>El enemigo rastrea al jugador constantemente. Si se encuentra fuera del rango de ataque, se desplaza hacia \u00e9l usando el m\u00e9todo <code>MoverHaciaJugador()<\/code>. Si entra en el rango definido (<code>rangoAtaque<\/code>), se detiene y comienza una <strong>corrutina de ataque peri\u00f3dico<\/strong>.<\/li>\n\n\n\n<li><strong>Referencia al jugador<\/strong><br>Se establece con <code>SetJugador(Transform nuevoJugador)<\/code>, permitiendo asignar din\u00e1micamente el objetivo desde el <code>GameManager<\/code> u otros controladores globales.<\/li>\n\n\n\n<li><strong>Sistema de animaciones<\/strong><br>Mediante el componente <code>Animator<\/code>, se controla el cambio de estados visuales:\n<ul class=\"wp-block-list\">\n<li>Movimiento: ajusta el par\u00e1metro <code>VelocidadMovimiento<\/code>.<\/li>\n\n\n\n<li>Ataque: activa\/desactiva <code>Atacando<\/code>.<\/li>\n\n\n\n<li>Muerte: se lanza el trigger <code>Death<\/code>.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Sistema de da\u00f1o y salud<\/strong><br>El m\u00e9todo <code>RecibirDa\u00f1o(int cantidad)<\/code> reduce la vida actual. Al llegar a cero, se activa el m\u00e9todo <code>Morir()<\/code>, el cual detiene todas las corrutinas y reproduce la animaci\u00f3n y sonido de muerte, seguido de la destrucci\u00f3n del objeto.<\/li>\n\n\n\n<li><strong>Colisi\u00f3n con balas<\/strong><br>El m\u00e9todo <code>OnTriggerEnter(Collider other)<\/code> detecta colisiones con objetos etiquetados como <code>\"Bullet\"<\/code>, aplica da\u00f1o y destruye la bala: csharpCopiarEditar<code>if (other.CompareTag(\"Bullet\")) { RecibirDa\u00f1o(1); Destroy(other.gameObject); }<\/code><\/li>\n\n\n\n<li><strong>M\u00e9todos abstractos<\/strong><br>Las funciones <code>GetVelocidad()<\/code>, <code>GetVelocidadAtaque()<\/code> y <code>EjecutarAtaque()<\/code> son <strong>abstractas<\/strong> y deben ser implementadas en cada subclase concreta para definir su comportamiento \u00fanico.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>using UnityEngine;\nusing System.Collections;\n\npublic abstract class EnemigoBase : MonoBehaviour\n{\n    protected Transform jugador;\n\n    &#91;SerializeField] protected float rangoAtaque = 1.5f;\n    protected bool atacando = false;\n    protected Animator animator;\n    &#91;SerializeField] protected int vidaMaxima = 3;\n    protected int vidaActual;\n    \n\n    public bool Atacando\n    {\n        get =&gt; atacando;\n        set =&gt; atacando = value;\n    }\n    protected virtual void Start()\n    {\n        vidaActual = vidaMaxima;\n    }\n    public void SetJugador(Transform nuevoJugador)\n    {\n        jugador = nuevoJugador;\n    }\n\n    protected virtual void Update()\n    {\n        if (jugador == null) return;\n\n        float distancia = Vector3.Distance(transform.position, jugador.position);\n\n        if (distancia &gt; rangoAtaque)\n        {\n            atacando = false;\n            StopAllCoroutines(); \n            MoverHaciaJugador();\n        }\n        else\n        {\n            if (!atacando)\n            {\n                atacando = true;\n\n                if (animator != null)\n                {\n                    animator.SetFloat(\"VelocidadMovimiento\", 0f);\n                    animator.SetBool(\"Atacando\", true);\n                }\n\n                StartCoroutine(AtacarJugador());\n            }\n        }\n    }\n\n    protected virtual void MoverHaciaJugador()\n    {\n        Vector3 direccion = (jugador.position - transform.position).normalized;\n        transform.position += direccion * GetVelocidad() * Time.deltaTime;\n\n        transform.LookAt(new Vector3(jugador.position.x, transform.position.y, jugador.position.z));\n\n        if (animator != null)\n        {\n            animator.SetFloat(\"VelocidadMovimiento\", GetVelocidad());\n            animator.SetBool(\"Atacando\", false);\n        }\n    }\n\n    protected virtual IEnumerator AtacarJugador()\n    {\n        while (atacando)\n        {\n            EjecutarAtaque();\n            yield return new WaitForSeconds (GetVelocidadAtaque());\n        }\n    }\n    public virtual void RecibirDa\u00f1o(int cantidad)\n    {\n        if (vidaActual &lt;= 0) return; \n\n        vidaActual -= cantidad;\n\n        if (vidaActual &lt;= 0)\n        {\n            vidaActual = 0;\n            Morir();\n        }\n    }\n    protected virtual void Morir()\n    {\n        Debug.Log($\"{name} ha muerto.\");\n        StopAllCoroutines();\n        enabled = false;\n\n        if (animator != null)\n        {\n            animator.SetFloat(\"VelocidadMovimiento\", 0f);\n            animator.SetBool(\"Atacando\", false);\n            animator.SetTrigger(\"Death\");\n\n            StartCoroutine(EsperarAnimacionMuerte());\n        }\n        else\n        {\n            Destroy(gameObject);\n        }\n    }\n    \n    protected virtual IEnumerator EsperarAnimacionMuerte()\n    {\n        transform.GetComponent&lt;AudioSource&gt;().Play();\n        yield return new WaitForSeconds(3f); \n        Destroy(gameObject);\n    }\n    \n    private void OnTriggerEnter(Collider other)\n    {\n        if (other.CompareTag(\"Bullet\"))\n        {\n            RecibirDa\u00f1o(1);\n            Destroy(other.gameObject); \n        }\n    }\n    protected abstract float GetVelocidad();         \n    protected abstract float GetVelocidadAtaque();   \n    protected abstract void EjecutarAtaque();       \n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Script: Comunicaci\u00f3n con el GameManager<\/h2>\n\n\n\n<p>El script <code>EnemigoReportador<\/code> cumple una funci\u00f3n clave en la l\u00f3gica de control de progresi\u00f3n del juego: <strong>notificar al <code>GameManager<\/code> cuando un enemigo es destruido<\/strong>, lo que permite llevar un registro preciso de cu\u00e1ntos enemigos han sido eliminados en el nivel actual.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Funcionalidad principal<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Inicializaci\u00f3n del GameManager<\/strong><br>A trav\u00e9s del m\u00e9todo p\u00fablico <code>Init(GameManager gm)<\/code>, se establece una referencia al <code>GameManager<\/code>, que es el controlador central del juego. csharpCopiarEditar<code>public void Init(GameManager gm) { gameManager = gm; }<\/code><\/li>\n\n\n\n<li><strong>Notificaci\u00f3n al destruirse<\/strong><br>Cuando el objeto que contiene este script es destruido (por ejemplo, al morir el enemigo), se ejecuta <code>OnDestroy()<\/code>. En este m\u00e9todo se verifica:<ul><li>Que exista una referencia v\u00e1lida al <code>GameManager<\/code>.<\/li><li>Que el nivel est\u00e9 en curso (<code>NivelIniciado == true<\/code>).<\/li><\/ul>Si ambas condiciones se cumplen, se llama a <code>gameManager.ReportarMuerteEnemigo()<\/code> para registrar la muerte del enemigo: csharpCopiarEditar<code>if (gameManager != null &amp;&amp; gameManager.NivelIniciado) { gameManager.ReportarMuerteEnemigo(); }<\/code><\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Uso t\u00edpico en el juego<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Este script se adjunta a cada enemigo que debe ser contado en el sistema de <strong>oleadas o progreso por nivel<\/strong>. Al hacerlo, el <code>GameManager<\/code> puede:<\/li>\n\n\n\n<li>Mostrar mensajes o indicadores como &#8220;Nivel completado&#8221; mediante Canvas.<\/li>\n\n\n\n<li>Llevar el conteo de enemigos eliminados.<\/li>\n\n\n\n<li>Activar el siguiente evento, oleada o nivel al alcanzar una cantidad espec\u00edfica de muertes.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>using UnityEngine;\n\npublic class EnemigoReportador : MonoBehaviour\n{\n    private GameManager gameManager;\n\n    public void Init(GameManager gm)\n    {\n        gameManager = gm;\n    }\n\n    private void OnDestroy()\n    {\n        if (gameManager != null &amp;&amp; gameManager.NivelIniciado)\n        {\n            gameManager.ReportarMuerteEnemigo();\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">4. Dise\u00f1o de los Enemigos y Navegaci\u00f3n Inteligente<\/h2>\n\n\n\n<p>El dise\u00f1o de los enemigos en el videojuego combina tanto elementos visuales llamativos como comportamientos inteligentes que permiten una experiencia desafiante y din\u00e1mica. Cada enemigo fue modelado en 3D o descargado desde plataformas como Sketchfab y BlenderKit, adaptado posteriormente a Unity para integrarse al entorno de realidad mixta. A nivel funcional, los enemigos utilizan el sistema <strong>NavMesh de Unity<\/strong>, lo que les permite desplazarse por el espacio mapeado de forma aut\u00f3noma, identificando rutas y evitando obst\u00e1culos del entorno real.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Modelado y animaci\u00f3n<\/h4>\n\n\n\n<p>Los enemigos fueron seleccionados desde <strong>Sketchfab<\/strong> (modelos con licencia libre) y <strong>BlenderKit<\/strong>, import\u00e1ndolos a Unity y optimizando sus materiales, el escenario principal del videojuego est\u00e1 ambientado en una <strong>tienda de dulces colorida y estilizada<\/strong>, modelada en 3D con un enfoque <strong>lowpoly<\/strong>. Esta escena, obtenida desde BlenderKit bajo licencia libre, fue elegida por su est\u00e9tica vibrante y atractiva, ideal para un juego con enemigos tipo galleta y pizza.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"490\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-501-1024x490.png\" alt=\"\" class=\"wp-image-67359\" style=\"width:1140px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-501-1024x490.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-501-300x144.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-501-768x368.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-501-1536x735.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-501.png 1905w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Uno de los enemigos destacados del juego es <strong><a href=\"https:\/\/sketchfab.com\/3d-models\/boo-super-mario-bros-e0e42b39cc5a4de79469ecc2d1b33f78\">Boo<\/a><\/strong>, un personaje inspirado en la cl\u00e1sica figura del fantasma de la saga <em>Super Mario Bros<\/em>. Este modelo fue obtenido desde <strong>Sketchfab<\/strong> y se caracteriza por su dise\u00f1o caricaturesco, con cuerpo esf\u00e9rico, grandes colmillos y una lengua sobresaliente que refuerza su aspecto juguet\u00f3n y a la vez amenazante. En el videojuego, Boo representa un enemigo flotante que <strong>no utiliza animaciones complejas<\/strong>, sino que avanza de forma constante hacia el jugador. Sin embargo, su movimiento est\u00e1 acompa\u00f1ado de <strong>pausas breves y tambaleos<\/strong>, simulando un comportamiento err\u00e1tico propio de un ente fantasmal.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"491\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-506-1024x491.png\" alt=\"\" class=\"wp-image-67366\" style=\"width:1140px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-506-1024x491.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-506-300x144.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-506-768x368.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-506-1536x736.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-506.png 1908w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>La <a href=\"https:\/\/sketchfab.com\/3d-models\/galleta-de-gengibre-1d6f7e0c514844e99ad87ac48eb8de40\"><strong>galleta de jengibre<\/strong> <\/a>es uno de los enemigos m\u00e1s caracter\u00edsticos del videojuego, destac\u00e1ndose tanto por su apariencia simp\u00e1tica como por su comportamiento agresivo. El modelo fue extra\u00eddo de <strong>Sketchfab<\/strong> y representa una figura cl\u00e1sica navide\u00f1a con detalles sencillos pero expresivos: botones azules, cejas decorativas y una gran sonrisa.  en el juego esta galleta act\u00faa como un enemigo r\u00e1pido y persistente. Est\u00e1 animada con <strong>transiciones de movimiento, carrera y ataque<\/strong> mediante el sistema Mixamo, lo que le permite acercarse velozmente al jugador y causar da\u00f1o cuando entra en rango. Su aspecto colorido y su comportamiento activo lo convierten en un oponente que contrasta fuertemente con enemigos m\u00e1s lentos o et\u00e9reos, como los fantasmas. Adem\u00e1s, al morir, reproduce un <strong>sonido caracter\u00edstico<\/strong> que refuerza el feedback del combate y marca su eliminaci\u00f3n de la escena.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"492\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-509-1024x492.png\" alt=\"\" class=\"wp-image-67388\" style=\"width:1140px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-509-1024x492.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-509-300x144.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-509-768x369.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-509-1536x738.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-509.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong><a href=\"https:\/\/sketchfab.com\/3d-models\/pizzasteve-3a21b648c47b43caa3b05f7eb9146bbc\">Pizza Steve<\/a><\/strong> es otro de los enemigos animados presentes en el videojuego, con un dise\u00f1o llamativo y personalidad \u00fanica. Este modelo fue extra\u00eddo de <strong>Sketchfab<\/strong> y representa una porci\u00f3n de pizza antropom\u00f3rfica con gafas oscuras, brazos delgados y una actitud relajada, que contrasta visualmente con su rol dentro del juego. A pesar de su apariencia carism\u00e1tica, Pizza Steve es un enemigo \u00e1gil que <strong>cuenta con animaciones de caminar, correr y atacar<\/strong>, integradas mediante Mixamo.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"487\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-510-1024x487.png\" alt=\"\" class=\"wp-image-67389\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-510-1024x487.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-510-300x143.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-510-768x366.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-510-1536x731.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/image-510.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Inteligencia Artificial<\/h3>\n\n\n\n<p>Se implement\u00f3 el <strong>NavMesh de Unity<\/strong> para definir \u00e1reas navegables y permitir que los enemigos se desplazaran inteligentemente por el espacio disponible, evitando obst\u00e1culos y adapt\u00e1ndose al entorno f\u00edsico del usuario. Esto implic\u00f3:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Bakeo del NavMesh<\/strong> en tiempo de ejecuci\u00f3n adaptado al plano real detectado.<\/li>\n\n\n\n<li><strong>Agentes NavMesh<\/strong> que se orientan din\u00e1micamente hacia el jugador.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. Interfaz e Interacci\u00f3n con el Usuario<\/h2>\n\n\n\n<p>game manager<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"581\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.14.09-PM-1-1024x581.jpeg\" alt=\"\" class=\"wp-image-67378\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.14.09-PM-1-1024x581.jpeg 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.14.09-PM-1-300x170.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.14.09-PM-1-768x436.jpeg 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-23-at-11.14.09-PM-1.jpeg 1280w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>La interacci\u00f3n se dise\u00f1\u00f3 exclusivamente para gestos reconocidos por HoloLens:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Men\u00fa inicial con bot\u00f3n flotante.<\/li>\n\n\n\n<li>Canvas flotantes que aparecen al finalizar cada nivel indicando el progreso y ofreciendo la opci\u00f3n de continuar.<\/li>\n\n\n\n<li>Feedback visual mediante efectos de impacto y sonido cuando un enemigo es alcanzado.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Pruebas y Despliegue<\/h2>\n\n\n\n<p>El juego fue probado en entornos reales con el HoloLens 1 para verificar:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Correcta detecci\u00f3n de planos.<\/li>\n\n\n\n<li>Funcionalidad del NavMesh en espacios f\u00edsicos reales.<\/li>\n\n\n\n<li>Comportamiento fluido de los enemigos en diferentes tama\u00f1os de sala.<\/li>\n\n\n\n<li>Latencia m\u00ednima al disparar o al interactuar con UI.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p>al terminarlas de seleccionar&nbsp; get feature&nbsp; proedemos a importarlas&nbsp; y abrir nuestro unity, descargamos nuestra plataforma universal de windows.<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXd0Gh-6PrLKVYOeA5_qj5QHVf78Crlkx78FBuseq7XC-sNZTQ5AB9iciI2QUycHxNEgenzu_LMred4H6nBwpLMwGgCLSvkqjBrkWsj0z3fxn6SLZJjcAiHiS1dnkenUBMzbGvEUgL-dTV3LtKsZers?key=DCdNNqY2eNO4lEgE8hCQkg\" alt=\"\" style=\"width:783px;height:auto\"\/><\/figure>\n\n\n\n<p>una vez realizado damos clic en switch plataform, instalamos el audio windows&gt; package manager<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXd0Gh-6PrLKVYOeA5_qj5QHVf78Crlkx78FBuseq7XC-sNZTQ5AB9iciI2QUycHxNEgenzu_LMred4H6nBwpLMwGgCLSvkqjBrkWsj0z3fxn6SLZJjcAiHiS1dnkenUBMzbGvEUgL-dTV3LtKsZers?key=DCdNNqY2eNO4lEgE8hCQkg\" alt=\"\" style=\"width:785px;height:auto\"\/><\/figure>\n\n\n\n<p>xr plug-in management&nbsp; seleccionamos open XR&gt; microsoft hollolens<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcv47oeh57lmo_jQtz_MGG7whmNKzuDW9AylZeinzEA7KMnpfQo0fQLR9NWa03hF-rg8PLF9uJBKvOuLz7W21PaapjZC-TOttol1nJPaPlpRQN5VamTZAZ0lleITKnSp5Xl3BjkBwEb6XrzdyJYvg?key=DCdNNqY2eNO4lEgE8hCQkg\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXc9Yevi9qLXUndM6XOr6_osWrG0NGsQFtfhTn_E135pCkC6AVsC53GVYkBQSdC5why13gtyFNDA62E2JOjXPqfiyVmKah3JU4NhJlx0sSCknZDIIBur36HFHy_sGftrpm5WnW0NamkUpLxHYFbkRGE?key=DCdNNqY2eNO4lEgE8hCQkg\" alt=\"\"\/><\/figure>\n\n\n\n<p>Ve a:<br>Window &gt; XR &gt; Holographic Remoting for Play Mode<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>&nbsp;(si no aparece, instala Mixed Reality OpenXR Plugin desde el Package Manager)<br><\/li>\n\n\n\n<li>Se abrir\u00e1 la ventana de emulaci\u00f3n.<br><\/li>\n\n\n\n<li>Cambia:<br>\n<ul class=\"wp-block-list\">\n<li>Play Mode: de None a Remote to Device<br><\/li>\n\n\n\n<li>En Remote Machine, escribe la IP del HoloLens<br><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Haz clic en Connect.<br>\n<ul class=\"wp-block-list\">\n<li>Si todo va bien, el estado cambiar\u00e1 a \u2705 &#8220;Connected&#8221; en verde.<br><\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h4 class=\"wp-block-heading\">\u25b6\ufe0f \u00a1Ahora prueba!<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Presiona Play en el editor de Unity.<br><\/li>\n\n\n\n<li>El contenido de tu escena (como tu cubo) se ver\u00e1 en el HoloLens en tiempo real.<br><\/li>\n\n\n\n<li>Puedes mover la cabeza y ver la escena tal como si estuviera desplegada.<br><\/li>\n<\/ul>\n\n\n\n<p>para compilar en lo hololens<\/p>\n\n\n\n<p>abrimos buil settings<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXfB_n7wS0Vy74BB0WznrJFN4eG10-s5xHx64TlN9lGXIc0bYEqTWtS4RT_5cqK-adNGfhRnuCFfWMiHhG3v6l4b_j6US6IPI-QW9SwyodlDRjVXDD3-RCRY4CPbwh9xO33lniYvZftFX7VpAGTMZw?key=DCdNNqY2eNO4lEgE8hCQkg\" alt=\"\"\/><\/figure>\n\n\n\n<p>&nbsp;damos clic en add open scenes para agregar la escena y manejamos la configuracion que se muestra<br><\/p>\n\n\n\n<p>&nbsp;y le damos buil&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXdIjnKkYgoxhsQHMTC-FFOGWn0FeoPNndYrlmocuAgp6nOOx0AjCwQvwN1Ml9Ctxam13BSoEIVCPbTIZLBl5BklnPiWzUnhp9tPJKmA2MYuOgzo9DuWfKDHyqC7xrNZKwjhxfrtDGy8ePGrVvzi_Fs?key=DCdNNqY2eNO4lEgE8hCQkg\" alt=\"\"\/><\/figure>\n\n\n\n<p>Esto nos pedir\u00e1 que seleccionemos una carpeta para que se cree nuestro archivo sln, una ves realizado debemos esperar a que cargue&nbsp;<\/p>\n\n\n\n<p>Una vez que tengamos ya nuestra carpeta con el archivo sln, procedemos a ejecutarlo con nuestro visual studio 2019, demora la capacidad que tenga nuestro equipo<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"833\" height=\"714\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-020708.webp\" alt=\"\" class=\"wp-image-67649\" style=\"width:583px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-020708.webp 833w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-020708-300x257.webp 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-020708-768x658.webp 768w\" sizes=\"auto, (max-width: 833px) 100vw, 833px\" \/><\/figure>\n\n\n\n<p>Una vez est\u00e9 abierto procedemos a colocar release&nbsp; x 86 o x 32 depende del dispositivo que va a utilizar&nbsp; y m\u00e1quina local<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"984\" height=\"330\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-024326.webp\" alt=\"\" class=\"wp-image-67650\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-024326.webp 984w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-024326-300x101.webp 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-024326-768x258.webp 768w\" sizes=\"auto, (max-width: 984px) 100vw, 984px\" \/><\/figure>\n\n\n\n<p>Luego de haber seleccionado m\u00e1quina local, procedemos a ubicarnos sobre el explorador&nbsp; de soluciones que la encontramos al costado derecho<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"524\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-024440-1024x524.webp\" alt=\"\" class=\"wp-image-67654\" style=\"width:975px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-024440-1024x524.webp 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-024440-300x153.webp 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-024440-768x393.webp 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-024440.webp 1328w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Realizamos clic derecho sobre \u201cnombre del proyecto (Universal Windows)\u201d &gt; propiedades<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"541\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-024504-1024x541.webp\" alt=\"\" class=\"wp-image-67652\" style=\"width:984px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-024504-1024x541.webp 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-024504-300x159.webp 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-024504-768x406.webp 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-024504-390x205.webp 390w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-024504.webp 1324w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Como la conexi\u00f3n se est\u00e1 realizando con las HoloLens se coloca la ip de las HoloLens, y se le da aplicar&nbsp; y aceptar<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"785\" height=\"548\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-030106.webp\" alt=\"\" class=\"wp-image-67653\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-030106.webp 785w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-030106-300x209.webp 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-030106-768x536.webp 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-030106-130x90.webp 130w\" sizes=\"auto, (max-width: 785px) 100vw, 785px\" \/><\/figure>\n\n\n\n<p>Una vez realizado se da en ejecutar y esto empezar\u00e1 a compilar&nbsp;&nbsp;<br><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"522\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-024701-1-1024x522.webp\" alt=\"\" class=\"wp-image-67655\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-024701-1-1024x522.webp 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-024701-1-300x153.webp 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-024701-1-768x392.webp 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/Captura-de-pantalla-2025-05-24-024701-1.webp 1351w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>la compilaci\u00f3n ser\u00e1 de tres fases y puede demorar de 5 a 10 minutos para compilar, una vez termine de compilar en nuestras hololens&nbsp; se abrira&nbsp; las hololens&nbsp;<br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. Conclusiones y Aprendizajes<\/h2>\n\n\n\n<p>Este proyecto nos permiti\u00f3 comprender en profundidad las posibilidades y limitaciones de la <strong>realidad mixta en HoloLens 1<\/strong>, as\u00ed como el uso de <strong>inteligencia artificial espacial<\/strong> con NavMesh. La experiencia fue enriquecedora en cuanto a dise\u00f1o 3D, integraci\u00f3n de UI en MR, y navegaci\u00f3n de agentes virtuales en entornos f\u00edsicos reales.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Proyecto Shooter\" width=\"800\" height=\"450\" src=\"https:\/\/www.youtube.com\/embed\/7UE0w_2skdw?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">8.<strong>Cr\u00e9ditos<\/strong><\/h2>\n\n\n\n<p><strong>Autor: <\/strong>sara sof\u00eda lis moreno, <strong>david steven rojas, &nbsp;<\/strong><a href=\"https:\/\/niixer.com\/?s=luis+mateo+mendez+pinzon\"><strong>Luis<\/strong>&nbsp;Mateo M\u00e9ndez Pinz\u00f3n<\/a>, <\/p>\n\n\n\n<p><strong>Editor:<\/strong>&nbsp;Magister ingeniero Carlos Iv\u00e1n Pinz\u00f3n Romero<\/p>\n\n\n\n<p><strong>C\u00f3digo:<\/strong>&nbsp;UCMV<\/p>\n\n\n\n<p><strong>Universidad:<\/strong>&nbsp;<a href=\"https:\/\/www.ucentral.edu.co\/\">Universidad Central<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">9. Citas \/ Referencia<\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">BlenderKit. (s.f.). Galer\u00eda de activos 3D.  <a href=\"https:\/\/www.blenderkit.com\/asset-gallery?query=category_subtree:landmark+candy+order:_score+availability:free\">https:\/\/www.blenderkit.com\/asset-gallery?query=category_subtree:landmark+candy+order:_score+availability:free<\/a><br><br>Sketchfab. (s.f.). Boo - Super Mario Bros. <a href=\"https:\/\/sketchfab.com\/3d-models\/boo-super-mario-bros-e0e42b39cc5a4de79469ecc2d1b33f78\">https:\/\/sketchfab.com\/3d-models\/boo-super-mario-bros-e0e42b39cc5a4de79469ecc2d1b33f78<\/a><br><br>Sketchfab. (s.f.). Galleta de jengibre. <a href=\"https:\/\/sketchfab.com\/3d-models\/galleta-de-gengibre-1d6f7e0c514844e99ad87ac48eb8de40\">https:\/\/sketchfab.com\/3d-models\/galleta-de-gengibre-1d6f7e0c514844e99ad87ac48eb8de40<\/a><br><br>Sketchfab. (s.f.). Pizza Steve. <a href=\"https:\/\/sketchfab.com\/3d-models\/pizzasteve-3a21b648c47b43caa3b05f7eb9146bbc\">https:\/\/sketchfab.com\/3d-models\/pizzasteve-3a21b648c47b43caa3b05f7eb9146bbc<\/a><br><br>Unity Technologies. (s.f.). Construcci\u00f3n de NavMesh.<a href=\" https:\/\/docs.unity3d.com\/es\/2019.4\/Manual\/nav-BuildingNavMesh.html\"> https:\/\/docs.unity3d.com\/es\/2019.4\/Manual\/nav-BuildingNavMesh.html<\/a><br><br>Microsoft. (s.f.). Uso del emulador de HoloLens.<a href=\"https:\/\/learn.microsoft.com\/en-us\/windows\/mixed-reality\/develop\/advanced-concepts\/using-the-hololens-emulator\">https:\/\/learn.microsoft.com\/en-us\/windows\/mixed-reality\/develop\/advanced-concepts\/using-the-hololens-emulator<\/a><br><br>Xataka. (2023). Microsoft abandona las HoloLens: Es como decirles a Meta y a Apple que invertir en realidad aumentada es un error. <a href=\"https:\/\/www.xataka.com\/realidad-virtual-aumentada\/microsoft-abandona-hololens-como-decirles-a-meta-a-apple-que-invertir-realidad-aumentada-error\">https:\/\/www.xataka.com\/realidad-virtual-aumentada\/microsoft-abandona-hololens-como-decirles-a-meta-a-apple-que-invertir-realidad-aumentada-error<\/a><br><br>Meta. (s.f.). Drop Dead: The Cabin. Recuperado de <a href=\"https:\/\/www.meta.com\/es-es\/experiences\/drop-dead-the-cabin\/4691479430874595\">https:\/\/www.meta.com\/es-es\/experiences\/drop-dead-the-cabin\/4691479430874595<\/a><br><br>Unity. (2017, 10 de abril). Unity NavMesh Tutorial - Basics [Video]. YouTube. <a href=\"https:\/\/www.youtube.com\/watch?v=CHV1ymlw-P8\">https:\/\/www.youtube.com\/watch?v=CHV1ymlw-P8<\/a><br><br>Microsoft. (2016, 28 de marzo). Microsoft HoloLens Emulator Tutorial: Step-by-Step Guide and Demo [Video]. YouTube. <a href=\"https:\/\/www.youtube.com\/watch?v=0ImaZ_Aqe3I\">https:\/\/www.youtube.com\/watch?v=0ImaZ_Aqe3I<\/a><br><br>Maria Jose Blanco Castillo. (23 de mayo 2023).Productividad con HoloLens 2: Una mirada a la realidad mixta.<a href=\"https:\/\/niixer.com\/index.php\/2023\/05\/23\/productividad-con-hololens-2-una-mirada-a-la-realidad-mixta\/\">https:\/\/niixer.com\/index.php\/2023\/05\/23\/productividad-con-hololens-2-una-mirada-a-la-realidad-mixta\/<\/a><br><br>Sebastian ovallos. (3 de marzo 2023).Unity 101 o c\u00f3mo hacer videojuegos de forma f\u00e1cil . <a href=\"https:\/\/niixer.com\/index.php\/2024\/03\/03\/unity-desde-cero\/\">https:\/\/niixer.com\/index.php\/2024\/03\/03\/unity-desde-cero\/<\/a><br><br>Sebastian alberto garcia. (21 de marzo 2023). Red Dead Redemption: Un Hito en el Desarrollo de Videojuegos y su Impacto en Mi Infancia. <a href=\"https:\/\/niixer.com\/index.php\/2025\/03\/21\/red-dead-redemption-un-hito-en-el-desarrollo-de-videojuegos-y-su-impacto-en-mi-infancia\/\">https:\/\/niixer.com\/index.php\/2025\/03\/21\/red-dead-redemption-un-hito-en-el-desarrollo-de-videojuegos-y-su-impacto-en-mi-infancia\/<\/a><br><br>luis mateo mendez pinzon. (12 de abril 2025.Renderizado realista de utilizando blender <a href=\"https:\/\/niixer.com\/index.php\/2025\/04\/12\/renderizado-realista-de-utilizando-blender\/\">https:\/\/niixer.com\/index.php\/2025\/04\/12\/renderizado-realista-de-utilizando-blender\/<\/a><br><br><br>juan esteban lugo (8 de abril 2025. Animaci\u00f3n de Avatares 3D: Una gu\u00eda pr\u00e1ctica con Ready Player Me, Mixamo y Blender.<a href=\"https:\/\/niixer.com\/index.php\/2025\/04\/08\/animacion-de-avatares-3d-una-guia-practica-con-ready-player-me-mixamo-y-blender\/\">https:\/\/niixer.com\/index.php\/2025\/04\/08\/animacion-de-avatares-3d-una-guia-practica-con-ready-player-me-mixamo-y-blender\/<\/a><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfC\u00f3mo se Desarrollo un videojuego en Realidad Mixta con Unity? Este art\u00edculo presenta el desarrollo de un videojuego de disparos en realidad mixta (MR) dise\u00f1ado para las gafas Microsoft HoloLens 1. El juego se compone de tres niveles con dificultad progresiva, integrando elementos de inteligencia artificial, interacci\u00f3n espacial, y dise\u00f1oSeguir Leyendo<\/p>\n","protected":false},"author":1922,"featured_media":67452,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[1944,3941,36,30,76,4231],"tags":[32,412,81,31,214,66],"class_list":["post-67284","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-3d","category-ia","category-inteligencia-artificial","category-niixer","category-realidad-mixta","category-sketchfab","tag-inteligencia-artificial","tag-realidad-mixta","tag-realidad-virtual","tag-tecnologia","tag-unity","tag-videojuegos"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Desarrollo videojuego en Realidad Mixta con Unity<\/title>\n<meta name=\"description\" content=\"Desarrollo videojuego en Realidad Mixta con Unity, crear dise\u00f1os profesionales en tu portafolio t\u00e9cnicas, herramientas y consejos.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/niixer.com\/index.php\/2025\/05\/24\/desarrollo-videojuego-en-realidad-mixta-con-unity-e-inteligencia-artificial\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Desarrollo videojuego en Realidad Mixta con Unity\" \/>\n<meta property=\"og:description\" content=\"Desarrollo videojuego en Realidad Mixta con Unity, crear dise\u00f1os profesionales en tu portafolio t\u00e9cnicas, herramientas y consejos.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/niixer.com\/index.php\/2025\/05\/24\/desarrollo-videojuego-en-realidad-mixta-con-unity-e-inteligencia-artificial\/\" \/>\n<meta property=\"og:site_name\" content=\"Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/niixer\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-05-24T09:09:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-05-26T19:35:11+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-16-at-9.21.32-AM-e1748077832502.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"536\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Luis Mateo Mendez Pinzon\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Luis Mateo Mendez Pinzon\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"24 minutos\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Desarrollo videojuego en Realidad Mixta con Unity","description":"Desarrollo videojuego en Realidad Mixta con Unity, crear dise\u00f1os profesionales en tu portafolio t\u00e9cnicas, herramientas y consejos.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/niixer.com\/index.php\/2025\/05\/24\/desarrollo-videojuego-en-realidad-mixta-con-unity-e-inteligencia-artificial\/","og_locale":"es_ES","og_type":"article","og_title":"Desarrollo videojuego en Realidad Mixta con Unity","og_description":"Desarrollo videojuego en Realidad Mixta con Unity, crear dise\u00f1os profesionales en tu portafolio t\u00e9cnicas, herramientas y consejos.","og_url":"https:\/\/niixer.com\/index.php\/2025\/05\/24\/desarrollo-videojuego-en-realidad-mixta-con-unity-e-inteligencia-artificial\/","og_site_name":"Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos","article_publisher":"https:\/\/www.facebook.com\/niixer\/","article_published_time":"2025-05-24T09:09:00+00:00","article_modified_time":"2025-05-26T19:35:11+00:00","og_image":[{"width":1024,"height":536,"url":"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-16-at-9.21.32-AM-e1748077832502.jpeg","type":"image\/jpeg"}],"author":"Luis Mateo Mendez Pinzon","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Luis Mateo Mendez Pinzon","Tiempo de lectura":"24 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/niixer.com\/index.php\/2025\/05\/24\/desarrollo-videojuego-en-realidad-mixta-con-unity-e-inteligencia-artificial\/#article","isPartOf":{"@id":"https:\/\/niixer.com\/index.php\/2025\/05\/24\/desarrollo-videojuego-en-realidad-mixta-con-unity-e-inteligencia-artificial\/"},"author":{"name":"Luis Mateo Mendez Pinzon","@id":"https:\/\/niixer.com\/#\/schema\/person\/18cb961bf9eb206365013b7b60c3574f"},"headline":"Desarrollo de un videojuego en Realidad Mixta con Unity e Inteligencia Artificial","datePublished":"2025-05-24T09:09:00+00:00","dateModified":"2025-05-26T19:35:11+00:00","mainEntityOfPage":{"@id":"https:\/\/niixer.com\/index.php\/2025\/05\/24\/desarrollo-videojuego-en-realidad-mixta-con-unity-e-inteligencia-artificial\/"},"wordCount":4218,"publisher":{"@id":"https:\/\/niixer.com\/#organization"},"image":{"@id":"https:\/\/niixer.com\/index.php\/2025\/05\/24\/desarrollo-videojuego-en-realidad-mixta-con-unity-e-inteligencia-artificial\/#primaryimage"},"thumbnailUrl":"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-16-at-9.21.32-AM-e1748077832502.jpeg","keywords":["Inteligencia Artificial","Realidad Mixta","Realidad Virtual","tecnolog\u00eda","Unity","Videojuegos"],"articleSection":["3D","IA","Inteligencia Artificial","Niixer","Realidad Mixta","Sketchfab"],"inLanguage":"es"},{"@type":"WebPage","@id":"https:\/\/niixer.com\/index.php\/2025\/05\/24\/desarrollo-videojuego-en-realidad-mixta-con-unity-e-inteligencia-artificial\/","url":"https:\/\/niixer.com\/index.php\/2025\/05\/24\/desarrollo-videojuego-en-realidad-mixta-con-unity-e-inteligencia-artificial\/","name":"Desarrollo videojuego en Realidad Mixta con Unity","isPartOf":{"@id":"https:\/\/niixer.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/niixer.com\/index.php\/2025\/05\/24\/desarrollo-videojuego-en-realidad-mixta-con-unity-e-inteligencia-artificial\/#primaryimage"},"image":{"@id":"https:\/\/niixer.com\/index.php\/2025\/05\/24\/desarrollo-videojuego-en-realidad-mixta-con-unity-e-inteligencia-artificial\/#primaryimage"},"thumbnailUrl":"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-16-at-9.21.32-AM-e1748077832502.jpeg","datePublished":"2025-05-24T09:09:00+00:00","dateModified":"2025-05-26T19:35:11+00:00","description":"Desarrollo videojuego en Realidad Mixta con Unity, crear dise\u00f1os profesionales en tu portafolio t\u00e9cnicas, herramientas y consejos.","breadcrumb":{"@id":"https:\/\/niixer.com\/index.php\/2025\/05\/24\/desarrollo-videojuego-en-realidad-mixta-con-unity-e-inteligencia-artificial\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/niixer.com\/index.php\/2025\/05\/24\/desarrollo-videojuego-en-realidad-mixta-con-unity-e-inteligencia-artificial\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/niixer.com\/index.php\/2025\/05\/24\/desarrollo-videojuego-en-realidad-mixta-con-unity-e-inteligencia-artificial\/#primaryimage","url":"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-16-at-9.21.32-AM-e1748077832502.jpeg","contentUrl":"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-16-at-9.21.32-AM-e1748077832502.jpeg","width":1024,"height":536,"caption":"'portada del videojuego"},{"@type":"BreadcrumbList","@id":"https:\/\/niixer.com\/index.php\/2025\/05\/24\/desarrollo-videojuego-en-realidad-mixta-con-unity-e-inteligencia-artificial\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/niixer.com\/"},{"@type":"ListItem","position":2,"name":"Desarrollo de un videojuego en Realidad Mixta con Unity e Inteligencia Artificial"}]},{"@type":"WebSite","@id":"https:\/\/niixer.com\/#website","url":"https:\/\/niixer.com\/","name":"Portal de noticias de tecnolog\u00eda, ciencia, Android, iOS, Realidad Virtual, Aumentada y Mixta, Videojuegos, computadores, todo lo mas reciente en tecnolog\u00eda","description":"Portal de noticias de tecnolog\u00eda","publisher":{"@id":"https:\/\/niixer.com\/#organization"},"alternateName":"Niixer","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/niixer.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/niixer.com\/#organization","name":"Niixer","alternateName":"Niixer.com","url":"https:\/\/niixer.com\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/niixer.com\/#\/schema\/logo\/image\/","url":"https:\/\/niixer.com\/wp-content\/uploads\/2022\/08\/logo-niixer-sin-fondo-1.png","contentUrl":"https:\/\/niixer.com\/wp-content\/uploads\/2022\/08\/logo-niixer-sin-fondo-1.png","width":140,"height":140,"caption":"Niixer"},"image":{"@id":"https:\/\/niixer.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/niixer\/","https:\/\/www.instagram.com\/niixer.tecnologia\/"]},{"@type":"Person","@id":"https:\/\/niixer.com\/#\/schema\/person\/18cb961bf9eb206365013b7b60c3574f","name":"Luis Mateo Mendez Pinzon","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/72da3d139c01ae74558aed73d262582e47106b41a2a44ffa54c1f6a17cd84e1f?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/72da3d139c01ae74558aed73d262582e47106b41a2a44ffa54c1f6a17cd84e1f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/72da3d139c01ae74558aed73d262582e47106b41a2a44ffa54c1f6a17cd84e1f?s=96&d=mm&r=g","caption":"Luis Mateo Mendez Pinzon"},"sameAs":["http:\/\/www.niixer.com"],"url":"https:\/\/niixer.com\/index.php\/author\/lmendezp2\/"}]}},"jetpack_featured_media_url":"https:\/\/niixer.com\/wp-content\/uploads\/2025\/05\/WhatsApp-Image-2025-05-16-at-9.21.32-AM-e1748077832502.jpeg","_links":{"self":[{"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/posts\/67284","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/users\/1922"}],"replies":[{"embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/comments?post=67284"}],"version-history":[{"count":16,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/posts\/67284\/revisions"}],"predecessor-version":[{"id":67658,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/posts\/67284\/revisions\/67658"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/media\/67452"}],"wp:attachment":[{"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/media?parent=67284"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/categories?post=67284"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/tags?post=67284"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}