<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Vicente Contreras</title>
    <description>The latest articles on DEV Community by Vicente Contreras (@developervix).</description>
    <link>https://dev.to/developervix</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F162234%2F28b51f8b-fdb9-48fa-b354-3f5ab18108ad.jpeg</url>
      <title>DEV Community: Vicente Contreras</title>
      <link>https://dev.to/developervix</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/developervix"/>
    <language>en</language>
    <item>
      <title>Entendiendo Playmaker parte 1</title>
      <dc:creator>Vicente Contreras</dc:creator>
      <pubDate>Sat, 12 Oct 2019 23:44:07 +0000</pubDate>
      <link>https://dev.to/developervix/entendiendo-playmaker-parte-1-4ge2</link>
      <guid>https://dev.to/developervix/entendiendo-playmaker-parte-1-4ge2</guid>
      <description>&lt;h2&gt;
  
  
  ¿Qué es playmaker?
&lt;/h2&gt;

&lt;p&gt;Es una herramienta de paga para el engine de unity, la cual a través del concepto de las FSM's (Finite State Machine), maquinas de estado finitas, permite crear la lógica de un videojuego, experiencia de realidad aumentada, etc. de manera visual, sin tener que escribir código en c#.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sGPkNox3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/hdyky218sxj47ejlvv8r.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sGPkNox3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/hdyky218sxj47ejlvv8r.PNG" alt="Alt Text" width="880" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3 Conceptos
&lt;/h2&gt;

&lt;p&gt;La  manera en que playmaker funciona es a través de tres conceptos: &lt;strong&gt;estado&lt;/strong&gt;, &lt;strong&gt;transición&lt;/strong&gt; y &lt;strong&gt;eventos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;El estado&lt;/strong&gt;, es en el que se encontrara en un momento determinado aquel &lt;em&gt;gameObject&lt;/em&gt; al que se le este implementado una FSM o inclusive un momento dado del videojuego y que tendrá que ejecutar una serie de procesos o comportamientos, por ejemplo: un cubo que esta quieto, se encontrara en &lt;em&gt;estado de espera&lt;/em&gt; y mientras este de esa manera, que este cambiando de color con el paso del tiempo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;La transición&lt;/strong&gt;, es cuando se han cumplido ciertas condiciones en un estado y permitan cambiar a otro estado para ejecutar otro tipo de comportamiento, por ejemplo: retomando al cubo antes mencionado, en su &lt;em&gt;estado de espera&lt;/em&gt; pasados 4 segundos cambiara al &lt;em&gt;estado de salto&lt;/em&gt; y se pondrá de color azul.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Los eventos&lt;/strong&gt; pueden ocurrir en cualquier estado en que se encuentre el &lt;em&gt;gameObject&lt;/em&gt; y que pueden llevar a una transición, por ejemplo: el cubo estando en el &lt;em&gt;estado de salto&lt;/em&gt; si durante su trayectoria, antes de que toque el suelo y cambie al &lt;em&gt;estado de espera&lt;/em&gt;, llegase a colisionar con un obstáculo como un pico, se activaría el evento de &lt;em&gt;Daño&lt;/em&gt; y hacer que el cubo cambie a color rojo, estando ahora en el &lt;em&gt;estado de dañado&lt;/em&gt; y que pasado cierto tiempo retorne al &lt;em&gt;estado de espera&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Ya definidos los 3 conceptos fundamentales, pasemos a la practica.&lt;/p&gt;

&lt;h2&gt;
  
  
  Importando Playmaker a Unity
&lt;/h2&gt;

