<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[plaiko]]></title><description><![CDATA[The batch of game developers.]]></description><link>https://plaiko.com/</link><image><url>https://plaiko.com/favicon.png</url><title>plaiko</title><link>https://plaiko.com/</link></image><generator>Ghost 5.59</generator><lastBuildDate>Sat, 21 Feb 2026 10:52:17 GMT</lastBuildDate><atom:link href="https://plaiko.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Singleton Quest]]></title><description><![CDATA[<p>iOS and Android mobile app which helps corporations implement change management best practices in their organizations. </p>]]></description><link>https://plaiko.com/singleton-quest/</link><guid isPermaLink="false">67ee687756c3d9ada2322609</guid><dc:creator><![CDATA[nolike (Arthur B.)]]></dc:creator><pubDate>Thu, 03 Apr 2025 10:55:16 GMT</pubDate><media:content url="https://plaiko.com/content/images/2025/04/singleton-quest-title.png" medium="image"/><content:encoded><![CDATA[<img src="https://plaiko.com/content/images/2025/04/singleton-quest-title.png" alt="Singleton Quest"><p>iOS and Android mobile app which helps corporations implement change management best practices in their organizations. </p>]]></content:encoded></item><item><title><![CDATA[Robotap]]></title><description><![CDATA[<p>Robotap is a mobile game for kids on iOS and Android platforms. </p><figure class="kg-card kg-embed-card"><iframe width="200" height="150" src="https://www.youtube.com/embed/4wbaDjFhRGE?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="Robotap Gameplay Trailer"></iframe></figure>]]></description><link>https://plaiko.com/robotap/</link><guid isPermaLink="false">67ee62b456c3d9ada23225f3</guid><category><![CDATA[Projects]]></category><dc:creator><![CDATA[nolike (Arthur B.)]]></dc:creator><pubDate>Thu, 03 Apr 2025 10:37:37 GMT</pubDate><media:content url="https://plaiko.com/content/images/2025/04/RoboTap_icon_432-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://plaiko.com/content/images/2025/04/RoboTap_icon_432-1.png" alt="Robotap"><p>Robotap is a mobile game for kids on iOS and Android platforms. </p><figure class="kg-card kg-embed-card"><iframe width="200" height="150" src="https://www.youtube.com/embed/4wbaDjFhRGE?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="Robotap Gameplay Trailer"></iframe></figure>]]></content:encoded></item><item><title><![CDATA[Clumsy Runners]]></title><description><![CDATA[<p>Clumsy Runners is a 2D platformer game made with <a href="https://unity.com/?ref=plaiko.com">Unity</a>.</p><p>The game has an unusual running mechanics which easy to learn, hard to master. To make character run player has to push two buttons alternately. Each of the buttons are corresponding to player leg. If player misses the correct button</p>]]></description><link>https://plaiko.com/clumsy-runners/</link><guid isPermaLink="false">64e37c2e5727330341e17579</guid><category><![CDATA[Projects]]></category><dc:creator><![CDATA[nolike (Arthur B.)]]></dc:creator><pubDate>Wed, 03 Apr 2024 15:35:00 GMT</pubDate><media:content url="https://plaiko.com/content/images/2024/07/drago_plaiko-1.png" medium="image"/><content:encoded><![CDATA[<img src="https://plaiko.com/content/images/2024/07/drago_plaiko-1.png" alt="Clumsy Runners"><p>Clumsy Runners is a 2D platformer game made with <a href="https://unity.com/?ref=plaiko.com">Unity</a>.</p><p>The game has an unusual running mechanics which easy to learn, hard to master. To make character run player has to push two buttons alternately. Each of the buttons are corresponding to player leg. If player misses the correct button - character is going to fall on the ground and lose precious time used for running away from main enemy. </p><p></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://plaiko.com/content/images/2023/10/ss_105d467c6fab05c44230590715c3d5f1ff6bd1d8.1920x1080.jpg" class="kg-image" alt="Clumsy Runners" loading="lazy" width="1280" height="720" srcset="https://plaiko.com/content/images/size/w600/2023/10/ss_105d467c6fab05c44230590715c3d5f1ff6bd1d8.1920x1080.jpg 600w, https://plaiko.com/content/images/size/w1000/2023/10/ss_105d467c6fab05c44230590715c3d5f1ff6bd1d8.1920x1080.jpg 1000w, https://plaiko.com/content/images/2023/10/ss_105d467c6fab05c44230590715c3d5f1ff6bd1d8.1920x1080.jpg 1280w" sizes="(min-width: 720px) 720px"><figcaption>Clumsy Runners game. Factory level</figcaption></figure><p></p><p>Game has variety of environments and game mechanics and feels not that simple as it looks at the first glance. For instance, after each level player is offered to buy upgrades in exchange for psy energy aquired during the game session. These upgrades impact player&apos;s progression strategy and if chosen wisely are able to help overcome game challenges drastically. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://plaiko.com/content/images/2023/10/ss_9cfcf17219ef3a9bbcd42ef5fb534d4cbaf39d4a.600x338.jpg" class="kg-image" alt="Clumsy Runners" loading="lazy" width="600" height="337" srcset="https://plaiko.com/content/images/2023/10/ss_9cfcf17219ef3a9bbcd42ef5fb534d4cbaf39d4a.600x338.jpg 600w"><figcaption>Clumsy Runners game. Character upgrades</figcaption></figure><p>Currently one can play <a href="https://store.steampowered.com/app/455590/Skedaddle/?ref=plaiko.com">Clumsy Runners on Steam</a> early access. On the time of writing, Plaiko team is working on full game release with next features included, which are not at the game yet: <br>- couch co-op<br>- endless run mode<br>- on-line multiplayer<br>- core gameplay mechanics which make game progression just a bit less frustrating, like resetting progress on each character death. </p><p>Stay tuned for more updates in <a href="https://discord.gg/NmGKKxAm?ref=plaiko.com">our Discord community</a>.</p>]]></content:encoded></item><item><title><![CDATA[Citizens Cup]]></title><description><![CDATA[Citizens cup is a skill based game developed by Plaiko.]]></description><link>https://plaiko.com/citizens-cup/</link><guid isPermaLink="false">6520125574126def7c1efb66</guid><category><![CDATA[Projects]]></category><dc:creator><![CDATA[nolike (Arthur B.)]]></dc:creator><pubDate>Sun, 15 Oct 2023 13:16:20 GMT</pubDate><media:content url="https://plaiko.com/content/images/2024/07/cc_app_icon_512px.png" medium="image"/><content:encoded><![CDATA[<img src="https://plaiko.com/content/images/2024/07/cc_app_icon_512px.png" alt="Citizens Cup"><p>Citizens Cup is a skill based gaming app where you compete with other players by completing simple drawings. Player who achieves better results is a winner. There are options to compete for real money or just for fun.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://plaiko.com/content/images/2023/10/citizenscup_post_picture-2.jpg" class="kg-image" alt="Citizens Cup" loading="lazy" width="1921" height="1280" srcset="https://plaiko.com/content/images/size/w600/2023/10/citizenscup_post_picture-2.jpg 600w, https://plaiko.com/content/images/size/w1000/2023/10/citizenscup_post_picture-2.jpg 1000w, https://plaiko.com/content/images/size/w1600/2023/10/citizenscup_post_picture-2.jpg 1600w, https://plaiko.com/content/images/2023/10/citizenscup_post_picture-2.jpg 1921w" sizes="(min-width: 720px) 720px"><figcaption>Citizens Cup App Development</figcaption></figure><h2 id="core-gameplay">Core gameplay</h2><p>There are game sessions which are happening daily at certain time. Time of the next game is available on the main screen of the app. </p><p>Each game starts from $1 stake from each player. If player wins the round against their opponent, this player is able to cash out $2 (initial stake + stake of the opponent). <br><strong>Loser player</strong> is able to buyback into the next round, by putting $2 stake now, as next round is going to be played for x2 amount of the previous round. </p><p><strong>Winner player</strong> decides if they want to continue playing into the next round or cash out and quit today&apos;s game session. &#xA0; </p><p>Current game session is going to continue while there are at least 2 players who&apos;re willing to continue playing with each other. Though, loser player is able to buyback one time only, so player would not lose too much of their funds. </p><h2 id="technologies">Technologies</h2><p>We use Unity / C# for client side development and dotnet core / MariaDB / C# for server side business logic. &#xA0;</p><p>For server-client communication we use HTTP requests and Websockets for bidirectional messages. We were thinking of using MQTT protocol specifically for that case, but considering the scope and nature of our gameplay logic we decided it&apos;s not going to be perfectly suitable for our needs. In case if we decide to decompose server side logic into micro services somewhere further in the development cycle we might reconsider using MQTT. &#xA0;</p><p>On the client side we did <a href="https://plaiko.com/flexible-ui-architecture-for-unity-development/">implement bunch of UI components</a> and used our material design implementation for Unity. </p><h2 id="challenges">Challenges</h2><p>There are 3 main technical challenges we encountered so far: </p><ol><li>Stable client-server communication using mixed protocols approach with websockets and http.</li><li>Performant solution for real-time drawing on mobile devices.</li><li>Scalability of the server side to be able to support thousands of players in real-time play sessions. &#xA0;</li></ol><p>We are going to describe solutions to the these challenges in separate blog posts. </p><p></p><p>Citizens Cup is currently available on the AppStore in the US region.</p>]]></content:encoded></item><item><title><![CDATA[Building flexible UI architecture for Unity development projects.]]></title><description><![CDATA[<div class="kg-card kg-header-card kg-width-full kg-size-small kg-style-dark" style data-kg-background-image><h2 class="kg-header-card-header" id="strongproblemstrong"><strong>Problem</strong></h2></div><p><strong>&#x2003;</strong>When creating Unity UI for games or applications, we often encounter a situation where there are many similar elements in terms of functionality but different in the types of data they visualize. I want to have a system (hierarchy) where it&apos;s easy to create new elements</p>]]></description><link>https://plaiko.com/flexible-ui-architecture-for-unity-development/</link><guid isPermaLink="false">65104dc074126def7c1efa6a</guid><category><![CDATA[Unity3d]]></category><dc:creator><![CDATA[Oleksandr Horoshko]]></dc:creator><pubDate>Mon, 25 Sep 2023 09:57:58 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card kg-header-card kg-width-full kg-size-small kg-style-dark" style data-kg-background-image><h2 class="kg-header-card-header" id="strongproblemstrong"><strong>Problem</strong></h2></div><p><strong>&#x2003;</strong>When creating Unity UI for games or applications, we often encounter a situation where there are many similar elements in terms of functionality but different in the types of data they visualize. I want to have a system (hierarchy) where it&apos;s easy to create new elements without copy-pasting and generating a lot of redundant code. Below, I&apos;ve provided an example of elements that share the functionality of an infinite scroll list but display different data. What should I use as a solution?</p><figure class="kg-card kg-gallery-card kg-width-wide"><div class="kg-gallery-container"><div class="kg-gallery-row"><div class="kg-gallery-image"><img src="https://plaiko.com/content/images/2023/09/image3.png" width="399" height="710" loading="lazy" alt></div><div class="kg-gallery-image"><img src="https://plaiko.com/content/images/2023/09/image2.png" width="399" height="708" loading="lazy" alt></div><div class="kg-gallery-image"><img src="https://plaiko.com/content/images/2023/09/image1.png" width="359" height="625" loading="lazy" alt></div></div></div></figure><div class="kg-card kg-header-card kg-width-full kg-size-small kg-style-dark" style data-kg-background-image><h2 class="kg-header-card-header" id="solution">Solution</h2></div><p><strong>&#x2003;</strong>Let&apos;s abstract the data which we need to populate infinite lists with. We have a base class responsible for handling the scrolling logic of our list. Its primary responsibility is to create the illusion that the user is scrolling through a vast stream of elements (the base class does not know what these elements are). However, during scrolling and element replacement, it should populate them with current data from the abstract data list. The data type should be easily replaceable, and it should still be possible to view/edit the data from the Unity editor. This way, the list script can be used to visualize various types of data: payment history, user activity history, match history, task list, achievements, etc.</p><blockquote><strong><em>PopulateData </em>- Base Data Class.</strong></blockquote><pre><code class="language-csharp">// Enum for determine data type
public enum DataType {...}

