{"id":1449,"date":"2024-11-05T21:41:01","date_gmt":"2024-11-05T21:41:01","guid":{"rendered":"https:\/\/ninquiet.com\/?p=1449"},"modified":"2024-11-21T05:51:18","modified_gmt":"2024-11-21T05:51:18","slug":"game-test-inquilino-maldito","status":"publish","type":"post","link":"https:\/\/ninquiet.com\/index.php\/2024\/11\/05\/game-test-inquilino-maldito\/","title":{"rendered":"Game test: Inquilino Maldito"},"content":{"rendered":"\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.ibb.co\/S05Qp7H\/image-2024-05-13-061119504.png\" alt=\"Inquilino Maldito\"\/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"video-\">Video:<\/h1>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Prototipo prueba tecnica -Inquilino Maldito Demo\" width=\"800\" height=\"450\" src=\"https:\/\/www.youtube.com\/embed\/5BX8Hnrxqh0?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"build-\">Build:<\/h1>\n\n\n\n<p>Puedes jugar el juego ac\u00e1:<br><a href=\"https:\/\/simmer.io\/@Ninquiet\/inquilinomalditodemotecnica\">https:\/\/simmer.io\/@Ninquiet\/inquilinomalditodemotecnica<\/a><\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"resumen-\">Resumen:<\/h1>\n\n\n\n<p>Es un juego en el que debemos acabar con los zombies y escapar, estos zombies no son solo estaticos sino que tienen un sistema de movimiento bastante logrado<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"funcionamiento-\">Funcionamiento:<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"state-machine-\">State Machine:<\/h3>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.ibb.co\/T2JNs4j\/image-2024-05-13-061540717.png\" alt=\"Diagrama\"\/><\/figure>\n\n\n\n<p>Dise\u00f1e un sistema de State machine usando generics que me permite re utilizarlo en cualquier parte, incluso en otros proyectos luego de este, este sistema funciona con un StateMachine base que es el nucleo principal de control y la ultima desici\u00f3n, luego tenemos el State Factory que se encarga de organinzar y retornar los diferentes estados existentes, y por ultimo los BaseState (y sus variantes), que se encargan de gestionar los diferentes estados, c\u00f3mo estar en IDLE luego caminar, luego moverse, y as\u00ed sucesivamente.<\/p>\n\n\n\n<p>Para hacer este sistema de una forma modular, cree un cuarto integrante que se encarga de gestionar las variables que son de vital importancia para los estados y sub estados, c\u00f3mo para el state machine tambien, as\u00ed nace Base Vars.<\/p>\n\n\n\n<p>Teniendo esta estructura, la transicion\u00e9 para que funcione con estructuras genericas, y de esta forma podria modificarla a mi gusto, con esto pude crear variantes c\u00f3mo ZombieStateMachine, o m\u00e1s adelante ZombieDistanceStateMachine que hereda de StateMachine y solo modifica algunos estados y algunas variables (y as\u00ed ese zombie no tuvo que ser escrito desde cero).<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.ibb.co\/cQwBh8V\/image-2024-05-13-062838255.png\" alt=\"Diagrama\"\/><\/figure>\n\n\n\n<p>(ejemplo de uso de estructura generica)<br><img decoding=\"async\" src=\"https:\/\/i.ibb.co\/FHfN77y\/image-2024-05-13-062354817.png\" alt=\"Diagrama\"><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"player-\">Player:<\/h3>\n\n\n\n<p>El player no usa state machine, usa PlayerController que hace de base de control de una forma general, las partes importantes del personaje sonn el poder contnrolar su vida (c\u00f3mo tambien la de los zombies usando LifeController), poder controlar cuantas llaves lleva puestas con KeysHandler, las armas que puede usar con PlayerWeaponHandler, o el poder recoger items con PlayerItemPicker.cs, entre muchos otros sub sistemas que sostienen el jugador.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"armas-y-ataque-\">Armas y Ataque:<\/h3>\n\n\n\n<p>La forma en que funciona el sistema de da\u00f1o y ataque es que el personaje que ataca revisa si e objeto atacado posee un LifeController, si lo tiene entonces se notifica del da\u00f1o, el lifeController a su vez usando un sistema de eventos, notifica a todas las clases interesadas de los cambios, e incluso de la posible muerte del jugador.<\/p>\n\n\n\n<p>El Zombie a distancia realiza el ataque desde su sistema de estados, sin embargo el zombie cuerpo a cuerpo hace uso de una tercera clase llamada EnemyBaseAttack, esto para poder tercerizar el proceso de ataque fisico que es un poco m\u00e1s complejo que el realizado por los zombies a distancia.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"la-muerte-\">La muerte:<\/h3>\n\n\n\n<p>Para este efecto y muchos otros que se encuentran en el prototipo hice uso de Cinemachine, al realizar el cambio de camara y jugar con los valores en el UI se logra el efecto de que el jugador cae rendido al morir.<\/p>\n\n\n\n<p>Por su lado, los Zombies manejan la muerte desde uno de sus estados tambien,<\/p>\n\n\n\n<p>Inteligencia del enemigo:<br>Trat\u00e9 de realizar el state machine de la forma m\u00e1s pulida que pude, as\u00ed que hay cosas c\u00f3mo que si el zombie tiene asignados waypoints, zombie seguir\u00e1 estos waypoints llegado el caso de que pierda de vista al usuario, al momento de regresar al waypoint siempre calcula cual es el m\u00e1s cercano.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.ibb.co\/McrJPcZ\/image-2024-05-13-063645400.png\" alt=\"Free Trees\"\/><\/figure>\n\n\n\n<p>Para lograr el movimiento del enemigo us\u00e9 un sistema de navmesh, interconectado con el StateMachine del zombie y controlado por los estados<\/p>\n\n\n\n<p>Para la animaci\u00f3n del zombie disparando us\u00e9 un poco de blender.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"effectos\">Effectos<\/h1>\n\n\n\n<p>Para una trasnci\u00f3n m\u00e1s limpia y pulida, hice uso de Cinemachine, y no solo esto sino tambien para efectos de camar\u00e1 c\u00f3mo el shake, para el cual us\u00e9 el sistema de impulsos.<\/p>\n\n\n\n<p>Para el efecto de disparo us\u00e9 el sistema de particulas, y algunas texturas basicas creadas en photoshop<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"objeetos\">Objeetos<\/h1>\n\n\n\n<p>El sistema de objetos permite al jugador interactuar c\u00f3n objetos de munici\u00f3n, objetos de vida, objetos de escudo, y objetos de llaves, estos ultimos s\u00f3n usados para abrir puertas.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.ibb.co\/Zh6TK0W\/image-2024-05-13-064412852.png\" alt=\"Objetcs\"\/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"notificaciones\">Notificaciones<\/h1>\n\n\n\n<p>Implement\u00e9 un sistema de Notificaciones a modo de feedback, as\u00ed el usuario tiene claridad en cuanto a si recogio o no la munici\u00f3n cuanto recibi\u00f3, si el objeto lo cur\u00f3 o le increment\u00f3 el escudo, e incluso para saber la raz\u00f3n por la cual una puerta no se abre, es la forma de interactuar con el usuario.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.ibb.co\/KsKnt39\/image-2024-05-13-064738708.png\" alt=\"Notificacion\"\/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"ui\">UI<\/h1>\n\n\n\n<p>Para la interfaz de usuario us\u00e9 el sistema de acciones ya creado, al subscribir a cada una de las clases (por ejemplo lifeController del player para recibir informaci\u00f3n de la vida, o PlayerWeaponHandler para recibir informaci\u00f3n de las armas), se pudo crear un sistema preciso de cada uno de los datos imporntantes a comunicar.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i.ibb.co\/VDvBT29\/image-2024-05-13-065250677.png\" alt=\"UI\"\/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"sonidos\">Sonidos<\/h1>\n\n\n\n<p>Para el sistema de sonido cree una base llamada BaseSoundPlayer que se encarga de reproducir en un AudioSource asignado un clip especifico, luego, de esta clase deriv\u00e9 PlayerSounds y ZombieSounds, estas clases guardan en si referencias de sonidos especificas que usar\u00e1nm de esta forma no repetimos codigo y es bastante util.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\" id=\"assets-usados-\">Assets usados:<\/h1>\n\n\n\n<p><img decoding=\"async\" src=\"https:\/\/assetstore.unity.com\/packages\/tools\/animation\/dotween-hotween-v2-27676\" alt=\"DoTween\"><br>Para hacer transiciones rapidamente.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Video: Build: Puedes jugar el juego ac\u00e1:https:\/\/simmer.io\/@Ninquiet\/inquilinomalditodemotecnica Resumen: Es un juego en el que debemos acabar con los zombies y escapar, estos zombies no son solo estaticos sino que tienen un sistema de movimiento bastante logrado Funcionamiento: State Machine: Dise\u00f1e un sistema de State machine usando generics que me permite re utilizarlo en cualquier parte, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1450,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[24],"tags":[],"class_list":["post-1449","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-develop"],"_links":{"self":[{"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/posts\/1449"}],"collection":[{"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/comments?post=1449"}],"version-history":[{"count":1,"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/posts\/1449\/revisions"}],"predecessor-version":[{"id":1451,"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/posts\/1449\/revisions\/1451"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/media\/1450"}],"wp:attachment":[{"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/media?parent=1449"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/categories?post=1449"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ninquiet.com\/index.php\/wp-json\/wp\/v2\/tags?post=1449"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}