&lt;p&gt;En un proyecto nuevo de unity, nos dirigiremos a &lt;em&gt;Window/AssetStore&lt;/em&gt; y se abrirá la pestaña de la tienda de assets de unity dentro del engine, cabe mencionar que debemos estar logeados para poder descargar los assets así como el poder comprarlos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SX9ikXAH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/wn4vboq8clknhgf0d4py.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SX9ikXAH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/wn4vboq8clknhgf0d4py.PNG" alt="Alt Text" width="880" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En el buscador, escribimos playmaker, tiene un costo de $65 dolares, cuando se haya comprado, cambiara el botón a &lt;em&gt;Download&lt;/em&gt; damos click, cuando termine la descarga, ahora el botón dirá &lt;em&gt;Import&lt;/em&gt;, damos click y cuando haya terminado nos saldrá una ventana con todo el contenido que trae la herramienta, le damos click al botón de &lt;em&gt;Import&lt;/em&gt; para que ahora lo tengamos dentro de nuestro proyecto.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--e5EsWlEV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/p42p2xje8t6blu22r5qe.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--e5EsWlEV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/p42p2xje8t6blu22r5qe.PNG" alt="Alt Text" width="880" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una vez termine de importarlo, aparecerá la ventana que se muestra abajo, aquí nos muestra 4 secciones, la primera será para actualizar la herramienta, la segunda es una guía para actualizar playmaker en unity, la tercera nos dirigirá hacia la web oficial de playmaker donde podremos ver información muy completa, altamente recomendable a que se le de un tiempo navegando en la misma, hay foros, tutoriales, documentación, entre otros; la última sección es para extender la herramienta con otros complementos.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KDuz9VoS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/6xsci7fku5j0e1kj74xi.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KDuz9VoS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/6xsci7fku5j0e1kj74xi.PNG" alt="Alt Text" width="506" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bien, cerremos la ventana en cuanto esté listo, no te preocupes, puedes volver a abrirla dirigiéndote a &lt;em&gt;PlayMaker/WelcomeScreen&lt;/em&gt; en la barra de herramientas de unity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manos a la obra
&lt;/h2&gt;