// Base data class
[Serializable]
public abstract class PopulateData {
   // The abstract property that we need to define in each data class that inherits from PopulateData.  
   public abstract DataType DataType { get; }
}
</code></pre><p>&#x2003;Thanks to the fact that the DataType property requires overriding in derived classes, we always know which data type we are working with, directly from the base PopulateData.</p><p>&#x2003;For populating elements with data, the IPopulateElement interface is used, and all elements that need to be populated with data inherit from it.</p><blockquote><strong>Interface <em>IPopulateElement</em></strong></blockquote><pre><code class="language-csharp">public interface IPopulateElement&lt;T&gt; where T : PopulateData {
   public void Populate(T data);
}
</code></pre><p><strong><em>&#x2003;</em></strong><em>IPopulateElement </em>serves as a common entry point for populating elements with data. It is designed as a generic interface to define the static data type that a specific element will display.</p><blockquote><strong>List base class &#x2013; <em>InfinityScrollList</em></strong></blockquote><pre><code class="language-csharp">public abstract class InfinityScrollList&lt;T&gt; : BaseUIElement, IBeginDragHandler, IDragHandler, IEndDragHandler where T : PopulateData {
     
     // Checking and controlling the number of elements in the scene 
     // Checking the availability of data for visualization 
     // Populating elements with data
     public virtual void Activate() {...}

     // Begin drag logic
     public void OnBeginDrag(PointerEventData eventData) {...}
     
     // Drag logic
     public void OnDrag(PointerEventData eventData) {...}

     // End drag logic
     public void OnEndDrag(PointerEventData eventData) {...}
     
     // Populating an element with data
     protected void PopulateChild(Transform child, int dataIndex) {
     	  // Better to add collection to not over use GetComponent-method
          child.GetComponent&lt;IPopulateElement&lt;T&gt;&gt;()?.Populate(dataList[dataIndex]);
     }
}</code></pre><p>&#x2003;During scrolling, elements are populated with current data. To be able to create different types of elements and populate them with different data types, we use the base abstract data class <em>PopulateData</em>.</p><div class="kg-card kg-header-card kg-width-full kg-size-small kg-style-dark" style data-kg-background-image><h2 class="kg-header-card-header" id="example-and-usage">Example and Usage</h2></div><blockquote><strong>HistoryInfinityScrollList - a class for displaying balance changes</strong></blockquote><p>&#x2003;Let&apos;s create a class that will display a list of player balance changes.</p><p>Conditions:</p><ul><li>The class should inherit from the base class for an infinite list (InfiniteScrollList).</li><li>There should be validation and control of the number of elements in the scene.</li><li>Before populating the list, there should be a validation for the availability of data for visualization.</li></ul><pre><code class="language-csharp">public class HistoryInfinityScrollList : InfinityScrollList&lt;HistoryInfinityScrollList.HistoryData&gt; {

   // Base Data class of HistoryInfinityScrollList
   public abstract class HistoryData : PopulateData {
       public override DataType DataType =&gt; DataType.HistoryData;
       public enum ElementType {
           ACTION,
           SESSION
       }

       // Abstract Enum Property for Defining Local Data Type
       public abstract ElementType Type { get; set; }
       [field: SerializeField] public DateTime DateTime { get; set; }
   }

   // Class for Player Action Data that Caused Balance Change
   public class ActionData : HistoryData {
       // Overriding Local Data Type
       [field: SerializeField] public override ElementType Type { get; set; } = ElementType.ACTION;
       #region DataFields
           ...
       #endregion
   }
   
   // Class for Session Start Data
   public class SessionData : HistoryData {
       // Redefining Local Data Type
       [field: SerializeField] public override ElementType Type { get; set; } = ElementType.SESSION;
   } 
}
</code></pre><blockquote><strong><em>HistoryElement </em>- a class that will be interacted by <em>HistoryInfinityScrollList</em></strong></blockquote><p>&#x2003;Since we need to support two different types of data, let&apos;s create <em>HistoryElement </em>as a layer that will determine which final element to display and populate with data.</p><blockquote><strong><em>ActionHistoryElement </em>and <em>GameNightElement </em>- final elements</strong></blockquote><p>&#x2003;These classes simply populate the necessary UI components (<em>Image</em>, <em>TextMeshProUGUI</em>, etc.) with the required data.</p><pre><code class="language-csharp">public class ActionHistoryElement : MonoBehaviour, IPopulateElement&lt;HistoryInfinityScrollList.ActionData&gt; {
    // Populating Element with Data
    public void Populate(HistoryInfinityScrollList.ActionData data) {...}
}
</code></pre><pre><code class="language-csharp">public class GameNightElement : MonoBehaviour, IPopulateElement&lt;SessionData&gt; {
   // Populating Element with Data
   public void Populate(SessionData historyData) {...}
}
</code></pre><blockquote><strong>&#x2003;Hierarchy in the Scene</strong></blockquote><p>&#x2003;To control the switching and populating of <em>ActionHistoryElement </em>and <em>GameNightElement</em>, they are child objects of <em>HistoryElement</em>. The hierarchy of all other elements that will inherit from InfinityScrollList will be similar, with the difference being in populating the base element that will be filled with data.</p><figure class="kg-card kg-image-card"><img src="https://plaiko.com/content/images/2023/09/image3--1-.png" class="kg-image" alt loading="lazy" width="406" height="422"></figure><div class="kg-card kg-header-card kg-width-full kg-size-small kg-style-dark" style data-kg-background-image><h2 class="kg-header-card-header" id="strongconclusionsstrong"><strong>Conclusions</strong></h2></div><p>&#x2003;We now have the ability to create UI infinite lists populated with the necessary data types, and we can also expand the base functionality as needed. Here is what we achieved:</p><ul><li>Understanding for creating similar UI elements in the future.</li><li>Ability to prevent chaos in the project.</li><li>Shared hierarchy in infinite lists.</li></ul><figure class="kg-card kg-image-card kg-width-full"><img src="https://plaiko.com/content/images/2023/09/_--------------------------------------Unity-UI.drawio--5-.png" class="kg-image" alt loading="lazy" width="1581" height="684" srcset="https://plaiko.com/content/images/size/w600/2023/09/_--------------------------------------Unity-UI.drawio--5-.png 600w, https://plaiko.com/content/images/size/w1000/2023/09/_--------------------------------------Unity-UI.drawio--5-.png 1000w, https://plaiko.com/content/images/2023/09/_--------------------------------------Unity-UI.drawio--5-.png 1581w"></figure>]]></content:encoded></item></channel></rss>