{"id":74467,"date":"2025-11-28T11:16:09","date_gmt":"2025-11-28T16:16:09","guid":{"rendered":"https:\/\/niixer.com\/?p=74467"},"modified":"2025-11-28T21:07:40","modified_gmt":"2025-11-29T02:07:40","slug":"susurros-un-videojuego-3d-desarrollado-en-unity","status":"publish","type":"post","link":"https:\/\/niixer.com\/index.php\/2025\/11\/28\/susurros-un-videojuego-3d-desarrollado-en-unity\/","title":{"rendered":"&#8220;Susurros&#8221; un videojuego 3D desarrollado en Unity"},"content":{"rendered":"\n<p>Los videojuegos han dejado de ser \u00fanicamente una forma de entretenimiento para convertirse en poderosas herramientas educativas que permiten aprender de manera interactiva y divertida. <a href=\"https:\/\/unity.com\/es\">Unity<\/a>, una plataforma de creaci\u00f3n de videojuegos ampliamente utilizada en todo el mundo, ofrece la oportunidad de desarrollar experiencias educativas que combinan diversi\u00f3n y aprendizaje de forma natural. <\/p>\n\n\n\n<p>Este art\u00edculo relata el proceso de creaci\u00f3n de un videojuego acad\u00e9mico, desde las primeras ideas hasta el producto final, mostrando c\u00f3mo es posible transformar conceptos educativos en una experiencia que motive y enganche a los estudiantes. A lo largo de este recorrido, descubriremos que crear un videojuego educativo no solo permite ense\u00f1ar contenidos espec\u00edficos, sino que tambi\u00e9n desarrolla habilidades de resoluci\u00f3n de problemas, creatividad y trabajo en equipo.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>DISE\u00d1O DE MEN\u00daS CON ESCENAS<\/strong><\/h2>\n\n\n\n<p>La primera etapa del dise\u00f1o del videojuego se centra en la creaci\u00f3n e implementaci\u00f3n de la parte visual, especialmente de los <strong>men\u00fas interactivos<\/strong>. Estos permiten al usuario navegar por el sistema y acceder a funciones esenciales como el ajuste de volumen y brillo, la visualizaci\u00f3n de la barra de vida, el inventario, y la interacci\u00f3n con di\u00e1logos de NPCs, entre otros elementos clave para la experiencia de juego.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Escena de Inicio<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"502\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1827-1024x502.png\" alt=\"\" class=\"wp-image-76266\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1827-1024x502.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1827-300x147.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1827-768x377.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1827-1536x754.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1827.png 1918w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>Script utilizado<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">using UnityEngine;<br>using UnityEngine.SceneManagement;<br>using UnityEngine.EventSystems;<br><br>public class PanelClickToChangeScene : MonoBehaviour, IPointerClickHandler<br>{<br>    public string sceneName;  \/\/ Nombre de la escena<br><br>    public void OnPointerClick(PointerEventData eventData)<br>    {<br>        SceneManager.LoadScene(sceneName);<br>    }<br>}<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"484\" height=\"132\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1825.png\" alt=\"\" class=\"wp-image-76263\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1825.png 484w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1825-300x82.png 300w\" sizes=\"auto, (max-width: 484px) 100vw, 484px\" \/><\/figure>\n\n\n\n<p>Se agrega el script en el canvas escribiendo la escena que el sistema debe mostrar apenas se de click a la pantalla<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"303\" height=\"222\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1826.png\" alt=\"\" class=\"wp-image-76264\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1826.png 303w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1826-300x220.png 300w\" sizes=\"auto, (max-width: 303px) 100vw, 303px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Escena de Men\u00fa principal<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"648\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/Captura-de-pantalla-2025-11-16-115307-1024x648.png\" alt=\"\" class=\"wp-image-76047\" style=\"width:520px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/Captura-de-pantalla-2025-11-16-115307-1024x648.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/Captura-de-pantalla-2025-11-16-115307-300x190.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/Captura-de-pantalla-2025-11-16-115307-768x486.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/Captura-de-pantalla-2025-11-16-115307-1536x972.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/Captura-de-pantalla-2025-11-16-115307.png 1607w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Para el fondo del <strong>men\u00fa principal<\/strong>, se cre\u00f3 una animaci\u00f3n en <strong>Blender<\/strong> utilizando un escenario previamente desarrollado: una casa inspirada en la pel\u00edcula <em>Monster House<\/em> y en referencias tomadas de la aplicaci\u00f3n Randomn\u00e1utica. La animaci\u00f3n se realiz\u00f3 utilizando el <strong>Timeline<\/strong> de Blender, donde, a trav\u00e9s de <strong>keyframes<\/strong>, se gener\u00f3 una secuencia de movimientos que aportan dinamismo y ambientaci\u00f3n a la escena.<\/p>\n\n\n\n<p>Una vez finalizada la animaci\u00f3n se export\u00f3 en un formato compatible para que el motor <strong>Unity<\/strong> pudiera reconocer y reproducir correctamente el video dentro del men\u00fa principal.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"357\" height=\"764\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/Captura-de-pantalla-2025-11-16-114236.png\" alt=\"\" class=\"wp-image-76092\" style=\"width:183px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/Captura-de-pantalla-2025-11-16-114236.png 357w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/Captura-de-pantalla-2025-11-16-114236-140x300.png 140w\" sizes=\"auto, (max-width: 357px) 100vw, 357px\" \/><figcaption class=\"wp-element-caption\">Formato de v\u00eddeo para Unity<\/figcaption><\/figure>\n\n\n\n<p>Luego, para integrar el video en <strong>Unity<\/strong>, se import\u00f3 el archivo a una carpeta del proyecto con el fin de mantener una organizaci\u00f3n adecuada. Para utilizarlo como fondo dentro del <strong>Canvas<\/strong> y asegurar su reproducci\u00f3n al iniciar la escena, se a\u00f1adi\u00f3 un componente <strong>\u201cRaw Image\u201d<\/strong> en la jerarqu\u00eda. Posteriormente, en la carpeta donde se encontraba el video, se cre\u00f3 un <strong>Render Texture<\/strong>, el cual permite proyectar la animaci\u00f3n dentro del elemento de interfaz y visualizarla correctamente en el men\u00fa principal.<\/p>\n\n\n\n<p>Lo siguiente que se realiz\u00f3, fue agregar tres botones los cu\u00e1les representar\u00e1n y tendr\u00e1n la funci\u00f3n de Jugar, Opciones y Salir. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"572\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1814-1024x572.png\" alt=\"\" class=\"wp-image-76234\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1814-1024x572.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1814-300x168.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1814-768x429.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1814.png 1065w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>El jugador al darle click al bot\u00f3n Jugar y al bot\u00f3n de Salir el sistema lo guiar\u00e1 a otras escenas de acuerdo a la selecci\u00f3n, esto se hace por medio de un script de cambio de escena:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">using UnityEngine;<br>using UnityEngine.SceneManagement;<br>using UnityEngine.UI;<br><br>public class SceneLoader : MonoBehaviour <br>{<br>    \/\/ Start is called once before the first execution of Update after the MonoBehaviour is created<br>    public void Jugar()<br>    {<br>        SceneManager.LoadScene(\"ESCOGERPERSONAJE\");<br>    }<br><br>    public void Salir()<br>    {<br>        Debug.Log(\"Salir...\");<br>        Application.Quit();<br><br>    }<br>}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Scripts en el inspector<\/strong><\/h3>\n\n\n\n<p>Se implementa el script en un GameObject vac\u00edo que creamos para que tenga un control de los eventos que definamos atrav\u00e9s de los scripts, como lo son el brillo, la pantalla completa, el volumen y en este caso el evento de escenas. Cuando se da click al bot\u00f3n se vincula el canvas y en la parte derecha llamamos a la funci\u00f3n del script <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"467\" height=\"119\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1812.png\" alt=\"\" class=\"wp-image-76231\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1812.png 467w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1812-300x76.png 300w\" sizes=\"auto, (max-width: 467px) 100vw, 467px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"594\" height=\"358\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1813.png\" alt=\"\" class=\"wp-image-76232\" style=\"width:455px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1813.png 594w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1813-300x181.png 300w\" sizes=\"auto, (max-width: 594px) 100vw, 594px\" \/><\/figure>\n\n\n\n<p><strong>Para el bot\u00f3n de opciones se realiz\u00f3 el siguiente script:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">using UnityEngine;<br>using UnityEngine.SceneManagement;<br><br>public class cambioescenas : MonoBehaviour<br>{<br>    public void IrMenuprincipal()<br>    {<br>        SceneManager.LoadScene(\"MENUPRINCIPAL\");<br>    }<br>    public void IrMenuOpciones()<br>    {<br>        SceneManager.LoadScene(\"MENUOPCIONES\");<br>    }<br>    public void IrTutorialARLYN()<br>    {<br>        SceneManager.LoadScene(\"TUTORIALArlyn\");<br>    }<br>    public void IrTutorialTATIANA()<br>    {<br>        SceneManager.LoadScene(\"TUTORIALTatiana\");<br>    }<br>    public void IrMAPA1()<br>    {<br>        SceneManager.LoadScene(\"MAPA1ARLYN\");<br>    }<br>    public void IrMAPA2()<br>    {<br>        SceneManager.LoadScene(\"MAPA2TATIANA\");<br>    }<br>}<\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"461\" height=\"116\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1815.png\" alt=\"\" class=\"wp-image-76235\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1815.png 461w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1815-300x75.png 300w\" sizes=\"auto, (max-width: 461px) 100vw, 461px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"647\" height=\"437\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1816.png\" alt=\"\" class=\"wp-image-76236\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1816.png 647w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1816-300x203.png 300w\" sizes=\"auto, (max-width: 647px) 100vw, 647px\" \/><\/figure>\n\n\n\n<p>En esta escena, tambi\u00e9n se agrego un <em><strong>audio que act\u00faa de forma global<\/strong><\/em> con el fin de poder escucharlo en otras escenas y poder alterarlo en la escena de Men\u00fa opciones.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"491\" height=\"216\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1818.png\" alt=\"\" class=\"wp-image-76242\" style=\"width:538px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1818.png 491w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1818-300x132.png 300w\" sizes=\"auto, (max-width: 491px) 100vw, 491px\" \/><\/figure>\n\n\n\n<p><strong>El script para ese audio ser\u00eda:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">using UnityEngine;<br>using UnityEngine.SceneManagement;<br><br>public class GlobalMusicManager : MonoBehaviour<br>{<br>    private static GlobalMusicManager instance;<br><br>    [Header(\"Music Source\")]<br>    [SerializeField] private AudioSource musicSource;<br><br>    [Header(\"Scene where music pauses\")]<br>    [SerializeField] private string gameplaySceneName = \"ESCOGERPERSONAJE\";<br><br>    private void Awake()<br>    {<br>        if (instance != null)<br>        {<br>            Destroy(gameObject);<br>            return;<br>        }<br><br>        instance = this;<br>        DontDestroyOnLoad(gameObject);<br><br>        if (musicSource == null)<br>            musicSource = GetComponent&lt;AudioSource&gt;();<br>    }<br><br>    private void OnEnable()<br>    {<br>        SceneManager.sceneLoaded += OnSceneLoaded;<br>    }<br><br>    private void OnDisable()<br>    {<br>        SceneManager.sceneLoaded -= OnSceneLoaded;<br>    }<br><br>    private void OnSceneLoaded(Scene scene, LoadSceneMode mode)<br>    {<br>        if (musicSource == null) return;<br><br>        if (scene.name == gameplaySceneName)<br>            musicSource.Stop();<br>        else<br>            musicSource.UnPause();<br>    }<br>}<\/pre>\n\n\n\n<p>Tambi\u00e9n se agrego un <em><strong>un brillo como forma global<\/strong><\/em> con el fin de poder cambiarlo y que se aplique en otras escenas.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"489\" height=\"127\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1830.png\" alt=\"\" class=\"wp-image-76269\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1830.png 489w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1830-300x78.png 300w\" sizes=\"auto, (max-width: 489px) 100vw, 489px\" \/><\/figure>\n\n\n\n<p><strong>El script para ese audio ser\u00eda:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">using UnityEngine;<br>using UnityEngine.UI;<br>using UnityEngine.SceneManagement; <br>using System.Collections;<br><br>public class BrilloGlobalManager : MonoBehaviour<br>{<br>    public static BrilloGlobalManager instance;<br><br><br>    private Image panelBrilloGlobal;<br><br>    public float suavizadoVelocidad = 0.5f;<br>    private Coroutine brilloCoroutine;<br><br>    private void Awake()<br>    {<br>        if (instance != null)<br>        {<br>            Destroy(gameObject);<br>            return;<br>        }<br><br>        instance = this;<br>        DontDestroyOnLoad(gameObject);<br><br>     <br>        SceneManager.sceneLoaded += OnSceneLoaded;<br>    }<br><br>    private void OnDestroy()<br>    {<br>        <br>        SceneManager.sceneLoaded -= OnSceneLoaded;<br>    }<br><br>    private void OnSceneLoaded(Scene scene, LoadSceneMode mode)<br>    {<br>       <br>        GameObject panelObj = GameObject.Find(\"PanelBrillo\");<br>        if (panelObj != null)<br>        {<br>            panelBrilloGlobal = panelObj.GetComponent&lt;Image&gt;();<br>           <br>            float savedValue = PlayerPrefs.GetFloat(\"brillo\", 0.5f);<br>            ApplyBrightness(savedValue);<br>        }<br>    }<br><br>    private void Start()<br>    {<br>    <br>    }<br><br>    public void ApplyBrightness(float alpha)<br>    {<br>        if (panelBrilloGlobal != null)<br>        {<br>            Color c = panelBrilloGlobal.color;<br>            c.a = alpha;<br>            panelBrilloGlobal.color = c;<br>          <br>            PlayerPrefs.SetFloat(\"brillo\", alpha);<br>            PlayerPrefs.Save();<br>        }<br>    }<br><br><br>    IEnumerator SuavizarBrilloCoroutine(float targetAlpha)<br>    {<br>       <br>        yield return null;<br><br>     <br>        Color final = panelBrilloGlobal.color;<br>        final.a = targetAlpha;<br>        panelBrilloGlobal.color = final;<br>        PlayerPrefs.SetFloat(\"brillo\", targetAlpha);<br>        PlayerPrefs.Save();<br>    }<br>}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Escena Men\u00fa de Opciones<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"575\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1817-1024x575.png\" alt=\"\" class=\"wp-image-76238\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1817-1024x575.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1817-300x169.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1817-768x432.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1817.png 1057w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Pantalla Completa<\/strong><\/h4>\n\n\n\n<p>Para esta escena se a\u00f1adi\u00f3 un <strong>Toggle<\/strong>, utilizado como elemento interactivo para activar o desactivar una opci\u00f3n en este caso si dejar el juego con pantalla completa o en modo ventana. Se crea un GameObject vac\u00edo que nos permitir\u00e1 controlar los script de las escena, por lo tanto el script que nos permite modificar esa configuraci\u00f3n de pantalla es el siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">using UnityEngine;<br>using UnityEngine.UI;<br><br>public class Pantallacompleta : MonoBehaviour {<br><br>    public Toggle toggle;<br><br>    void Start()<br>    {<br>        if(Screen.fullScreen)<br>        {<br>            toggle.isOn = true;<br>        }<br>        else<br>        {<br>            toggle.isOn = false;<br>        }<br>    }<br><br>    void Update()<br>    {<br><br>    }<br><br>    public void ActivarPantallaCompleta(bool pantallaCompleta)<br>    {<br>        Screen.fullScreen = pantallaCompleta;<br>    }<br>    <br>}<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Volumen y Brillo<\/strong><\/h4>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"312\" height=\"514\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1829.png\" alt=\"\" class=\"wp-image-76268\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1829.png 312w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1829-182x300.png 182w\" sizes=\"auto, (max-width: 312px) 100vw, 312px\" \/><\/figure>\n\n\n\n<p>Para que el jugador pueda alterar lo que esl brillo y el volumen, se agregaron dos sliders en el canvas, cada uno se centra alrededor de la imagen de fondo y se vinculan los respectivos scripts que permiten al usuario alterar el slider de volumen teniendo en cuenta el audio global que anteriormente se defini\u00f3.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"488\" height=\"279\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1842.png\" alt=\"\" class=\"wp-image-76304\" style=\"width:304px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1842.png 488w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1842-300x172.png 300w\" sizes=\"auto, (max-width: 488px) 100vw, 488px\" \/><\/figure>\n\n\n\n<p>En el caso del brillo se crea otro panel el cual mostrar\u00e1 el efecto del script &#8220;Brillo&#8221; y se vinculan los par\u00e1metros que se establecieron en el c\u00f3digo como lo son:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Slider: <\/strong>Ser\u00eda el slider que agregamos al canvas donde se alterar\u00e1 el brillo.<\/li>\n\n\n\n<li><strong>Slider Value:<\/strong> guardar\u00e1 el valor del slider de acuerdo a la modificaci\u00f3n del jugador.<\/li>\n\n\n\n<li><strong>Panel Brillo:<\/strong> Se vincula el panel que anteriormente creamos para ver los cambios del brillo al momento de cambiar el valor del slider del brillo.<\/li>\n\n\n\n<li><strong>Suavizado Velocidad: <\/strong>Permite que el cambio de brillo no sea brusco para el jugador.<\/li>\n<\/ul>\n\n\n\n<p><strong>Script para cambia el volumen<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">using UnityEngine;<br>using UnityEngine.Audio;<br>using UnityEngine.UI;<br>public class volumen : MonoBehaviour<br>{<br>    [SerializeField] private AudioMixer audioMixer;<br>    public void CambiarVolumen(float volumen)<br>    {<br>        audioMixer.SetFloat(\"Volumen\",volumen);<br>    }<br>}<\/pre>\n\n\n\n<p><strong>Script para cambiar el brillo con el slider<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">using UnityEngine;<br>using UnityEngine.UI;<br>using System.Collections; <br><br>public class brillo : MonoBehaviour<br>{<br>    public Slider slider;<br>    public float sliderValue;<br>    public Image panelBrillo;<br><br>    public float suavizadoVelocidad = 0.5f;<br>    private Coroutine brilloCoroutine; <br><br>    void Start()<br>    {<br>      <br>        sliderValue = PlayerPrefs.GetFloat(\"brillo\", 0.5f);<br>        slider.value = sliderValue;<br><br>    <br>        panelBrillo.color = new Color(panelBrillo.color.r, panelBrillo.color.g, panelBrillo.color.b, sliderValue);<br>    }<br><br>    public void ChangeSlider(float valor)<br>    {<br>       <br>        sliderValue = valor;<br>        panelBrillo.color = new Color(panelBrillo.color.r, panelBrillo.color.g, panelBrillo.color.b, valor);<br><br>       <br>        PlayerPrefs.SetFloat(\"brillo\", sliderValue);<br><br>        <br>    }<br><br>    public void IniciarSuavizado()<br>    {<br>        if (brilloCoroutine != null)<br>        {<br>            StopCoroutine(brilloCoroutine);<br>        }<br>        brilloCoroutine = StartCoroutine(SuavizarBrillo(sliderValue));<br>    }<br><br>    IEnumerator SuavizarBrillo(float targetAlpha)<br>    {<br>        float currentAlpha = panelBrillo.color.a;<br>        float time = 0f;<br><br>        while (time &lt; 1f)<br>        {<br>            time += Time.deltaTime \/ suavizadoVelocidad;<br>            float newAlpha = Mathf.Lerp(currentAlpha, targetAlpha, time);<br><br>         <br>            panelBrillo.color = new Color(<br>                panelBrillo.color.r,<br>                panelBrillo.color.g,<br>                panelBrillo.color.b,<br>                newAlpha<br>            );<br>            yield return null;<br>        }<br><br>        panelBrillo.color = new Color(panelBrillo.color.r, panelBrillo.color.g, panelBrillo.color.b, targetAlpha);<br>    }<br>}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Escena de selecci\u00f3n de personajes <\/strong><\/h3>\n\n\n\n<p>Para la escena de <strong>Selecci\u00f3n de personajes<\/strong>, el primer paso que se realiz\u00f3 fu\u00e9 incorporar un <strong>Canvas<\/strong> dentro del proyecto. Una vez creado el Canvas, se a\u00f1adi\u00f3 un <strong>Panel<\/strong> cuya funci\u00f3n principal es servir como contenedor visual. Sobre este panel se integr\u00f3 una <strong>imagen de fondo<\/strong>, lo que contribuye a mantener coherencia est\u00e9tica y fluidez en la experiencia visual entre las distintas escenas del videojuego.<\/p>\n\n\n\n<p>Posteriormente, se incluyeron dos componentes <strong>\u201cImage (UI Image)\u201d<\/strong>, los cuales forman parte de la interfaz gr\u00e1fica. Estos permiten mostrar elementos adicionales como ilustraciones, marcos o decoraciones relacionadas con la selecci\u00f3n de personaje. Su correcta disposici\u00f3n y jerarqu\u00eda dentro del Canvas garantizan una interfaz intuitiva y agradable para el jugador.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"500\" data-id=\"74862\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/tati1-1.png\" alt=\"\" class=\"wp-image-74862\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/tati1-1.png 500w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/tati1-1-300x300.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/tati1-1-150x150.png 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"500\" height=\"500\" data-id=\"74863\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/tati2.png\" alt=\"\" class=\"wp-image-74863\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/tati2.png 500w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/tati2-300x300.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/tati2-150x150.png 150w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/figure>\n<\/figure>\n\n\n\n<p>Las im\u00e1genes de cada personaje fueron creadas en <strong>Krita<\/strong>, tomando como base los modelos 3D generados en <strong>Avaturn<\/strong>. Para que el jugador pudiera elegir un personaje y cargarlo en la siguiente escena, se a\u00f1adieron <strong>dos botones<\/strong> debajo de cada ilustraci\u00f3n. A estos botones se les ajust\u00f3 el color del estado <strong>\u201cHighlighted\u201d<\/strong> para indicar visualmente cuando el cursor est\u00e1 sobre ellos.<\/p>\n\n\n\n<p>Adem\u00e1s, se cre\u00f3 un script llamado <strong>\u201cCambioDeEscenas\u201d<\/strong>, encargado de registrar la elecci\u00f3n del jugador y cargar la escena correspondiente con el personaje seleccionado.<\/p>\n\n\n\n<p>Este script se llama en el inspector de cada bot\u00f3n en la parte de cuando ocurre la acci\u00f3n de &#8220;Click&#8221; se active el script y as\u00ed el sistema gu\u00eda al usuario de acuerdo a la escena especificada. Para mayor facilidad, creamos dos mapas de tutorial, uno para el personaje &#8220;Arlyn&#8221; y otro para el personaje &#8220;Tatiana&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"548\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/WhatsApp-Image-2025-11-19-at-9.39.02-AM-1024x548.jpeg\" alt=\"\" class=\"wp-image-76039\" style=\"width:536px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/WhatsApp-Image-2025-11-19-at-9.39.02-AM-1024x548.jpeg 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/WhatsApp-Image-2025-11-19-at-9.39.02-AM-300x161.jpeg 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/WhatsApp-Image-2025-11-19-at-9.39.02-AM-768x411.jpeg 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/WhatsApp-Image-2025-11-19-at-9.39.02-AM-1536x822.jpeg 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/WhatsApp-Image-2025-11-19-at-9.39.02-AM.jpeg 1600w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\"><em>Imagen de la escena&#8221;Escoger Personaje&#8221; en desarrollo en el motor Unity<\/em><\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Escena Mapa 1 &#8220;Tutorial&#8221;<\/strong><\/h2>\n\n\n\n<p>Para esta escena, se configura que al iniciar el nivel, el jugador est\u00e1 limitado en su movimiento, ya que el tutorial por medio texto le explicar\u00e1 que tecla debe oprimir para ir completando las solicitudes como:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>W para moverse hacia delante.<\/li>\n\n\n\n<li>S para moverse hacia atr\u00e1s.<\/li>\n\n\n\n<li>A para moverse hacia la izquierda.<\/li>\n\n\n\n<li>D para moverse hacia la derecha.<\/li>\n<\/ul>\n\n\n\n<p>Una vez completadas las anteriores solicitudes el jugador podr\u00e1 moverse libremente por el mapa, sin tener errores de colliders o que tenga una ca\u00edda infinita. <\/p>\n\n\n\n<p><strong>Script Tutorial <\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">using StarterAssets;<br>using System.Collections;<br>using TMPro;<br>using UnityEngine;<br>using UnityEngine.InputSystem;<br><br>public class TutorialJugador : MonoBehaviour<br>{<br>    public TextMeshProUGUI textoInstrucciones;<br>    public AudioSource audioTutorial;<br><br>    public GameObject panelTutorial;<br><br>    private ThirdPersonController thirdPersonController;<br>    private PlayerInput playerInput;<br>    private StarterAssetsInputs starterInputs;<br><br>    private int pasoActual = 0;<br>    private float tiempoPresionado = 0f;<br>    private float tiempoRequerido = 0.5f;<br><br>    \/\/  Para Android (botones)<br>    private bool upPressed, downPressed, leftPressed, rightPressed;<br><br>    void Start()<br>    {<br>        thirdPersonController = FindFirstObjectByType&lt;ThirdPersonController&gt;();<br>        playerInput = thirdPersonController.GetComponent&lt;PlayerInput&gt;();<br>        starterInputs = thirdPersonController.GetComponent&lt;StarterAssetsInputs&gt;();<br><br>        \/\/ Bloquear movimiento normal<br>        playerInput.actions[\"Move\"].Disable();<br>        playerInput.actions[\"Look\"].Disable();<br><br>        MostrarPaso(0);<br><br>        if (audioTutorial != null)<br>            audioTutorial.Play();<br>    }<br><br>    void Update()<br>    {<br>        Vector2 input = Vector2.zero;<br><br>        \/\/ -- PC: teclas WASD --<br>        bool pcUp = Keyboard.current != null &amp;&amp; Keyboard.current.wKey.isPressed;<br>        bool pcDown = Keyboard.current != null &amp;&amp; Keyboard.current.sKey.isPressed;<br>        bool pcLeft = Keyboard.current != null &amp;&amp; Keyboard.current.aKey.isPressed;<br>        bool pcRight = Keyboard.current != null &amp;&amp; Keyboard.current.dKey.isPressed;<br><br>        \/\/ -- ANDROID: Joystick Starter Assets --<br>        Vector2 joystick = starterInputs.move;<br><br>        switch (pasoActual)<br>        {<br>            case 0: \/\/ Avanzar (W \/ \u2191 \/ joystick arriba)<br>                if (pcUp || upPressed || joystick.y &gt; 0.5f)<br>                {<br>                    input = new Vector2(0, 1);<br>                    ContarTiempo();<br>                }<br>                break;<br><br>            case 1: \/\/ Retroceder<br>                if (pcDown || downPressed || joystick.y &lt; -0.5f)<br>                {<br>                    input = new Vector2(0, -1);<br>                    ContarTiempo();<br>                }<br>                break;<br><br>            case 2: \/\/ Izquierda<br>                if (pcLeft || leftPressed || joystick.x &lt; -0.5f)<br>                {<br>                    input = new Vector2(-1, 0);<br>                    ContarTiempo();<br>                }<br>                break;<br><br>            case 3: \/\/ Derecha<br>                if (pcRight || rightPressed || joystick.x &gt; 0.5f)<br>                {<br>                    input = new Vector2(1, 0);<br>                    ContarTiempo();<br>                }<br>                break;<br>        }<br><br>        <br>        if (pasoActual &lt; 4)<br>        {<br>            thirdPersonController.useOverrideInput = true;<br>            thirdPersonController.overrideMoveInput = input;<br>        }<br>        else<br>        {<br>           <br>            thirdPersonController.useOverrideInput = false;<br>            playerInput.actions[\"Move\"].Enable();<br>            playerInput.actions[\"Look\"].Enable();<br>        }<br>    }<br><br>    void ContarTiempo()<br>    {<br>        tiempoPresionado += Time.deltaTime;<br><br>        if (tiempoPresionado &gt;= tiempoRequerido)<br>        {<br>            tiempoPresionado = 0;<br>            SiguientePaso();<br>        }<br>    }<br><br>    void MostrarPaso(int paso)<br>    {<br>        switch (paso)<br>        {<br>            case 0: textoInstrucciones.text = \"Presiona W o toca \u2191 para avanzar\"; break;<br>            case 1: textoInstrucciones.text = \"Presiona S o toca \u2193 para retroceder\"; break;<br>            case 2: textoInstrucciones.text = \"Presiona A o toca \u2190 para moverte a la izquierda\"; break;<br>            case 3: textoInstrucciones.text = \"Presiona D o toca \u2192 para moverte a la derecha\"; break;<br>        }<br>    }<br><br>    void SiguientePaso()<br>    {<br>        pasoActual++;<br><br>        if (pasoActual &lt; 4)<br>        {<br>            MostrarPaso(pasoActual);<br>        }<br>        else<br>        {<br>            textoInstrucciones.text =<br>                \"\u00a1Bien hecho! Ahora ac\u00e9rcate a Suzanne e interact\u00faa con ella con E o tocando la pantalla.\";<br><br>            StartCoroutine(CerrarTutorial());<br>        }<br>    }<br><br>    IEnumerator CerrarTutorial()<br>    {<br>        yield return new WaitForSeconds(5f);<br><br>        textoInstrucciones.text = \"\";<br>        panelTutorial.SetActive(false);<br>    }<br><br>    \/\/ ----------- BOTONES PARA ANDROID -------------<br>    public void PressUp(bool pressed) =&gt; upPressed = pressed;<br>    public void PressDown(bool pressed) =&gt; downPressed = pressed;<br>    public void PressLeft(bool pressed) =&gt; leftPressed = pressed;<br>    public void PressRight(bool pressed) =&gt; rightPressed = pressed;<br>}<\/pre>\n\n\n\n<p>Este script toma en cuenta el script de <strong>ThirdPersonController<\/strong> con el fin de que el personaje pueda moverse con las teclas que normalmente conocemos que son W,S,A,D, que nos ofrece un Asset llamado &#8220;<em><strong>Starter Assets : ThirdPerson&#8221; <\/strong><\/em>que descargamos de la Asset Store que nos permite Unity que importamos para el proyecto.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"550\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/escenariotutorial3-1024x550.png\" alt=\"\" class=\"wp-image-76284\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/escenariotutorial3-1024x550.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/escenariotutorial3-300x161.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/escenariotutorial3-768x412.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/escenariotutorial3-1536x825.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/escenariotutorial3.png 1918w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>Integraci\u00f3n de un NPC<\/strong><\/p>\n\n\n\n<p>Lo siguiente en el tutorial es que el jugador pueda interactuar con Suzanne como gu\u00eda, para activar ese evento el jugador debe acercarse a la monita para que se active el pane de interacci\u00f3n con texto incluido, el jugador con la tecla &#8220;E&#8221; puede seguir hablando con el NPC desbloqueando todos sus di\u00e1logos.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"545\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1837-1024x545.png\" alt=\"\" class=\"wp-image-76293\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1837-1024x545.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1837-300x160.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1837-768x409.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1837-1536x818.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1837.png 1919w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>Script que permite al jugador interactuar con el NPC con la tecla &#8220;E&#8221; o tocando la pantalla en caso de android<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">using UnityEngine;<br>using TMPro;<br><br>public class NPCDialogue : MonoBehaviour<br>{<br>    public GameObject dialoguePanel;<br>    public TextMeshProUGUI dialogueText;<br><br>    [TextArea(2, 4)]<br>    public string[] dialogos;<br>    int dialogoActual = 0;<br><br>    bool playerInside;<br><br>    void Start()<br>    {<br>        dialoguePanel.SetActive(false);<br>    }<br><br>    void OnTriggerEnter(Collider other)<br>    {<br>        if (other.CompareTag(\"Player\"))<br>        {<br>            playerInside = true;<br>            dialoguePanel.SetActive(true);<br><br>            dialogoActual = 0;<br>            dialogueText.text = dialogos[dialogoActual];<br>        }<br>    }<br><br>    void OnTriggerExit(Collider other)<br>    {<br>        if (other.CompareTag(\"Player\"))<br>        {<br>            playerInside = false;<br>            dialoguePanel.SetActive(false);<br>        }<br>    }<br><br>    void Update()<br>    {<br>        if (!playerInside) return;<br><br>        \/\/ ------- PC: Tecla E -------<br>        if (Input.GetKeyDown(KeyCode.E))<br>        {<br>            CambiarDialogo();<br>        }<br><br>        \/\/ ------- ANDROID: tocar pantalla -------<br>        if (Input.touchCount &gt; 0)<br>        {<br>            Touch t = Input.GetTouch(0);<br><br>            if (t.phase == TouchPhase.Began)<br>            {<br>                CambiarDialogo();<br>            }<br>        }<br>    }<br><br>    \/\/ Bot\u00f3n extra opcional para Android<br>    public void CambiarDialogoBoton()<br>    {<br>        if (playerInside)<br>        {<br>            CambiarDialogo();<br>        }<br>    }<br><br>    void CambiarDialogo()<br>    {<br>        dialogoActual++;<br><br>        if (dialogoActual &gt;= dialogos.Length)<br>        {<br>            dialogoActual = dialogos.Length - 1;<br>        }<br><br>        dialogueText.text = dialogos[dialogoActual];<br>    }<br>}<\/pre>\n\n\n\n<p>El script permite generar una serie de di\u00e1logos guardados en una lista donde se pueden agregar la cantidad que se requiera y el orden en que se van a mostrar en cada interacci\u00f3n del jugador con el NPC de Suzanne. Adem\u00e1s se agreg\u00f3 un &#8220;Audio Source&#8221; que al iniciar la escena suena lejos pero entre m\u00e1s nos acercamos al npc se escucha m\u00e1s fuerte.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"488\" height=\"816\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1838.png\" alt=\"\" class=\"wp-image-76295\" style=\"width:239px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1838.png 488w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1838-179x300.png 179w\" sizes=\"auto, (max-width: 488px) 100vw, 488px\" \/><\/figure>\n\n\n\n<p><strong>Implementaci\u00f3n de Tutorial<\/strong><\/p>\n\n\n\n<p>Usamos el software de modelado 3D &#8220;Blender&#8221; para el dise\u00f1o del mapa del tutorial, cada pieza como la calle, las cercas, la estaci\u00f3n, se realizaron a partir de primitivas, para esta escena se utilizaron modelos de SketchFab como lo son los faros de luz, el bus y los \u00e1rboles.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"548\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/escenariotutorial-1024x548.webp\" alt=\"\" class=\"wp-image-76423\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/escenariotutorial-1024x548.webp 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/escenariotutorial-300x161.webp 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/escenariotutorial-768x411.webp 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/escenariotutorial-1536x822.webp 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/escenariotutorial.webp 1919w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Una vez definido el modelo en Blender, vamos a quitar componentes como c\u00e1mara y luces, con tal de que al importar el mapa al motor de Unity no ocurre errores ni que la c\u00e1mara se sobreponga con la principal. El modelo se exporta en formato FBX, teniendo en cuenta la cantidad de caras que tenga y la correcci\u00f3n de normales con tal que el jugador pueda visualizar bien los detalles del mapa sin errores ni bugs.<\/p>\n\n\n\n<p>Ya importado el modelo en el motor, el siguiente paso es agregarlo a la escena y poder ajustar su tama\u00f1o a una escala de 1,1,1 esto con el fin de que el juego no consuma muchos recursos al equipo con el cual estamos desarrollando el videojuego. Agregamos los \u00e1rboles y quitamos la luz default que nos ofrece Unity al momento de crear una escena, esto con el fin de que podamos nosotros mismos implementar nuestra porpias luces con el fin de tener el siguiente resultado:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"537\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/bussonido-1024x537.png\" alt=\"\" class=\"wp-image-76382\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/bussonido-1024x537.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/bussonido-300x157.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/bussonido-768x403.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/bussonido-1536x805.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/bussonido-390x205.png 390w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/bussonido.png 1919w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Lo siguiente es agregar al escenario un mesh collider con el objetivo que el personaje a spawnear no sufra una ca\u00edda infinita al vac\u00edo del mapa de Unity.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>SONIDO 3D<\/strong><\/h3>\n\n\n\n<p>Para la escena del tutorial, al bus se le agreg\u00f3 un &#8220;Audio Source&#8221; de un sonido de motor, pero se realizaron unas ciertas configuraciones con tal de que cuando se inicie la escena no se escuche el sonido del bus sino cuando el jugador se acerque al prefab del bus. La configuraciones fueron las siguientes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Spatial Blend dejarlo en 3D<\/li>\n\n\n\n<li>Activar el Play On Awake<\/li>\n\n\n\n<li>Habilitar el Loop para que el sonido no se detenga nunca<\/li>\n\n\n\n<li>Dejamos el volumen en 0.5 para que no se escuche tan fuerte al acercarse al bus<\/li>\n<\/ul>\n\n\n\n<p>Unity ofrece un sistema de <strong>audio espacial 3D<\/strong> que permite simular c\u00f3mo se comporta un sonido en un entorno tridimensional, dependiendo de la distancia entre la fuente sonora y el jugador.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"660\" height=\"728\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1856.png\" alt=\"\" class=\"wp-image-76484\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1856.png 660w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1856-272x300.png 272w\" sizes=\"auto, (max-width: 660px) 100vw, 660px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Implementaci\u00f3n de personajes a las escenas de los mapas<\/strong><\/h2>\n\n\n\n<p>Para la implementaci\u00f3n de un modelo a unity, descargarmos un asstes que nos da como base el esqueleto para que nuestro mu\u00f1eco se puede ver.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"453\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/asset-third-person-1024x453.png\" alt=\"\" class=\"wp-image-76446\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/asset-third-person-1024x453.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/asset-third-person-300x133.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/asset-third-person-768x340.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/asset-third-person-1536x680.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/asset-third-person.png 1919w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Una vez importado nuestro modelo, buscamos el prefab del paquete Starter Assets, le damos click derecho y buscamos la secci\u00f3n &#8220;Prefab&#8221; y le damos a la opcion &#8220;Unpack Completely&#8221;, esto nos permitir\u00e1 poder modificar el prefab sin alterar el original.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"548\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1835-1024x548.png\" alt=\"\" class=\"wp-image-76279\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1835-1024x548.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1835-300x161.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1835-768x411.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1835-1536x822.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1835.png 1919w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Una vez que cuadramos la posici\u00f3n y escala de nuestro modelo, en la parte de jerarqu\u00eda desactivamos el &#8220;Geomtry&#8221; para que no aparezca el modelo default del asset.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"546\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1834-1024x546.png\" alt=\"\" class=\"wp-image-76278\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1834-1024x546.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1834-300x160.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1834-768x409.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1834-1536x819.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1834.png 1919w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Sistema de part\u00edculas para las luciern\u00e1gas<\/strong><\/h2>\n\n\n\n<p>Para recrear el efecto de <strong>luci\u00e9rnagas<\/strong> en la escena, se a\u00f1adi\u00f3 un <strong>Sistema de Part\u00edculas<\/strong> dentro de la jerarqu\u00eda de la escena. Este sistema permite simular peque\u00f1os puntos de luz flotando y movi\u00e9ndose de manera aleatoria.<\/p>\n\n\n\n<p>Una vez incorporado el <strong>Particle System<\/strong>, se ajustaron par\u00e1metros como:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Max Particles: Define la cantidad m\u00e1xima de part\u00edculas que pueden existiar al mismo tiempo.<\/li>\n\n\n\n<li>Size over Lifetime: Permite que el tama\u00f1o de la part\u00edcula cambia a lo largo de su vida, simulando un parpadeo suave.<\/li>\n\n\n\n<li>Shape: Controla la forma y el \u00e1rea desde donde las part\u00edculas son emitidas.<\/li>\n\n\n\n<li>Velocity over Lifetime: Modifica la velocidad de las part\u00edculas a medida que avanzan en su ciclo de vida<\/li>\n\n\n\n<li>Color over Lifetime: Permite que el color de cada part\u00edcula cambie durante su existencia.<\/li>\n\n\n\n<li>Emission: Controla cu\u00e1ntas part\u00edculas se generan por segundo.<\/li>\n\n\n\n<li>Movimiento Aleatorio: Agrega variaci\u00f3n aleatoria en la direcci\u00f3n y velocidad del movimiento.<\/li>\n\n\n\n<li>Play On Awake &#8212; Activado<\/li>\n<\/ul>\n\n\n\n<p>Esto con el fin de obtener part\u00edculas que imitaran el comportamiento natural de las luci\u00e9rnagas. Adem\u00e1s, se habilit\u00f3 un material con brillo suave para que los puntos emitieran una ligera luminosidad, reforzando el efecto visual.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"548\" data-id=\"76130\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/luciernagas-1024x548.png\" alt=\"\" class=\"wp-image-76130\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/luciernagas-1024x548.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/luciernagas-300x161.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/luciernagas-768x411.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/luciernagas-1536x822.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/luciernagas.png 1919w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"600\" data-id=\"76131\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/luciernagas2-1-1024x600.png\" alt=\"\" class=\"wp-image-76131\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/luciernagas2-1-1024x600.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/luciernagas2-1-300x176.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/luciernagas2-1-768x450.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/luciernagas2-1-1536x900.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/luciernagas2-1.png 1719w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Escena Minijuego &#8220;Preguntas de Cultura General&#8221;<\/strong><\/h2>\n\n\n\n<p>Para la escena del minijuego, se dise\u00f1o el mapa desde blender para tener mayor precisi\u00f3n de modelado y b\u00e1sicamente se decidi\u00f3 reutilizar el escenario del tutorial pero en este caso el bus de mover\u00e1 a los largo de la carretera y el minijuego se ejecutar\u00e1 de fondo.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"549\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/animacionbus1-1024x549.png\" alt=\"\" class=\"wp-image-76282\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/animacionbus1-1024x549.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/animacionbus1-300x161.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/animacionbus1-768x412.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/animacionbus1-1536x824.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/animacionbus1.png 1919w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Para eso se importa el modelado teniendo en cuenta y cuidado con las normales para no tener errores de colliders negativos o que el bus no pueda mantener su animaci\u00f3n a lo largo de la carretera.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"611\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1823-1024x611.png\" alt=\"\" class=\"wp-image-76258\" style=\"width:632px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1823-1024x611.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1823-300x179.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1823-768x458.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1823.png 1122w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"550\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/animacionbus3-1024x550.png\" alt=\"\" class=\"wp-image-76281\" style=\"width:622px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/animacionbus3-1024x550.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/animacionbus3-300x161.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/animacionbus3-768x413.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/animacionbus3-1536x825.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/animacionbus3.png 1919w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Para el dise\u00f1o del minijuego, se decidi\u00f3 implementar una mec\u00e1nica de preguntas similar a \u00bfQui\u00e9n quiere ser millonario?, para eso agregamos un canvas, lo siguiente es agregar un panel donde ir\u00e1 el fondo que en este caso ser\u00e1 un celular simulando que el personaje lo est\u00e1 utilizando mientras est\u00e1 viajando.<\/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\/11\/image-1819-1024x541.png\" alt=\"\" class=\"wp-image-76253\" style=\"width:643px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1819-1024x541.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1819-300x158.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1819-768x405.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1819-1536x811.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1819-390x205.png 390w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1819.png 1919w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"321\" height=\"316\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1824.png\" alt=\"\" class=\"wp-image-76259\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1824.png 321w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1824-300x295.png 300w\" sizes=\"auto, (max-width: 321px) 100vw, 321px\" \/><\/figure>\n\n\n\n<p>Para las preguntas, se realiz\u00f3 un script donde mostrar las preguntas en el gameobject de Text Mesh que agregamos en el canvas, esto con el objetivo de actualizar las preguntas.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"484\" height=\"789\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1820.png\" alt=\"\" class=\"wp-image-76254\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1820.png 484w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1820-184x300.png 184w\" sizes=\"auto, (max-width: 484px) 100vw, 484px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"487\" height=\"386\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1821.png\" alt=\"\" class=\"wp-image-76255\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1821.png 487w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1821-300x238.png 300w\" sizes=\"auto, (max-width: 487px) 100vw, 487px\" \/><\/figure>\n\n\n\n<p><strong>SCRIPT Utilizado para el minijuego<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">using UnityEngine;<br>using UnityEngine.UI;<br>using TMPro;<br>using UnityEngine.SceneManagement;<br>using System.Collections;<br><br>public class MiniJuegoPreguntas : MonoBehaviour<br>{<br>    [Header(\"UI\")]<br>    public GameObject panelCelular;<br>    public TextMeshProUGUI txtPregunta;<br>    public TextMeshProUGUI txtPuntaje;<br>    public Button btnSi;<br>    public Button btnNo;<br><br>    [Header(\"Preguntas\")]<br>    [TextArea]<br>    public string[] preguntas;<br>    public bool[] respuestas;<br><br>    [Header(\"Audio por pregunta\")]<br>    public AudioClip[] audiosPreguntas;<br>    public AudioSource audioSource;<br><br>    [Header(\"Sonidos de Respuesta\")]<br>    public AudioClip sonidoCorrecto;      <br>    public AudioClip sonidoIncorrecto;    <br>    public AudioSource audioFX;           <br><br>    private int preguntaActual = 0;<br>    private int puntuacion = 0;<br><br>    [Header(\"Configuraci\u00f3n de Escenas\")]<br>    public string escenaGanar = \"MAPA1ARLYN\";<br>    public string escenaPerder = \"animacionbusarlyn\";<br><br>    void Start()<br>    {<br>        if (panelCelular != null)<br>            panelCelular.SetActive(false);<br><br>        StartCoroutine(MostrarPanelLuego());<br><br>        btnSi.onClick.AddListener(() =&gt; Responder(true));<br>        btnNo.onClick.AddListener(() =&gt; Responder(false));<br>    }<br><br>    IEnumerator MostrarPanelLuego()<br>    {<br>        yield return new WaitForSeconds(12f);<br><br>        panelCelular.SetActive(true);<br>        MostrarPregunta();<br>    }<br><br>    void MostrarPregunta()<br>    {<br>        if (preguntaActual &lt; preguntas.Length)<br>        {<br>            txtPregunta.text = preguntas[preguntaActual];<br>            txtPuntaje.text = \"Puntaje: \" + puntuacion + \"\/5\";<br><br>            Debug.Log(\"Mostrando pregunta #\" + preguntaActual);<br><br>            ReproducirAudioPregunta();<br>        }<br>        else<br>        {<br>            FinalizarJuego();<br>        }<br>    }<br><br>    void ReproducirAudioPregunta()<br>    {<br>        if (audioSource != null &amp;&amp; audiosPreguntas.Length &gt; preguntaActual)<br>        {<br>            audioSource.clip = audiosPreguntas[preguntaActual];<br>            audioSource.Play();<br>        }<br>    }<br><br>    void Responder(bool respuestaJugador)<br>    {<br>        if (preguntaActual &gt;= preguntas.Length)<br>            return;<br><br>        \/\/ RESPUESTA CORRECTA<br>        if (respuestaJugador == respuestas[preguntaActual])<br>        {<br>            puntuacion++;<br>            if (audioFX != null &amp;&amp; sonidoCorrecto != null)<br>                audioFX.PlayOneShot(sonidoCorrecto);<br>        }<br>        else<br>        {<br>            \/\/ RESPUESTA INCORRECTA<br>            if (audioFX != null &amp;&amp; sonidoIncorrecto != null)<br>                audioFX.PlayOneShot(sonidoIncorrecto);<br>        }<br><br>        preguntaActual++;<br>        MostrarPregunta();<br>    }<br><br>    void FinalizarJuego()<br>    {<br>        Debug.Log(\"Puntuaci\u00f3n final = \" + puntuacion);<br><br>        if (puntuacion &gt;= 5)<br>        {<br>            SceneManager.LoadScene(escenaGanar);<br>        }<br>        else<br>        {<br>            SceneManager.LoadScene(escenaPerder);<br>        }<br>    }<br>}<\/pre>\n\n\n\n<p><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Escena Mapa 2 &#8220;Recolecta las monedas&#8221;<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"545\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1831-1024x545.png\" alt=\"\" class=\"wp-image-76271\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1831-1024x545.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1831-300x160.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1831-768x409.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1831-1536x817.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1831.png 1919w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"547\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1839-1024x547.png\" alt=\"\" class=\"wp-image-76299\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1839-1024x547.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1839-300x160.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1839-768x410.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1839-1536x820.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1839.png 1919w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"199\" height=\"132\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1840.png\" alt=\"\" class=\"wp-image-76301\" style=\"width:310px;height:auto\"\/><\/figure>\n\n\n\n<p><strong>Script de inventario del jugador<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">using UnityEngine;<br>using TMPro;<br>using System.Collections.Generic;<br><br>public class PlayerInventory : MonoBehaviour<br>{<br>    [Header(\"Monedas\")]<br>    public int monedasTotales = 0;<br>    public int monedasObjetivo = 10;<br><br>    [Header(\"UI\")]<br>    public TextMeshProUGUI txtMonedas;<br>    public TextMeshProUGUI txtMensajeFinal;<br><br>    [Header(\"UI Llaves (opcional)\")]<br>    public TextMeshProUGUI txtLlaves;    \/\/ \u2190 NUEVO: para ver las llaves en pantalla<br><br>    [Header(\"Llaves\")]<br>    private List&lt;string&gt; llavesObtenidas = new List&lt;string&gt;();<br><br>    void Start()<br>    {<br>        \/\/ Para probar: siempre iniciar con 10 monedas.<br>        ReiniciarMonedas();<br><br>        CargarLlaves();<br>        ActualizarUI();<br>        ActualizarUILlaves();<br><br>        if (txtMensajeFinal != null)<br>            txtMensajeFinal.gameObject.SetActive(false);<br>    }<br><br>    \/\/ ==================== MONEDAS ====================<br>    void ReiniciarMonedas()<br>    {<br>        monedasTotales = 0; <br>        PlayerPrefs.SetInt(\"MonedasTotales\", monedasTotales);<br>        PlayerPrefs.Save();<br>    }<br><br>    public void AgregarMonedas(int cantidad)<br>    {<br>        monedasTotales += cantidad;<br><br>        PlayerPrefs.SetInt(\"MonedasTotales\", monedasTotales);<br>        PlayerPrefs.Save();<br><br>        ActualizarUI();<br><br>        if (monedasTotales &gt;= monedasObjetivo &amp;&amp; txtMensajeFinal != null)<br>        {<br>            txtMensajeFinal.gameObject.SetActive(true);<br>            txtMensajeFinal.text = \"\u00a1Bien hecho!\";<br>        }<br>    }<br><br>    void ActualizarUI()<br>    {<br>        if (txtMonedas != null)<br>            txtMonedas.text = monedasTotales + \"\/\" + monedasObjetivo;<br>    }<br><br>    public void GastarMonedas(int cantidad)<br>    {<br>        monedasTotales -= cantidad;<br>        if (monedasTotales &lt; 0)<br>            monedasTotales = 0;<br><br>        PlayerPrefs.SetInt(\"MonedasTotales\", monedasTotales);<br>        PlayerPrefs.Save();<br><br>        ActualizarUI();<br>    }<br><br>    \/\/ ==================== LLAVES ====================<br>    public void AgregarLlave(string nombreLlave)<br>    {<br>        if (!llavesObtenidas.Contains(nombreLlave))<br>        {<br>            llavesObtenidas.Add(nombreLlave);<br>            GuardarLlaves();<br><br>            Debug.Log(\"Llave agregada: \" + nombreLlave);<br>            Debug.Log(\"Llaves actuales: \" + string.Join(\", \", llavesObtenidas));<br><br>            ActualizarUILlaves();<br>        }<br>        else<br>        {<br>            Debug.Log(\"La llave ya estaba en el inventario: \" + nombreLlave);<br>        }<br>    }<br><br>    public bool TieneLlave(string nombreLlave)<br>    {<br>        return llavesObtenidas.Contains(nombreLlave);<br>    }<br><br>    void GuardarLlaves()<br>    {<br>        foreach (string llave in llavesObtenidas)<br>        {<br>            PlayerPrefs.SetInt(\"Llave_\" + llave, 1);<br>        }<br>        PlayerPrefs.Save();<br>    }<br><br>    void CargarLlaves()<br>    {<br>        string[] llavesExistentes = { \"LlavePuerta\", \"LlaveCofre\", \"LlaveOtra\" };<br><br>        foreach (string llave in llavesExistentes)<br>        {<br>            if (PlayerPrefs.GetInt(\"Llave_\" + llave, 0) == 1)<br>            {<br>                if (!llavesObtenidas.Contains(llave))<br>                    llavesObtenidas.Add(llave);<br>            }<br>        }<br>    }<br><br><br>    void ActualizarUILlaves()<br>    {<br>        if (txtLlaves != null)<br>        {<br>            if (llavesObtenidas.Count == 0)<br>                txtLlaves.text = \"Llaves: (ninguna)\";<br>            else<br>                txtLlaves.text = \"Llaves: \" + string.Join(\", \", llavesObtenidas);<br>        }<br>    }<br>}<br><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Escena Mapa 3 &#8220;Parkour&#8221; <\/strong><\/h3>\n\n\n\n<p>Se cre\u00f3 una nueva escena y se le asign\u00f3 el nombre <strong>\u201c<em>Parkour<\/em>\u201d<\/strong>, de esta forma es m\u00e1s f\u00e1cil identificarla frente a las otras escenas en el momento de la exportaci\u00f3n. Una vez la casa estuvo colocada en la vista <strong><em>Scene<\/em><\/strong>, se agreg\u00f3 un <em><strong>Terrain<\/strong> <\/em>desde la ventana <em><strong>Hierarchy<\/strong> <\/em>para comenzar a construir el entorno que rodear\u00eda la estructura.<\/p>\n\n\n\n<p>Despu\u00e9s de a\u00f1adir el terreno, se ajust\u00f3 su posici\u00f3n para alinearlo correctamente con la casa. Luego, desde el <strong><em>Inspector<\/em><\/strong>, en la ruta <strong><em>Terrain &gt; Terrain Settings &gt; Mesh Resolution (en Terrain Data)<\/em><\/strong>, se modific\u00f3 el tama\u00f1o del terreno para adaptarlo a las dimensiones necesarias del escenario. Con estos cambios, el terreno qued\u00f3 acomodado y acorde a la ubicaci\u00f3n y escala de la casa dentro de la escena.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"550\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1774-1024x550.png\" alt=\"\" class=\"wp-image-76166\" style=\"width:573px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1774-1024x550.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1774-300x161.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1774-768x413.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1774-1536x826.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1774.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Para modificar la estructura del terreno, desde el <strong><em>Inspector<\/em><\/strong>, dentro de la secci\u00f3n <strong><em>Terrain<\/em><\/strong>, se ingres\u00f3 a la opci\u00f3n <strong><em>Paint <\/em><\/strong><em><strong>Terrain<\/strong> <\/em>y se configuraron las propiedades necesarias. Luego se seleccion\u00f3 el pincel correspondiente y se procedi\u00f3 a moldear el terreno seg\u00fan las preferencias del escenario, ajustando alturas y formas conforme a lo requerido.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"550\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1775-1024x550.png\" alt=\"\" class=\"wp-image-76167\" style=\"width:556px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1775-1024x550.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1775-300x161.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1775-768x413.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1775-1536x826.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1775.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Para aplicar una imagen a un terreno en Unity, primero se selecciona el Terrain en el <strong><em>Hierarchy<\/em> <\/strong>y en el Inspector se abre <strong><em>Paint Terrain<\/em> <\/strong>y luego <em><strong>Paint Texture<\/strong><\/em>. Despu\u00e9s se entra a <em><strong>Edit Terrain Layers<\/strong><\/em> y se crea una nueva capa con <em><strong>Create Layer<\/strong><\/em>, eligiendo la imagen que se quiere usar como textura. Unity la aplica de inmediato al terreno, y si se necesita ajustar c\u00f3mo se repite, se modifican los valores de <strong><em>Tiling<\/em> <\/strong>en la <strong><em>Terrain Layer<\/em><\/strong>. Si se quieren usar m\u00e1s texturas, simplemente se vuelve a <em><strong>Paint Texture<\/strong><\/em> y se pinta sobre el suelo.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"550\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1776-1024x550.png\" alt=\"\" class=\"wp-image-76168\" style=\"width:586px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1776-1024x550.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1776-300x161.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1776-768x413.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1776-1536x826.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1776.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Ahora, para hacer las plataformas donde el jugador va a saltar, desde la <strong><em>Hierarchy <\/em><\/strong>se agrega un objeto 3D de tipo <strong><em>Cubo<\/em><\/strong>. A este se le modificaron las dimensiones necesarias y se ubic\u00f3 justo donde finaliza el terreno. Luego, desde el <strong><em>Inspector<\/em><\/strong>, se a\u00f1adi\u00f3 el componente <strong><em>Rigidbody<\/em><\/strong>, configur\u00e1ndolo con <strong><em>Is Kinematic<\/em><\/strong> activado y <strong><em>Use Gravity<\/em><\/strong> desactivado. Despu\u00e9s de esto, el cubo se arrastr\u00f3 hacia la ventana <em><strong>Project<\/strong> <\/em>para convertirlo en un <strong><em>Prefab<\/em><\/strong>, y finalmente se elimin\u00f3 de la escena para utilizar \u00fanicamente su versi\u00f3n prefab al momento de colocar las plataformas.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"550\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1779-1024x550.png\" alt=\"\" class=\"wp-image-76171\" style=\"width:547px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1779-1024x550.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1779-300x161.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1779-768x413.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1779-1536x826.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1779.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Para crear el prefab del <strong><em>Checkpoint (Anillo)<\/em><\/strong>, se a\u00f1adi\u00f3 un objeto desde <strong><em>GameObject &gt; 3D Object &gt; Cylinder <\/em><\/strong> y se nombr\u00f3 como <strong><em>CheckpointPrefab<\/em><\/strong>. Luego se ajust\u00f3 la escala. Una vez configurado, se arrastr\u00f3 el objeto hacia la ventana <em><strong>Project<\/strong> <\/em>para convertirlo en un <strong><em>Prefab<\/em><\/strong>, como en el paso anterior, y posteriormente se elimin\u00f3 de la escena, quedando listo para colocarlo cuando fuera necesario.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"550\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1780-1024x550.png\" alt=\"\" class=\"wp-image-76172\" style=\"width:534px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1780-1024x550.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1780-300x161.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1780-768x413.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1780-1536x826.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1780.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Para generar autom\u00e1ticamente todas las plataformas del nivel, se cre\u00f3 un objeto vac\u00edo en la <em><strong>Hierarchy<\/strong> <\/em>llamado <strong><em>ParkourLevelGenerator<\/em><\/strong>, que se ubic\u00f3 estrat\u00e9gicamente cerca del inicio del jugador para que el recorrido comenzara en el lugar correcto. A este objeto se le asign\u00f3 el script <em><strong>StagedParkourGenerator<\/strong> <\/em>desde el <strong>Inspector<\/strong>, configurando todos los par\u00e1metros necesarios para que el generador funcionara correctamente. Entre estos par\u00e1metros se relacionaron los prefabs de las plataformas y de la llave, asegurando que cada elemento del nivel estuviera correctamente referenciado.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"550\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1847-1024x550.png\" alt=\"\" class=\"wp-image-76313\" style=\"width:603px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1847-1024x550.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1847-300x161.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1847-768x413.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1847-1536x826.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1847.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Adicionalmente, se a\u00f1adieron dos objetos vac\u00edos denominados <em><strong>StartParkour<\/strong> <\/em>y <strong><em>FinalParkour<\/em><\/strong>, que sirven para definir con precisi\u00f3n el inicio y el final del camino del parkour. Estos objetos tambi\u00e9n se vincularon al script para que el generador pudiera calcular correctamente la posici\u00f3n y orientaci\u00f3n de todas las plataformas intermedias. Gracias a esto, el recorrido tiene un punto de inicio y un punto final claros, garantizando que el jugador pueda avanzar de manera lineal y fluida a lo largo del nivel.<\/p>\n\n\n\n<div class=\"wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image alignright size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"550\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1848-1024x550.png\" alt=\"\" class=\"wp-image-76314\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1848-1024x550.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1848-300x161.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1848-768x413.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1848-1536x826.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1848.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\n<figure class=\"wp-block-image alignright size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"550\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1849-1024x550.png\" alt=\"\" class=\"wp-image-76315\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1849-1024x550.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1849-300x161.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1849-768x413.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1849-1536x826.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1849.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n<\/div>\n\n\n\n<p>Dentro del generador se configuraron los valores enteros que controlan la distancia m\u00ednima y m\u00e1xima entre plataformas, as\u00ed como la variaci\u00f3n en altura, lo que permite crear un recorrido din\u00e1mico y desafiante. De igual manera, se definieron las cinco etapas del nivel, asignando a cada una sus colores caracter\u00edsticos, la probabilidad de incluir plataformas m\u00f3viles o colapsables y el tipo de dificultad correspondiente. Esto asegura que el parkour aumente progresivamente en reto a medida que el jugador avanza, manteniendo el equilibrio entre diversi\u00f3n y desaf\u00edo.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"536\" height=\"994\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1850.png\" alt=\"\" class=\"wp-image-76316\" style=\"width:275px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1850.png 536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1850-162x300.png 162w\" sizes=\"auto, (max-width: 536px) 100vw, 536px\" \/><\/figure>\n\n\n\n<p>De esta manera, el <em><strong>ParkourLevelGenerator<\/strong> <\/em>se convierte en la herramienta principal para estructurar y automatizar todo el recorrido del nivel. Su correcta configuraci\u00f3n garantiza coherencia visual, mec\u00e1nica y de dificultad en cada etapa del parkour, permitiendo que la escena se genere de manera autom\u00e1tica y sin necesidad de colocar cada plataforma manualmente. Adem\u00e1s, facilita realizar ajustes r\u00e1pidos en la disposici\u00f3n, colores o comportamiento de las plataformas para probar distintas variantes del nivel.<br><br>En la primera etapa se defini\u00f3 un script que permit\u00eda establecer un estado por defecto para las plataformas, correspondiendo a plataformas est\u00e1ticas que no presentan ning\u00fan tipo de movimiento ni cambio durante el recorrido. Este estado asegura que el jugador pueda familiarizarse con la mec\u00e1nica b\u00e1sica del parkour antes de enfrentarse a desaf\u00edos m\u00e1s din\u00e1micos.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"550\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1851-1024x550.png\" alt=\"\" class=\"wp-image-76317\" style=\"width:454px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1851-1024x550.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1851-300x161.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1851-768x413.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1851-1536x826.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1851.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>La segunda etapa corresponde al script <strong><em>BlinkingPlatform.cs, <\/em><\/strong>donde las plataformas se desactivan despu\u00e9s de cierto tiempo. Este script incluye la condici\u00f3n de que, si la plataforma anterior est\u00e1 desactivada, la siguiente debe permanecer activa para garantizar la continuidad del juego y evitar que el jugador quede bloqueado o caiga de manera inesperada.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"550\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1852-1024x550.png\" alt=\"\" class=\"wp-image-76318\" style=\"width:491px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1852-1024x550.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1852-300x161.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1852-768x413.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1852-1536x826.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1852.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>La etapa siguiente utiliza el script <strong><em>SidewaysPlatform.cs,<\/em><\/strong> que genera plataformas que se mueven horizontalmente a cierta distancia. Este movimiento lateral a\u00f1ade un nivel de desaf\u00edo mayor, obligando al jugador a calcular saltos y tiempos precisos para avanzar por el recorrido.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"550\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1853-1024x550.png\" alt=\"\" class=\"wp-image-76319\" style=\"width:502px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1853-1024x550.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1853-300x161.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1853-768x413.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1853-1536x826.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1853.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Finalmente, se defini\u00f3 un estado combinado llamado <strong><em>Combined<\/em><\/strong>, que integra las acciones de las dos etapas anteriores. En este modo, las plataformas se mueven de lado a lado y, al mismo tiempo, desaparecen despu\u00e9s de un tiempo determinado, ofreciendo un reto m\u00e1s avanzado y din\u00e1mico que combina movimiento y temporizaci\u00f3n, incrementando la dificultad de manera progresiva.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"550\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1854-1024x550.png\" alt=\"\" class=\"wp-image-76320\" style=\"width:491px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1854-1024x550.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1854-300x161.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1854-768x413.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1854-1536x826.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1854.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>De esta forma, el generador crea autom\u00e1ticamente las plataformas desde el punto inicial hasta el punto final, aplicando diferentes estados seg\u00fan la etapa correspondiente. Cada etapa define un comportamiento distinto de las plataformas, lo que permite que el recorrido sea din\u00e1mico y que la dificultad aumente progresivamente a medida que el jugador avanza. Gracias a esto, las plataformas no solo se colocan en la posici\u00f3n correcta, sino que tambi\u00e9n presentan variedad en su comportamiento y reto.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"550\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1855-1024x550.png\" alt=\"\" class=\"wp-image-76321\" style=\"width:495px;height:auto\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1855-1024x550.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1855-300x161.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1855-768x413.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1855-1536x826.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1855.png 1920w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Para el siguiente paso, se definieron los <strong>checkpoints<\/strong>, que registran el progreso del jugador a lo largo del recorrido. Adem\u00e1s, se implement\u00f3 la disminuci\u00f3n de vida cuando el jugador cae de las plataformas y los eventos de ca\u00edda, asegurando que el sistema de respawn funcione correctamente y que el jugador pueda reaparecer en el \u00faltimo checkpoint alcanzado sin perder la coherencia del nivel.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Escena de cr\u00e9ditos<\/strong><\/h3>\n\n\n\n<p>Para la escena de cr\u00e9ditos se utilizo la escena de la animaci\u00f3n de bus que utilizamos en el videojuego, est\u00e1 escena aparecer\u00e1 cuando el jugador supere el nivel de parkour e interactue con el bus. Aqu\u00ed solo dejamos un texto est\u00e1tico pero la animaci\u00f3n se muestra de forma exitosa de fondo. El bus al llegar a un box collider que predefinimos en el mapa, dirige al jugador al men\u00fa de inicio.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"546\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1843-1024x546.png\" alt=\"\" class=\"wp-image-76307\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1843-1024x546.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1843-300x160.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1843-768x409.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1843-1536x819.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1843.png 1919w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>MODELOS DE SKETCHFAB A UTILIZAR<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Modelo Bus<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"549\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/bus-1024x549.png\" alt=\"\" class=\"wp-image-76286\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/bus-1024x549.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/bus-300x161.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/bus-768x411.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/bus-1536x823.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/bus.png 1919w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>Autor del modelo:<\/strong> <a href=\"https:\/\/sketchfab.com\/VRC-IW\"><strong>VRC-IW<\/strong><\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Modelos de \u00c1rboles<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"550\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/arboles-1024x550.png\" alt=\"\" class=\"wp-image-76287\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/arboles-1024x550.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/arboles-300x161.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/arboles-768x412.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/arboles-1536x824.png 1536w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/arboles.png 1919w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>Autor del modelo:<\/strong> <a href=\"https:\/\/sketchfab.com\/dariiiii\"><strong>Dari<\/strong><\/a><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Modelo Esqueletos<\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"575\" src=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1836-1024x575.png\" alt=\"\" class=\"wp-image-76290\" srcset=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1836-1024x575.png 1024w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1836-300x168.png 300w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1836-768x431.png 768w, https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/image-1836.png 1106w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><strong>Autor del modelo:<\/strong> <a href=\"https:\/\/sketchfab.com\/danielgeraldini\"><strong>Daniel Geraldini<\/strong><\/a><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>CONCLUSIONES<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>El uso del Canvas nos permiti\u00f3 estructurar de manera clara los elementos visuales del juego para el dise\u00f1o de los men\u00fas interactivos para el usuario, incluyendo paneles, textos e indicadores. Su correcta implementaci\u00f3n garantiz\u00f3 una interfaz intuitiva, facilitando que el jugador comprendiera la informaci\u00f3n y acciones disponibles durante la partida.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La interacci\u00f3n con el NPC nos ayud\u00f3 a fortalecer la dimensi\u00f3n narrativa del juego al permitir di\u00e1logos, entrega de objetos y activaci\u00f3n de eventos. Este sistema mostr\u00f3 c\u00f3mo la comunicaci\u00f3n entre jugador y personajes no jugables puede enriquecer la experiencia y guiar el progreso dentro del mundo del juego.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>El sistema de recolecci\u00f3n de monedas introdujo una mec\u00e1nica b\u00e1sica de recompensa y progresi\u00f3n. Su implementaci\u00f3n permiti\u00f3 trabajar conceptos de colisiones, prefabs y actualizaci\u00f3n din\u00e1mica de la interfaz, aportando un componente de motivaci\u00f3n y objetivos claros dentro de la jugabilidad.<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>El dise\u00f1o e implementaci\u00f3n de un mapa de parkour busc\u00f3 incentivar una movilidad m\u00e1s extrema, haciendo que el jugador ejecutara saltos, equilibrios y recorridos exigentes. Este elemento elev\u00f3 la dificultad y a\u00f1adi\u00f3 dinamismo a la jugabilidad, promoviendo destreza y precisi\u00f3n.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>CR\u00c9DITOS<\/strong><\/h2>\n\n\n\n<p><strong>Autor:<\/strong>&nbsp;<\/p>\n\n\n\n<p>&#8211; <a href=\"https:\/\/niixer.com\/?s=Arlyn+Jessenia+Cort%C3%A9s+Garc%C3%ADa#google_vignette\">Arlyn Jessenia Cort\u00e9s Garc\u00eda<\/a><br>&#8211; <a href=\"https:\/\/niixer.com\/index.php\/author\/yurrean\/\">Yerli Tatiana Urrea Naranjo<\/a><\/p>\n\n\n\n<p><strong>Editor:<\/strong>&nbsp;<a href=\"https:\/\/niixer.com\/?s=Carlos+Ivan+Pinz%C3%B3n+Romero\">Carlos Iv\u00e1n Pinz\u00f3n Romero<\/a><\/p>\n\n\n\n<p><strong>C\u00f3digo:<\/strong>&nbsp;<a href=\"https:\/\/niixer.com\/?s=UCMV-10\">UCMV-10<\/a><\/p>\n\n\n\n<p><strong>Universidad Central:<\/strong>&nbsp;<a href=\"https:\/\/niixer.com\/?s=Universidad+Central\" target=\"_blank\" rel=\"noreferrer noopener\">Universidad Central<\/a><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>BIBLIOGR\u00c1FIAS<\/strong><\/h2>\n\n\n\n<pre class=\"wp-block-preformatted\">BravePixelG. (2024, 14 junio). C\u00f3mo crear animaciones entre escenas m\u00e1s \u00f3ptimas y r\u00e1pidas en Unity (LeanTween para UI) [V\u00eddeo]. YouTube. https:\/\/www.youtube.com\/watch?v=CGuGb50py0g<br><br>DansterDev. (2021, 7 agosto). Como INTERACTUAR con objetos \u00a1RAPIDO Y SENCILLO! Unity 2021 [V\u00eddeo]. YouTube. https:\/\/www.youtube.com\/watch?v=oaWsRmDTLBo<br><br>D\u00e9daloLab. (2023, 2 febrero). Como HACER una IA ENEMIGA en UNITY 2D \u2705 [V\u00eddeo]. YouTube. https:\/\/www.youtube.com\/watch?v=w4unf6meEvI<br><br>DxD - Programaci\u00f3n y Dise\u00f1o. (2023, 27 mayo). COMO EXPORTAR DE BLENDER a UNITY EN 2023 [V\u00eddeo]. YouTube. https:\/\/www.youtube.com\/watch?v=i1NGjQvNqn0<br><br>GDT Solutions ES. (2021, 20 julio). EXPORTAR modelo 3D con TEXTURAS de BLENDER A UNITY [V\u00eddeo]. YouTube. https:\/\/www.youtube.com\/watch?v=WGQ1nt05WnA<br><br>Technologies, U. (s. f.-a). Escenas - Unity Manual. https:\/\/docs.unity3d.com\/es\/2018.4\/Manual\/CreatingScenes.html<br><br>Technologies, U. (s. f.-b). GameObjects - Unity Manual. https:\/\/docs.unity3d.com\/es\/2018.4\/Manual\/GameObjects.html<br><br>Technologies, U. (s. f.-c). Lights (luces) - Unity Manual. https:\/\/docs.unity3d.com\/es\/2018.4\/Manual\/Lights.html<br><br>Technologies, U. (s. f.-d). Prefabs - Unity Manual. https:\/\/docs.unity3d.com\/es\/2018.4\/Manual\/Prefabs.html<br><br>Technologies, U. (s. f.-e). UI (Interfaz de Usuario) - Unity Manual. https:\/\/docs.unity3d.com\/es\/2018.4\/Manual\/UISystem.html<br><br>VOID. (2024, 8 agosto). Creaci\u00f3n de un sistema de interacci\u00f3n parte 2 | Tutorial Unity [V\u00eddeo]. YouTube. https:\/\/www.youtube.com\/watch?v=kjPnsI5THu0<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Los videojuegos han dejado de ser \u00fanicamente una forma de entretenimiento para convertirse en poderosas herramientas educativas que permiten aprender de manera interactiva y divertida. Unity, una plataforma de creaci\u00f3n de videojuegos ampliamente utilizada en todo el mundo, ofrece la oportunidad de desarrollar experiencias educativas que combinan diversi\u00f3n y aprendizajeSeguir Leyendo<\/p>\n","protected":false},"author":1873,"featured_media":76103,"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":[30,4332],"tags":[1310,214,66],"class_list":["post-74467","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-niixer","category-unity","tag-blender-3d","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>&quot;Susurros&quot; un videojuego 3D desarrollado en Unity &#8211; Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos<\/title>\n<meta name=\"description\" content=\"Desarrollo de un videojuego 3D de terror en el motor Unity\" \/>\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\/11\/28\/susurros-un-videojuego-3d-desarrollado-en-unity\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"&quot;Susurros&quot; un videojuego 3D desarrollado en Unity &#8211; Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos\" \/>\n<meta property=\"og:description\" content=\"Desarrollo de un videojuego 3D de terror en el motor Unity\" \/>\n<meta property=\"og:url\" content=\"https:\/\/niixer.com\/index.php\/2025\/11\/28\/susurros-un-videojuego-3d-desarrollado-en-unity\/\" \/>\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-11-28T16:16:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-29T02:07:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/canvas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1919\" \/>\n\t<meta property=\"og:image:height\" content=\"1011\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"acortesg8\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"acortesg8\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"29 minutos\" \/>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\"Susurros\" un videojuego 3D desarrollado en Unity &#8211; Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos","description":"Desarrollo de un videojuego 3D de terror en el motor Unity","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\/11\/28\/susurros-un-videojuego-3d-desarrollado-en-unity\/","og_locale":"es_ES","og_type":"article","og_title":"\"Susurros\" un videojuego 3D desarrollado en Unity &#8211; Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos","og_description":"Desarrollo de un videojuego 3D de terror en el motor Unity","og_url":"https:\/\/niixer.com\/index.php\/2025\/11\/28\/susurros-un-videojuego-3d-desarrollado-en-unity\/","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-11-28T16:16:09+00:00","article_modified_time":"2025-11-29T02:07:40+00:00","og_image":[{"width":1919,"height":1011,"url":"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/canvas.png","type":"image\/png"}],"author":"acortesg8","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"acortesg8","Tiempo de lectura":"29 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/niixer.com\/index.php\/2025\/11\/28\/susurros-un-videojuego-3d-desarrollado-en-unity\/#article","isPartOf":{"@id":"https:\/\/niixer.com\/index.php\/2025\/11\/28\/susurros-un-videojuego-3d-desarrollado-en-unity\/"},"author":{"name":"acortesg8","@id":"https:\/\/niixer.com\/#\/schema\/person\/f70574cd1fa014c02e1a70805f6c9613"},"headline":"&#8220;Susurros&#8221; un videojuego 3D desarrollado en Unity","datePublished":"2025-11-28T16:16:09+00:00","dateModified":"2025-11-29T02:07:40+00:00","mainEntityOfPage":{"@id":"https:\/\/niixer.com\/index.php\/2025\/11\/28\/susurros-un-videojuego-3d-desarrollado-en-unity\/"},"wordCount":3873,"publisher":{"@id":"https:\/\/niixer.com\/#organization"},"image":{"@id":"https:\/\/niixer.com\/index.php\/2025\/11\/28\/susurros-un-videojuego-3d-desarrollado-en-unity\/#primaryimage"},"thumbnailUrl":"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/canvas.png","keywords":["Blender 3D","Unity","Videojuegos"],"articleSection":["Niixer","Unity"],"inLanguage":"es"},{"@type":"WebPage","@id":"https:\/\/niixer.com\/index.php\/2025\/11\/28\/susurros-un-videojuego-3d-desarrollado-en-unity\/","url":"https:\/\/niixer.com\/index.php\/2025\/11\/28\/susurros-un-videojuego-3d-desarrollado-en-unity\/","name":"\"Susurros\" un videojuego 3D desarrollado en Unity &#8211; Portal de noticias de tecnolog\u00eda, Realidad Virtual, Aumentada y Mixta, Videojuegos","isPartOf":{"@id":"https:\/\/niixer.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/niixer.com\/index.php\/2025\/11\/28\/susurros-un-videojuego-3d-desarrollado-en-unity\/#primaryimage"},"image":{"@id":"https:\/\/niixer.com\/index.php\/2025\/11\/28\/susurros-un-videojuego-3d-desarrollado-en-unity\/#primaryimage"},"thumbnailUrl":"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/canvas.png","datePublished":"2025-11-28T16:16:09+00:00","dateModified":"2025-11-29T02:07:40+00:00","description":"Desarrollo de un videojuego 3D de terror en el motor Unity","breadcrumb":{"@id":"https:\/\/niixer.com\/index.php\/2025\/11\/28\/susurros-un-videojuego-3d-desarrollado-en-unity\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/niixer.com\/index.php\/2025\/11\/28\/susurros-un-videojuego-3d-desarrollado-en-unity\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/niixer.com\/index.php\/2025\/11\/28\/susurros-un-videojuego-3d-desarrollado-en-unity\/#primaryimage","url":"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/canvas.png","contentUrl":"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/canvas.png","width":1919,"height":1011},{"@type":"BreadcrumbList","@id":"https:\/\/niixer.com\/index.php\/2025\/11\/28\/susurros-un-videojuego-3d-desarrollado-en-unity\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/niixer.com\/"},{"@type":"ListItem","position":2,"name":"&#8220;Susurros&#8221; un videojuego 3D desarrollado en Unity"}]},{"@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\/f70574cd1fa014c02e1a70805f6c9613","name":"acortesg8","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/8dce4716a3a0eda27dbd26b3be0693071a8981b78b6d6c249b8f426197af3b49?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/8dce4716a3a0eda27dbd26b3be0693071a8981b78b6d6c249b8f426197af3b49?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8dce4716a3a0eda27dbd26b3be0693071a8981b78b6d6c249b8f426197af3b49?s=96&d=mm&r=g","caption":"acortesg8"},"url":"https:\/\/niixer.com\/index.php\/author\/acortesg8\/"}]}},"jetpack_featured_media_url":"https:\/\/niixer.com\/wp-content\/uploads\/2025\/11\/canvas.png","_links":{"self":[{"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/posts\/74467","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\/1873"}],"replies":[{"embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/comments?post=74467"}],"version-history":[{"count":115,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/posts\/74467\/revisions"}],"predecessor-version":[{"id":76633,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/posts\/74467\/revisions\/76633"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/media\/76103"}],"wp:attachment":[{"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/media?parent=74467"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/categories?post=74467"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/niixer.com\/index.php\/wp-json\/wp\/v2\/tags?post=74467"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}