&lt;p&gt;Ahora, para abrir el editor de playmaker y poder armar la lógica de las diferentes FSM's que realizaremos, nos dirigimos a &lt;em&gt;PlayMaker/PlayMakerEditor&lt;/em&gt;, se abrirá la siguiente ventana:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2-u6u86u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/5pjutwcidqyzamierhgw.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2-u6u86u--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/5pjutwcidqyzamierhgw.PNG" alt="Alt Text" width="880" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Del lado derecho es donde se crearán las FSM's en cuanto seleccionemos un objeto de unity, del lado izquierdo tendremos cuatro secciones, &lt;em&gt;FSM, State, Events, Variables&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Bien, crearemos un cubo y un plano, le aplicamos materiales a cada uno, seleccionamos el cubo y en el editor de playmaker damos click derecho para crear la FSM solo para este cubo, la instrucción es: &lt;em&gt;ClickDerecho/AddState&lt;/em&gt;, cuando lo hayamos hecho aparecerá de la siguiente manera:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--P-cy5BVV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/lpf8d6qheuctgib817xz.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--P-cy5BVV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/lpf8d6qheuctgib817xz.PNG" alt="Alt Text" width="880" height="810"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lo que se ha creado es el primer estado de inicio, es decir, en cuanto se ejecute el proyecto, el estado llamado &lt;em&gt;State 1&lt;/em&gt; se ejecutara, ahora, cambiemos el nombre del estado a &lt;em&gt;Idle&lt;/em&gt; que será el de espera, seleccionamos la caja de &lt;em&gt;State 1&lt;/em&gt; y del lado derecho se cambiara a la sección de &lt;strong&gt;State&lt;/strong&gt;, cambiamos el nombre, podemos poner una breve descripción de lo que ocurrirá en este estado, es como si colocáramos comentarios en código.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WgQh6PK7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/qzl7ezfhydvsxw2m2i6x.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WgQh6PK7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/qzl7ezfhydvsxw2m2i6x.PNG" alt="Alt Text" width="880" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para este estado de &lt;strong&gt;Idle&lt;/strong&gt; vamos hacer que durante un tiempo el cubo este cambiando de colores y pasado un tiempo cambie al estado de &lt;strong&gt;Salto&lt;/strong&gt;, seleccionemos el estado &lt;em&gt;Idle&lt;/em&gt; y en la sección State agregaremos el comportamiento de cambio de colores, para esto daremos click en el botón que se encuentra en la parte inferior derecha &lt;em&gt;Action Browser&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--k2m_No9q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/96s6mfpkpcvg78kw0boo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--k2m_No9q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/96s6mfpkpcvg78kw0boo.jpg" alt="Alt Text" width="880" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Después, se nos abrirá la venta llamada &lt;strong&gt;Actions&lt;/strong&gt;, yo la he acomodado a lado del inspector, donde se encontrarán todas las acciones que se le pueden poner a la FSM, acceder a los componentes de unity, a otros scripts, inputs, entre otros.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CAihxCyW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/n0bwkhk4wsz1t4u5g9yb.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CAihxCyW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/n0bwkhk4wsz1t4u5g9yb.PNG" alt="Alt Text" width="464" height="963"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como se puede notar, es muy intuitivo, y si no sabemos que nombre tendrá la acción que queremos implementar pero tenemos claro que queremos que haga el cubo, hay un pequeño buscador en la parte de hasta arriba, vamos a escribir &lt;em&gt;color&lt;/em&gt; y nos mostrará las acciones que tengan que ver con el atributo color.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AE5rlrEX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/kohk3gz1n1yckg55xsb5.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AE5rlrEX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/kohk3gz1n1yckg55xsb5.PNG" alt="Alt Text" width="463" height="958"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bien, vamos a seleccionar dos acciones que nos permitirán ejecutar el comportamiento del estado &lt;strong&gt;Idle&lt;/strong&gt;, que es el cambiar el color del cubo durante un periodo de tiempo, seleccionaremos &lt;strong&gt;Set Material Color&lt;/strong&gt; y &lt;strong&gt;Color Interpolate&lt;/strong&gt;, quedando de la siguiente manera:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WxO7s0SD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ljan6gbvs2byest0tu8c.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WxO7s0SD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ljan6gbvs2byest0tu8c.PNG" alt="Alt Text" width="880" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bien, nos marca un error pero se debe a que en la acción de &lt;strong&gt;Color Interpolate&lt;/strong&gt; necesita de una variable donde guardara el valor del color cambiante (&lt;strong&gt;Store Color&lt;/strong&gt;), entonces, eso nos lleva a tener que crear una variable para esta FSM, vamos a la sección de Variables, estando en esta sección, no habrá nada, en la parte de abajo hay dos atributos &lt;strong&gt;New Variable&lt;/strong&gt; y &lt;strong&gt;Variable Type&lt;/strong&gt;, en la primera vamos poner el nombre de nuestra variable, yo he puesto &lt;em&gt;ColorCube&lt;/em&gt;, después se añadirá en la parte de arriba y vamos a cambiar el tipo de variable a &lt;strong&gt;Color&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L0Xcpes3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/wed1tmavd6hluqgkzfg7.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L0Xcpes3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/wed1tmavd6hluqgkzfg7.PNG" alt="Alt Text" width="880" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora, regresaremos a la sección &lt;strong&gt;State&lt;/strong&gt;, vamos a asignar en &lt;strong&gt;Store Color&lt;/strong&gt;, en la acción &lt;strong&gt;Color Interpolate&lt;/strong&gt;, la variable que se acaba de crear, además, en la variable &lt;strong&gt;Colors&lt;/strong&gt; nos aparecerán 3 cajas, hay que poner 6 y vamos a poner en cada caja diferentes colores para poder guardarlos y posteriormente asignarlos al cubo, esta acción permite que se este haciendo la interpolación de colores durante cierto tiempo, en la variable &lt;strong&gt;Time&lt;/strong&gt; podemos establecer cuanto tiempo estará cambiando de color, vamos a ponerle 4, quedaría de la siguiente manera solamente la acción de &lt;strong&gt;Color Interpolate&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oryCm4D---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/aaasahlzdz0gzl1ciiru.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oryCm4D---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/aaasahlzdz0gzl1ciiru.PNG" alt="Alt Text" width="880" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Posteriormente, en la acción de &lt;strong&gt;Set Material Color&lt;/strong&gt;, vamos a asignar los diferentes colores, de modo que en el atributo &lt;em&gt;Material&lt;/em&gt; hay que asignarle el material, para ello será el mismo que tiene asignado el cubo &lt;strong&gt;(1)&lt;/strong&gt;, ahora, necesitamos cambiar el atributo &lt;em&gt;Color&lt;/em&gt; de esta sección, vamos a dar click a lado del pequeño botón de la caja de color, tiene dos lineas paralelas &lt;strong&gt;(2)&lt;/strong&gt;, esto indica que haremos uso de una variable, después se pondrá de color rojo, damos click y aparecerá la variable &lt;em&gt;ColorCube&lt;/em&gt; que hemos creado &lt;strong&gt;(3)&lt;/strong&gt;, también debemos seleccionar el checkbox &lt;em&gt;Every Frame&lt;/em&gt; para que cambie el color a lo largo de los diferentes frames &lt;strong&gt;(4)&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HkmWJ4zc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/p8cowlu867j1chqebf87.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HkmWJ4zc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/p8cowlu867j1chqebf87.jpg" alt="Alt Text" width="880" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Listo, ya tenemos el primer estado &lt;strong&gt;Idle&lt;/strong&gt; de este cubo, cuando demos &lt;em&gt;Play&lt;/em&gt; este deberá empezar a cambiar de color por 4 segundos, pasado ese tiempo se detendrá y el comportamiento habrá terminado.&lt;/p&gt;

&lt;p&gt;Ahora, vamos a crear un segundo estado, el de &lt;strong&gt;Jump&lt;/strong&gt;, ya tenemos establecido que en el estado de &lt;strong&gt;Idle&lt;/strong&gt; que por 4 segundos este cambiando de color el cubo, ahora debemos activar un &lt;strong&gt;evento&lt;/strong&gt; para que haga la transición al estado de saltar pasado dicho tiempo.&lt;/p&gt;

&lt;p&gt;En la acción de &lt;strong&gt;Color Interpolate&lt;/strong&gt; hay una varible llamada &lt;strong&gt;Finish Event&lt;/strong&gt;, esta variable lo que hará es mandar llamar un evento en cuanto pase el tiempo establecido en la variable &lt;strong&gt;Time&lt;/strong&gt;, por lo que deberemos agregar un evento ya que esta vacío, para crearlo deberemos ir a la sección de &lt;strong&gt;Events&lt;/strong&gt; y en la parte inferior hay un botón &lt;em&gt;Event Browser&lt;/em&gt;, damos click y aparecerá una ventana, escribimos en el buscador finished, aparecera una única opción, le damos doble click para que se agregue a la lista de eventos de la FSM:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mpxLzDJT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/boclgvllw42i5mubehfh.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mpxLzDJT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/boclgvllw42i5mubehfh.PNG" alt="Alt Text" width="695" height="627"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ahora, en el estado de &lt;strong&gt;Idle&lt;/strong&gt; en su acción de &lt;em&gt;Color Interpolate&lt;/em&gt;, en su variable &lt;em&gt;Finish Event&lt;/em&gt; vamos a seleccionar el evento &lt;strong&gt;FINISHED&lt;/strong&gt;, aparecerá un aviso en rojo, le damos click y en el estado de &lt;strong&gt;Idle&lt;/strong&gt;, abajo de él, estará &lt;strong&gt;FINISHED&lt;/strong&gt;, quiere decir que tiene agregado un evento el cual se ejecutara pasados x segundos según la variable &lt;em&gt;Time&lt;/em&gt;, y lo que ahora quedaría hacer es una transición hacia el estado &lt;strong&gt;Jump&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tA_ZKyqE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/puc5eft7gh8vfeh2v55x.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tA_ZKyqE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/puc5eft7gh8vfeh2v55x.PNG" alt="Alt Text" width="880" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para crear un nuevo estado, hay que dar click derecho en cualquier parte del editor de playmaker y seleccionar &lt;em&gt;Add State&lt;/em&gt;, le vamos a cambiar el nombre a &lt;strong&gt;Jump&lt;/strong&gt;, vamos a agregarle una acción, para que salte es importante añadirle como componente al cubo, un &lt;em&gt;rigidbody&lt;/em&gt;, de esta manera podremos utilizar la acción &lt;strong&gt;Set Velocity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9l6ONjeD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/lo651jz16zd8pa1k3a30.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9l6ONjeD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/lo651jz16zd8pa1k3a30.PNG" alt="Alt Text" width="857" height="838"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8id5MDwV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/llnx1nf4p9m583hur8tn.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8id5MDwV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/llnx1nf4p9m583hur8tn.PNG" alt="Alt Text" width="880" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En la acción &lt;strong&gt;Set Velocity&lt;/strong&gt; vamos a asignar en que eje queremos aplicar velocidad al cubo, en este caso será en el &lt;em&gt;eje Y&lt;/em&gt;, seleccionamos el botón de usar variable, el que tiene dos paralelas &lt;strong&gt;(1)&lt;/strong&gt;, después le vamos a poner un valor de 5 que serán aplicados a su velocidad &lt;strong&gt;(2)&lt;/strong&gt;, de esta manera solo lo hará una vez.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sNdHHMIq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/l6ehswtfb2yk8bs60785.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sNdHHMIq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/l6ehswtfb2yk8bs60785.jpg" alt="Alt Text" width="374" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lo que queda por hacer es crear la transición del estado &lt;strong&gt;Idle&lt;/strong&gt; al de &lt;strong&gt;Jump&lt;/strong&gt;, dando click sobre &lt;em&gt;FINISHED&lt;/em&gt; en el estado &lt;strong&gt;Idle&lt;/strong&gt; y manteniendo el click, arrastramos el mouse y aparecerá una flecha, la arrastramos hacia el estado de &lt;strong&gt;Jump&lt;/strong&gt; y soltamos, el error que nos aparecía se ha quitado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CJy2t9ec--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/p28tpruqki5bdl4u8t92.PNG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CJy2t9ec--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/p28tpruqki5bdl4u8t92.PNG" alt="Alt Text" width="656" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Parece ser que todo esta en orden, si damos play, sucederá:&lt;/p&gt;

&lt;p&gt;-Start&lt;br&gt;
-Entra estado de Idle, cambia de color por 4 segundos&lt;br&gt;
-Se manda llamar el evento FINISHED&lt;br&gt;
-Se hace la transición hacia el estado Jump&lt;br&gt;
-Se le aplica velocidad de 5 en el eje Y&lt;br&gt;
-Termina el comportamieto de la FSM&lt;/p&gt;

&lt;p&gt;-Dado que tiene un componente RigidBody el cubo empezará a caer&lt;br&gt;
-Colisiona con el plano&lt;/p&gt;

&lt;p&gt;Para añadir un poco de diversión y en este caso dejar en un estado de &lt;em&gt;loop&lt;/em&gt; el comportamiento del cubo, en el estado de &lt;strong&gt;Jump&lt;/strong&gt;, vamos a añadir una nueva acción llamada &lt;strong&gt;Wait&lt;/strong&gt;, esta acción lo que hará es hacer que espere x cantidad de tiempo el comportamiento de la FSM y posterior continuara su comportamiento, ya que este añadida la acción, vamos a poner 3 segundos &lt;strong&gt;(1)&lt;/strong&gt;, a su atributo &lt;em&gt;Finish Event&lt;/em&gt; le añadimos el evento &lt;em&gt;FINISHED&lt;/em&gt; &lt;strong&gt;(2)&lt;/strong&gt;, aparecerá el aviso en rojo, le damos click y se agregara el evento debajo del estado &lt;strong&gt;Jump&lt;/strong&gt; &lt;strong&gt;(3)&lt;/strong&gt;, creamos la transición hacia el estado &lt;strong&gt;Idle&lt;/strong&gt; &lt;strong&gt;(4)&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WHoxYPfg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/h2r3zvfegi80gbayds2j.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WHoxYPfg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/h2r3zvfegi80gbayds2j.jpg" alt="Alt Text" width="880" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si ejecutamos el proyecto de unity, observaremos que el cubo hará su comportamiento de manera indefinida, respetando los 4 segundos de duración en el cambio de colores, 3 segundos después de haber saltado.&lt;/p&gt;

&lt;p&gt;Es todo por ahora, queda simplemente explorar y ser curioso con esta herramienta, se pueden lograr cosas muy interesantes e inclusive proyectos completos con esta herramienta, juegos muy reconocidos como &lt;a href="https://unity.com/es/madewith/hollow-knight"&gt;Hollow Knight&lt;/a&gt; la utilizan.&lt;/p&gt;

&lt;p&gt;Ojala te haya servido, espero tus comentarios.&lt;/p&gt;

</description>
      <category>videogames</category>
      <category>unity3d</category>
      <category>playmaker</category>
    </item>
    <item>
      <title>Patrón de diseño Object Pooling en Unity</title>
      <dc:creator>Vicente Contreras</dc:creator>
      <pubDate>Thu, 19 Sep 2019 06:12:32 +0000</pubDate>
      <link>https://dev.to/developervix/patron-de-diseno-object-pooling-en-unity-ecf</link>
      <guid>https://dev.to/developervix/patron-de-diseno-object-pooling-en-unity-ecf</guid>
      <description>&lt;h2&gt;
  
  
  ¿Qué es el Object Pooling?
&lt;/h2&gt;

&lt;p&gt;Imagina cualquier videojuego del genero shooter, ya sea en primera persona o tercera persona; hay un objeto que tienen en común tanto el jugador como los enemigos, que es su armamento, específicamente el uso de &lt;strong&gt;balas&lt;/strong&gt; para las diferentes armas. Hay varias maneras de plantear el disparo en este genero, y en &lt;strong&gt;Unity&lt;/strong&gt; se puede hacer con &lt;em&gt;raycast&lt;/em&gt; o spawnear un objeto, a manera de &lt;em&gt;prefab&lt;/em&gt;, y agregarle una fuerza y una dirección.&lt;/p&gt;

&lt;p&gt;Ahora, si optamos por utilizar el crear objetos que tendrán el comportamiento de la bala, lo más normal es que cuando se presione el botón de disparo tengamos un método para crear una bala, esto a través del método &lt;em&gt;Instantiate&lt;/em&gt; que nos provee unity, al cual deberemos asignar que objeto se quiere crear, asignar una posición y rotación.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;GameObject&lt;/span&gt; &lt;span class="n"&gt;bulletPrefab&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//El objeto bala que se va a crear&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Transform&lt;/span&gt; &lt;span class="n"&gt;spawnPoint&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;//El lugar donde saldrá la bala, cañón de arma&lt;/span&gt;

&lt;span class="c1"&gt;//Este método se manda llamar en cada frame&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetMouseButtonDown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;Instantiate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bulletPrefab&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spawnPoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spawnPoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rotation&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Hay que dejar en claro que este método &lt;em&gt;Instantiate()&lt;/em&gt; nos va a estar creando un &lt;strong&gt;nuevo objeto&lt;/strong&gt; cada vez que lo mandemos llamar, en este caso cuando el jugador presione el botón izquierdo del mouse; haciendo los ajustes necesarios, los enemigos, IA, tendrían algo similar para cuando ellos disparen al jugador, lo cual nos va a &lt;strong&gt;generar muchos objetos en escena&lt;/strong&gt;, que vendrían a ser los objetos del tipo bala, que estarán consumiendo memoria y más cuando no determinemos en que momento esa bala no la necesitemos en tiempo de ejecución, esto puede ocurrir en dos escenarios, la bala impacta sobre un objeto que puede recibir daño, sea jugador, enemigos, barriles explosivos, etc., o impactar sobre una pared, un carro o alguna parte del decorado del nivel, y lo que se suele hacer es lo siguiente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;//script que se encuentra en el objeto bala&lt;/span&gt;

&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnCollisionEnter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Collision&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gameObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CompareTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Enemy"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="nf"&gt;Destroy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;gameObject&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0f&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//Método que destruye a la bala&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Como se muestra en el código de arriba, en cuanto la bala detecte una colisión y se cumpla la condición se destruirá, el método &lt;em&gt;Destroy()&lt;/em&gt; quitará de memoria el objeto que reciba como parámetro, hacer esto un par de veces no afecta; en nuestro ejemplo del shooter digamos que nos encontráramos con 10 enemigos cada uno tendrá sus propias balas que pueden tener de referencia el mismo prefab del tipo bala, cuando cada enemigo dispare mandara llamar el método &lt;em&gt;Instantiate()&lt;/em&gt; y a su vez el jugador también lo hará para responder al ataque, entonces estamos hablando de que 11 objetos (10 enemigos y 1 jugador) estarán creando nuevos objetos del tipo bala cada X segundos dependiendo de la velocidad de disparo de cada quien, haciendo crecer la cantidad de objetos que se muestran en escena y cada uno tendrá su propio comportamiento y su propia detección de colisión para destruirse cuando llegue el momento. Ya podemos empezar a imaginar la enorme cantidad de procesos que se estarán llevando, ya que el &lt;em&gt;Instantiate()&lt;/em&gt; y el &lt;em&gt;Destroy&lt;/em&gt; tiene un costo relativamente elevado y al hacerlo X cantidad de veces de de forma rápida puede causar estragos.&lt;/p&gt;

&lt;p&gt;Es aquí donde el object pool puede ayudarnos a mejorar el rendimiento de nuestro juego, la idea es tener una "alberca" de un determinado tipo de objetos con una cantidad finita de cuantos existirán desde que inicia el juego, se basa que en vez de &lt;strong&gt;destruir y crear&lt;/strong&gt; objetos, los vamos a estar reutilizando y cuando no los necesitemos los mandaremos a una alberca.&lt;/p&gt;

&lt;h2&gt;
  
  
  Un patrón de diseño muy fácil de implementar
&lt;/h2&gt;

&lt;p&gt;Vamos a empezar por definir una clase que estará controlando la alberca de objetos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PoolManagerObjects&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;GameObject&lt;/span&gt; &lt;span class="n"&gt;objPrefab&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;//El objeto que vamos a estar reutilizando&lt;/span&gt;

   &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;poolSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;          &lt;span class="c1"&gt;//Cuantos objetos se necesitaran&lt;/span&gt;

   &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;GameObject&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;objPool&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//La "alberca" donde estarán los objetos&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Utilizamos una cola, &lt;strong&gt;Queue&lt;/strong&gt;, ya que su funcionamiento de primero en entrar, primero en salir viene perfecto para este patrón de diseño, aquí va estar la referencia a los objetos que podremos estar reutilizando en cuanto lo necesitemos.&lt;/p&gt;

&lt;p&gt;Inicializamos la alberca:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PoolManagerObjects&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;GameObject&lt;/span&gt; &lt;span class="n"&gt;objPrefab&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;//El objeto que vamos a estar reutilizando&lt;/span&gt;

   &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;poolSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;          &lt;span class="c1"&gt;//Cuantos objetos se necesitaran&lt;/span&gt;

   &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;GameObject&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;objPool&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//La "alberca" donde estarán los objetos&lt;/span&gt;

   &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="n"&gt;objPool&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;GameObject&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;  &lt;span class="c1"&gt;//Inicializamos la cola&lt;/span&gt;

     &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;poolSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt; &lt;span class="c1"&gt;//Vamos a llenar la alberca en base al tamaño&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="c1"&gt;//Instanciamos el objeto y lo guardamos en una varible temporal    &lt;/span&gt;
         &lt;span class="n"&gt;GameObject&lt;/span&gt; &lt;span class="n"&gt;newObj&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;Instantiate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;objPrefab&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
         &lt;span class="n"&gt;objPool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newObj&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;//Lo añadimos a la cola con Enqueue&lt;/span&gt;
         &lt;span class="n"&gt;newObj&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetActive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    &lt;span class="c1"&gt;//Lo desactivamos ya que en ese momento no se requiere&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Bien, haciendo uso del ciclo for, llenaremos la alberca con una determinada cantidad de objetos en base a la variable &lt;em&gt;poolSize&lt;/em&gt;. Es verdad que estamos haciendo uso del &lt;em&gt;Instantiate()&lt;/em&gt; pero solo se va a realizar una cantidad finita de veces y al inicio del juego, razón de que esto pase en el método &lt;em&gt;Start()&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Ahora, vamos a crear dos métodos que vendrán a sustituir el método &lt;em&gt;Instantiate()&lt;/em&gt; y &lt;em&gt;Destroy()&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PoolManagerObjects&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;MonoBehaviour&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;GameObject&lt;/span&gt; &lt;span class="n"&gt;objPrefab&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;//El objeto que vamos a estar reutilizando&lt;/span&gt;

   &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;poolSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;          &lt;span class="c1"&gt;//Cuantos objetos se necesitaran&lt;/span&gt;

   &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;GameObject&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;objPool&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//La "alberca" donde estarán los objetos&lt;/span&gt;

   &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="n"&gt;objPool&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Queue&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;GameObject&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;();&lt;/span&gt;  &lt;span class="c1"&gt;//Inicializamos la cola&lt;/span&gt;

     &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;poolSize&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;++)&lt;/span&gt; &lt;span class="c1"&gt;//Vamos a llenar la alberca en base al tamaño&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt;
         &lt;span class="c1"&gt;//Instanciamos el objeto y lo guardamos en una varible temporal    &lt;/span&gt;
         &lt;span class="n"&gt;GameObject&lt;/span&gt; &lt;span class="n"&gt;newObj&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;Instantiate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;objPrefab&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  
         &lt;span class="n"&gt;objPool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newObj&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;//Lo añadimos a la cola con Enqueue&lt;/span&gt;
         &lt;span class="n"&gt;newObj&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetActive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    &lt;span class="c1"&gt;//Lo desactivamos ya que en ese momento no se requiere&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;

   &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;GameObject&lt;/span&gt; &lt;span class="nf"&gt;GetObjFromPool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Vector3&lt;/span&gt; &lt;span class="n"&gt;newPosition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Quaternion&lt;/span&gt; &lt;span class="n"&gt;newRotation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;//Se obtiene el 1er objeto disponible en la cola&lt;/span&gt;
        &lt;span class="n"&gt;GameObject&lt;/span&gt; &lt;span class="n"&gt;newObj&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;objPool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Dequeue&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="c1"&gt;//Activamos el objeto, se activa su comportamiento&lt;/span&gt;
        &lt;span class="n"&gt;newObj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetActive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;        
        &lt;span class="c1"&gt;//Le damos la posición y rotación, en donde se necesita que este&lt;/span&gt;
        &lt;span class="n"&gt;newObj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetPositionAndRotation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newPosition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newRotation&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;newObj&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;

   &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;ReturnObjToPool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GameObject&lt;/span&gt; &lt;span class="n"&gt;go&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
   &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;go&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetActive&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;    &lt;span class="c1"&gt;//Lo desactivamos&lt;/span&gt;
        &lt;span class="n"&gt;objPool&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Enqueue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;go&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//Lo volvemos a añadir a la cola para reutilizarlo&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Para terminar, el método &lt;strong&gt;GetObjFromPool()&lt;/strong&gt; sustituye al &lt;em&gt;Instantiate()&lt;/em&gt;, pero en este caso solo nos interesa asignar la posición y rotación del lugar donde necesitemos el objeto de la alberca, eso si, tendremos que tener acceso a la clase &lt;strong&gt;PoolManagerObjects&lt;/strong&gt; para hacer uso del mismo. Ojo aquí, que el método nos va a retornar el objeto.&lt;/p&gt;

&lt;p&gt;Esto ocurre de igual forma con el método &lt;strong&gt;ReturnObjToPool()&lt;/strong&gt; que sustituye al &lt;em&gt;Destroy()&lt;/em&gt;, recibe de parámetro el objeto que queremos regresar a la alberca, se desactiva y se vuelve a encolar.&lt;/p&gt;

&lt;p&gt;Volviendo al ejemplo cuando se presiona el botón del mouse, quedaría de la siguiente manera:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;PoolManagerObjects&lt;/span&gt; &lt;span class="n"&gt;poolManager&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//Hay que asignar desde el inspector el objeto que tenga el script PoolManagerObjects &lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;Transform&lt;/span&gt; &lt;span class="n"&gt;spawnPoint&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;    &lt;span class="c1"&gt;//El lugar donde saldrá la bala, cañón de arma&lt;/span&gt;

&lt;span class="c1"&gt;//Este método se manda llamar en cada frame&lt;/span&gt;
&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;Update&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetMouseButtonDown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
     &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;//Tenemos una referencia del objeto que tomamos de la alberca, &lt;/span&gt;
       &lt;span class="c1"&gt;// esto puede ayudarnos para modificar valores de la bala, acceder a sus componentes, etc.&lt;/span&gt;
        &lt;span class="n"&gt;GameObject&lt;/span&gt; &lt;span class="n"&gt;theBullet&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;poolManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetObjFromPool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spawnPoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;spawnPoint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Rotation&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Y para el caso cuando ya no necesitemos el objeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;//script que se encuentra en el objeto bala&lt;/span&gt;

&lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;PoolManagerObjects&lt;/span&gt; &lt;span class="n"&gt;poolManager&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//Hay que asignar desde el inspector el objeto que tenga el script PoolManagerObjects &lt;/span&gt;

&lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;OnCollisionEnter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Collision&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gameObject&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;CompareTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Enemy"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="c1"&gt;//En cuanto exista una colisión y se cumpla la condición del if&lt;/span&gt;
       &lt;span class="c1"&gt;// mandaremos llamar el método para regresar la bala a la alberca y la podamos reutilizar&lt;/span&gt;
       &lt;span class="n"&gt;poolManager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ReturnObjToPool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gameObject&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Entonces, estamos mejorando bastante el rendimiento de nuestro juego, ya que pasamos de que 11 objetos (enemigos y jugador), estén creando y destruyendo X cantidad de balas, a que todos tengan acceso a una alberca con una cantidad finita de objetos y todos estén utilizando los mismos objetos en cuanto lo requieran.&lt;/p&gt;

&lt;p&gt;Se puede mejorar bastante este patrón, añadiendo un par de elementos para que se vuelva más útil y permita utilizar distintas albercas con objetos diferentes cada una.&lt;/p&gt;

&lt;p&gt;Espero quede entendible este patrón, cualquier comentario que ayude a mejorar es bienvenido.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notas importante&lt;/strong&gt;: &lt;br&gt;
-A la variable poolSize, debemos darle un valor considerable para que no llegue a pasar el error de que se estén utilizando todos los objetos y la alberca este vacía, hay que poner un valor no muy alto pero tampoco tan bajo.&lt;/p&gt;

</description>
      <category>videogame</category>
      <category>unity</category>
      <category>csharp</category>
    </item>
  </channel>
</rss>
