<?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: Balconygames</title>
    <description>The latest articles on DEV Community by Balconygames (@balconygames).</description>
    <link>https://dev.to/balconygames</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%2Forganization%2Fprofile_image%2F500%2F2ab583ca-7abe-469f-bbbf-2ae42524204f.png</url>
      <title>DEV Community: Balconygames</title>
      <link>https://dev.to/balconygames</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/balconygames"/>
    <language>en</language>
    <item>
      <title>Road to ecommerce via Gumroad :)</title>
      <dc:creator>Alexandr K</dc:creator>
      <pubDate>Mon, 27 Dec 2021 22:11:34 +0000</pubDate>
      <link>https://dev.to/balconygames/road-to-ecommerce-via-gumroad--20nh</link>
      <guid>https://dev.to/balconygames/road-to-ecommerce-via-gumroad--20nh</guid>
      <description>&lt;p&gt;Hi everyone!&lt;/p&gt;

&lt;p&gt;I've just started to sell of my game arts and complete games based on Unity engine that it could be useful for someone. I decided to focus on building the new games and one more coming the next month for testing the audience in TD style.&lt;/p&gt;

&lt;p&gt;But for now I need to capture some budget for the marketing the new game. Hope it will be possible to do it with wonderful platform Gumroad. I've just discovered how easy to create the products pages and start selling it.&lt;/p&gt;

&lt;p&gt;Products:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://balconygames.gumroad.com/l/game-dont-fall/happycoding?_gl=1*2dery6*_ga*MTg3ODY3OTMxNS4xNjM3MTgzMjQw*_ga_6LJN6D94N6*MTY0MDY0Mjc2MC4xMy4xLjE2NDA2NDI5MjUuMA.." rel="noopener noreferrer"&gt;Complete Game - Don't Fall&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;a href="https://play.google.com/store/apps/details?id=com.balconygames.dontfall" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.balconygames.dontfall&lt;/a&gt;&lt;br&gt;
&lt;a href="https://apps.apple.com/es/app/dont-fall-by-balcony-games/id1460842492" rel="noopener noreferrer"&gt;https://apps.apple.com/es/app/dont-fall-by-balcony-games/id1460842492&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://balconygames.gumroad.com/l/dont-fall-art/bsfr4ww?_gl=1*1k5lihx*_ga*MTg3ODY3OTMxNS4xNjM3MTgzMjQw*_ga_6LJN6D94N6*MTY0MDY0Mjc2MC4xMy4xLjE2NDA2NDI5OTQuMA.." rel="noopener noreferrer"&gt;Game Art - Don't Fall, older version&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://balconygames.gumroad.com/l/snake-game-art/bsfr4ww?_gl=1*1jr3fd8*_ga*MTg3ODY3OTMxNS4xNjM3MTgzMjQw*_ga_6LJN6D94N6*MTY0MDY0Mjc2MC4xMy4xLjE2NDA2NDMwMTIuMA.." rel="noopener noreferrer"&gt;Game Art - Snake&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;a href="https://play.google.com/store/apps/details?id=com.balconygames.snake" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.balconygames.snake&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://balconygames.gumroad.com/l/paiint-swipe-game/bsfr4ww?_gl=1*o9b1hp*_ga*MTg3ODY3OTMxNS4xNjM3MTgzMjQw*_ga_6LJN6D94N6*MTY0MDY0Mjc2MC4xMy4xLjE2NDA2NDMwMzIuMA.." rel="noopener noreferrer"&gt;Game Art - Paint Swipe&lt;/a&gt; - this game I didn't finish it but I will polish and share the source code later as well. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

&lt;p&gt;Thank you!&lt;/p&gt;

&lt;p&gt;Alex.&lt;/p&gt;

</description>
      <category>gameart</category>
      <category>gamedev</category>
      <category>ecommerce</category>
      <category>gumroad</category>
    </item>
    <item>
      <title>New version of Crystal Blast 2.0</title>
      <dc:creator>Alexandr K</dc:creator>
      <pubDate>Mon, 20 Jul 2020 06:19:50 +0000</pubDate>
      <link>https://dev.to/balconygames/new-version-of-crystal-blast-3922</link>
      <guid>https://dev.to/balconygames/new-version-of-crystal-blast-3922</guid>
      <description>&lt;p&gt;Hi everyone!&lt;/p&gt;

&lt;p&gt;Finally, we have just published the new version of &lt;a href="https://play.google.com/store/apps/details?id=com.balconygames.CrystalBlast" rel="noopener noreferrer"&gt;Crystal Blast - Google Play&lt;/a&gt; and waiting for review success in &lt;a href="https://apps.apple.com/us/app/crystal-blast/id1451868968" rel="noopener noreferrer"&gt;Crystal Blast - App Store&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We added the wonderful sound effects, more ways to earn coins (it's only about the monetization, we added for the players to fast grow their weapons, ships), leaderboard.&lt;/p&gt;

&lt;p&gt;As part of this build, I started to use my own game server for collecting analytics, storing player game settings, leaderboard. &lt;/p&gt;

&lt;p&gt;Working on cleaning up the server-side code and share with the community as a good entry point for indie game developers.&lt;/p&gt;

&lt;p&gt;Stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;li&gt;ClickHouse&lt;/li&gt;
&lt;li&gt;NSQ&lt;/li&gt;
&lt;li&gt;ansible + docker-compose as the fastest way to just deploy the app.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thank you for reading!&lt;/p&gt;

&lt;p&gt;Best regards,&lt;br&gt;
Alexandr.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>indiegame</category>
      <category>indiegamedev</category>
    </item>
    <item>
      <title>Started to build game server for indie developers</title>
      <dc:creator>Alexandr K</dc:creator>
      <pubDate>Wed, 17 Jun 2020 13:50:44 +0000</pubDate>
      <link>https://dev.to/balconygames/started-to-build-game-server-for-indie-developers-1j9m</link>
      <guid>https://dev.to/balconygames/started-to-build-game-server-for-indie-developers-1j9m</guid>
      <description>&lt;p&gt;For the last months I didn't write anything, isolation in the house, work and work. Searching for the new contracts to work in free time, it was a bit exhausting :) and I decided to build something new for me.&lt;/p&gt;

&lt;p&gt;I've just started to work on generic purporse game server for indie developers. I have already implemented key, value storage, leaderboards, guest auth by device id and working on the social networking.&lt;/p&gt;

&lt;p&gt;I know that nakame exists, but it's challenge to make my own server and apply it for the current games in the market. Crystal Blast starting from 2.1 release version would use own analytics platform and storage instead of Firebase.&lt;/p&gt;

&lt;p&gt;Plan to go away for external tools like firebase, game services and have everything in house and in the same time as cheap as possible.&lt;/p&gt;

&lt;p&gt;Planning to open source it in 2-3 months if the games in prod will work fine.&lt;/p&gt;

&lt;p&gt;Update: &lt;a href="https://crystalblast.page.link/install" rel="noopener noreferrer"&gt;Crystal Blast&lt;/a&gt; is going to have sounds, leaderboards, settings syncing between platforms by using social sign in.&lt;/p&gt;

</description>
      <category>go</category>
      <category>status</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Crystal Blast 2.0</title>
      <dc:creator>Alexandr K</dc:creator>
      <pubDate>Sun, 12 Apr 2020 09:13:30 +0000</pubDate>
      <link>https://dev.to/balconygames/crystal-blast-2-0-303l</link>
      <guid>https://dev.to/balconygames/crystal-blast-2-0-303l</guid>
      <description>&lt;p&gt;Hey.&lt;/p&gt;

&lt;p&gt;Finally, we published our changes as &lt;a href="https://crystalblast.page.link/install" rel="noopener noreferrer"&gt;Crystal Blast 2.0&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;37 new backgrounds&lt;/li&gt;
&lt;li&gt;new gameplay UI&lt;/li&gt;
&lt;li&gt;better gameplay balance&lt;/li&gt;
&lt;li&gt;new crystal types&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It was a pretty hard journey for us this year. Free time for us meant nights of work.&lt;/p&gt;

&lt;p&gt;Today we had the first purchase and got the new power to polish the game:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fapgg9a7qi1aihzlrjgxs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fapgg9a7qi1aihzlrjgxs.png" alt="Alt Text" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Recently our balcony games became the company of friends who definitely works on the balcony because of quarantine. Hope everything will be resolved and everyone will enjoy the summer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crystalblast.page.link/install" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fog7bhvbep8qcasg6u4f2.png" alt="Alt Text" width="256" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>indiedev</category>
      <category>indiegamedev</category>
      <category>unity3d</category>
    </item>
    <item>
      <title>[GameDev] Crystal Blast - The Recent Update</title>
      <dc:creator>Alexandr K</dc:creator>
      <pubDate>Wed, 07 Aug 2019 16:37:16 +0000</pubDate>
      <link>https://dev.to/balconygames/game-crystal-blast-the-recent-update-26l3</link>
      <guid>https://dev.to/balconygames/game-crystal-blast-the-recent-update-26l3</guid>
      <description>&lt;p&gt;Hi everyone!&lt;/p&gt;

&lt;p&gt;Since the last time we didn't have a lot time to work but we are still working in free time in gamedev industry. Hope it would become profitable in the future :)&lt;/p&gt;

&lt;p&gt;We finally published the game in App Store market and Google Play the recent updates.&lt;/p&gt;

&lt;p&gt;Notes about the well known issues for us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Marketing is hard :) it's really impossible to promote the games without the buying ads. Huge money flow for Google and Apple to boost the games to the top of the search or trending. Tried to contact two publishers but it looks like game play of our &lt;a href="https://play.google.com/store/apps/details?id=com.balconygames.CrystalBlast" rel="noopener noreferrer"&gt;Crystal Blast&lt;/a&gt; game is not attractive as Hyper Casual trends these days. For now we have just tried to boost specific country with low cost per install and use specific descriptions to give a try to become top#5 in google play searches. Google Play store is working good enough but it's hard to target audience by specific attributes comparing with facebook ads.&lt;/li&gt;
&lt;li&gt;Unity helps a lot to develop the games but cross platform doesn't mean it would be really easy to support game center, google play services, push notifications and so on.&lt;/li&gt;
&lt;li&gt;Google &lt;a href="https://firebase.google.com/" rel="noopener noreferrer"&gt;Firebase&lt;/a&gt; is great, out of the box BigQuery integration on plan Pay as You Go. Easily save queries to analyze the traffic, data studio is great as well, everyone could build charts based on data source from BigQuery.&lt;/li&gt;
&lt;li&gt;Microsoft &lt;a href="//appcenter.ms"&gt;appcenter.ms&lt;/a&gt; is really great as well to make the distributions for testers via fastlane from the local machine. But for now it's impossible to distribute Android Bundles that's major change in Google Play since 1 August. &lt;a href="http://azure.microsoft.com" rel="noopener noreferrer"&gt;Azure&lt;/a&gt; Application Insights is great as well but for now it's much harder to review events comparing with Firebase and DataStudio. But I am still giving chance for both platforms.&lt;/li&gt;
&lt;li&gt;
&lt;a href="//appcenter.ms"&gt;appcenter.ms&lt;/a&gt; is missing good support for push notifications campaigns but in the same time &lt;a href="https://firebase.google.com/" rel="noopener noreferrer"&gt;Firebase&lt;/a&gt; has predictions on churn, not churn users and it's much easy to setup notifications for target audience.&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://jizc.github.io/CloudOnce/" rel="noopener noreferrer"&gt;CloudOnce&lt;/a&gt; is wonderful unity plugin to have support of Play Game Services and Game Center. it's easy to write own provider if you decide to use with Amazon or Chinese market.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I would appreciate for any feedback about the game.&lt;/p&gt;

&lt;p&gt;P.S.: Looking for game art designer to join to our team ( no profit for now :) ) it's a lot of fun and possible opportunity to grow together.&lt;/p&gt;

&lt;p&gt;Continue to collect the notes :0 &lt;/p&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.balconygames.CrystalBlast" rel="noopener noreferrer"&gt;Google Play&lt;/a&gt;&lt;br&gt;
&lt;a href="https://apps.apple.com/us/app/crystal-blast/id1451868968" rel="noopener noreferrer"&gt;App Store&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>unity3d</category>
      <category>indie</category>
      <category>startup</category>
    </item>
    <item>
      <title>[GameDev] Snake</title>
      <dc:creator>Alexandr K</dc:creator>
      <pubDate>Fri, 15 Mar 2019 14:56:53 +0000</pubDate>
      <link>https://dev.to/balconygames/gamedev-snake-1f5f</link>
      <guid>https://dev.to/balconygames/gamedev-snake-1f5f</guid>
      <description>&lt;p&gt;Hi everyone.&lt;/p&gt;

&lt;p&gt;I've just released the new game but it looks like going to keep focus on adding extra nice features to the previous games for the next releases. Started to learn Adobe Animation looks like Flash that I used to use the years ago.&lt;/p&gt;

&lt;p&gt;It's becoming harder to continue :() but now in free time planning to spend more for animation or find someone to help with it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.balconygames.snake" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.balconygames.snake&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hopefully, it looks good as time-killer app again. :)&lt;/p&gt;

&lt;p&gt;Thank you for reading!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy25uq0btucwxcxvs2a03.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy25uq0btucwxcxvs2a03.png" alt="screenshot1" width="724" height="1280"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdhfjcxr7mpkanb72w3ke.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdhfjcxr7mpkanb72w3ke.png" alt="screenshot2" width="712" height="1272"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>indiedev</category>
      <category>game</category>
      <category>unity3d</category>
    </item>
    <item>
      <title>[GameDev] Don't Fall</title>
      <dc:creator>Alexandr K</dc:creator>
      <pubDate>Wed, 27 Feb 2019 22:14:00 +0000</pubDate>
      <link>https://dev.to/balconygames/dont-fall-5g8h</link>
      <guid>https://dev.to/balconygames/dont-fall-5g8h</guid>
      <description>&lt;p&gt;Hi everyone!&lt;/p&gt;

&lt;p&gt;Today I finally published the new game for Google Play. &lt;/p&gt;

&lt;p&gt;Nothing special to say for now in terms of development. Probably the exciting part that I've decided to give a try and use &lt;a href="https://appcenter.ms" rel="noopener noreferrer"&gt;https://appcenter.ms&lt;/a&gt;. Microsoft did the nice sdk for mobile developers to have analytics dashboard, easy setup for push notifications(basic audience support based on tracked events). Only the one thing that it's not usable for now if you are Unity developer that's the build system. In the build system you can choose for now Android, iOS projects to build and distribute to the stores but it's impossible to have custom setup to make the exports of the builds from unity to xcode, gradle projects.&lt;/p&gt;

&lt;p&gt;I believe I will use Gitlab hooks to export the projects to xcode, gradle submodules and push it to Github because appcenter haven't started the support for Gitlab as repository to sync yet. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.balconygames.dontfall" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.balconygames.dontfall&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hopefully, it looks good as time-killer app.&lt;/p&gt;

&lt;p&gt;Thank you for reading!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QbGjJ00d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/huqad1rsdby3e3aypfzt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QbGjJ00d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/huqad1rsdby3e3aypfzt.png" alt="screenshot1" width="724" height="1282"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kP1kQkAx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/enbkz0r2sbu5rp8zwtjf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kP1kQkAx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/enbkz0r2sbu5rp8zwtjf.png" alt="screenshot2" width="722" height="1282"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9MWF2bkq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/6n43mbeyjjne4uoz1yhj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9MWF2bkq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/6n43mbeyjjne4uoz1yhj.png" alt="screenshot3" width="714" height="1270"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>indiedev</category>
      <category>game</category>
      <category>unity3d</category>
    </item>
    <item>
      <title>[GameDev] Crystal Blast</title>
      <dc:creator>Alexandr K</dc:creator>
      <pubDate>Thu, 14 Feb 2019 00:01:52 +0000</pubDate>
      <link>https://dev.to/balconygames/crystal-blast-9g1</link>
      <guid>https://dev.to/balconygames/crystal-blast-9g1</guid>
      <description>&lt;p&gt;Hi everyone!&lt;/p&gt;

&lt;p&gt;Few days ago we published the new game. No ads, no payments, it's only about the fun. The technicals issues are still happing for us because the game dev is new are for us.&lt;/p&gt;

&lt;p&gt;Briefly that can't handle ourselves now but probably the community could help us to find out the problem.&lt;/p&gt;

&lt;p&gt;We are using Unity. It's awesome platform for fast prototyping the games for multiple platforms.&lt;/p&gt;

&lt;p&gt;The issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;on using Android publish for our other game ( &lt;a href="https://play.google.com/store/apps/details?id=com.balconygames.sweetyjumper" rel="noopener noreferrer"&gt;Sweety Jumper&lt;/a&gt; ) we added in app purchases package and ads package (google ads). it compiles well enough but after the installation on the device it didn't open the ads and it's impossible to buy anything in production or beta testing modes for purchases. Did anyone have the same issues on building for android from Unity? ios is working fine on device in the same.
Probably someone can suggest anything how to debug it properly, I believe it could be the dependencies with jars on building the apk but don't see the proper way how to resolve it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our game new game is &lt;a href="https://play.google.com/store/apps/details?id=com.balconygames.CrystalBlast" rel="noopener noreferrer"&gt;Crystal Blast&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Product Hunt for Upvotes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sweety Jumper &lt;a href="https://www.producthunt.com/posts/sweety-jumper" rel="noopener noreferrer"&gt;Up&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Crystal Blast &lt;a href="https://www.producthunt.com/posts/crystal-blast" rel="noopener noreferrer"&gt;Up&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have time please review the game, I would appreciate.&lt;/p&gt;

&lt;p&gt;Thank you for reading!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--EHKd8wcr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/f9nezuzng1584d0ohjye.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--EHKd8wcr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/f9nezuzng1584d0ohjye.png" alt="image1" width="513" height="910"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yp38H94l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/wxe01vj66150r979iz2o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yp38H94l--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/wxe01vj66150r979iz2o.png" alt="image2" width="511" height="909"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PHNeouwx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/gggekuxlcwesvp4michr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PHNeouwx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/gggekuxlcwesvp4michr.png" alt="image3" width="512" height="909"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ANaWghG7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/qgxvnpq8cy2rojhcqvzr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ANaWghG7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/qgxvnpq8cy2rojhcqvzr.png" alt="image4" width="512" height="909"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--npgt-F5C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/1bncnwcm9lo6qmho4y0s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--npgt-F5C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://thepracticaldev.s3.amazonaws.com/i/1bncnwcm9lo6qmho4y0s.png" alt="image5" width="513" height="909"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>unity3d</category>
      <category>startup</category>
    </item>
    <item>
      <title>Why I am using Kubernetes for game dev?</title>
      <dc:creator>Alexandr K</dc:creator>
      <pubDate>Thu, 03 Jan 2019 21:33:33 +0000</pubDate>
      <link>https://dev.to/balconygames/why-i-am-using-kubernetes-for-gamedev-2n14</link>
      <guid>https://dev.to/balconygames/why-i-am-using-kubernetes-for-gamedev-2n14</guid>
      <description>&lt;p&gt;Hi everyone.&lt;/p&gt;

&lt;p&gt;It's a really nice time to publish the new post about the new area that I am trying to learn and build something exciting. Let's say #gamedev was always the goal when I started to learn software development but for some reasons, I was always busy with other stuff.&lt;/p&gt;

&lt;p&gt;OK, no more talks about the past.&lt;br&gt;
Kubernetes is really exciting technology that I discovered when I was a solo developer for my projects on backend and frontend.&lt;/p&gt;

&lt;p&gt;My current stack is&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://digitalocean.com" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt; is hosting platform with reasonable pricing that's always helping for my indie projects. I want to say thank you to the company because they are always opened to help, add some credits and reduce prices.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://containership.io" rel="noopener noreferrer"&gt;Containership.io&lt;/a&gt; is a really nice platform to provision Kubernetes to DigitalOcean. (don't have any credits from these guys but the platform helped me to save my time). DigitalOcean started to provide Kubernetes out of the box but I found it hard to use for the beginner. Talking about the pods, services, SSL certs setup. Probably it's only about my experience, had the luck to make it done easily when I have full access to Kubernetes.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://kubernetes.io" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt;, it's not about microservices. It's Heroku for you when you can control anything with simple recipes.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://gitlab.com" rel="noopener noreferrer"&gt;Gitlab&lt;/a&gt; is source control platform with free container registry per repository.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My cluster hosts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://api.balconygames.com" rel="noopener noreferrer"&gt;https://api.balconygames.com&lt;/a&gt; is Go server that's talking with PostgreSQL (3 repl)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dashboard.balconygames.com" rel="noopener noreferrer"&gt;https://dashboard.balconygames.com&lt;/a&gt; is ReactJS Admin dashboard for game management (nginx + static).&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://sweety-jumper.balconygames.com" rel="noopener noreferrer"&gt;https://sweety-jumper.balconygames.com&lt;/a&gt; is Unity game (nginx + static) but it's in dev mode for now because of network issues.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://balconygames.com" rel="noopener noreferrer"&gt;https://balconygames.com&lt;/a&gt; is Jekyll (nginx + static)&lt;/li&gt;
&lt;li&gt;PostgreSQL (deployed by using helm recipes)&lt;/li&gt;
&lt;li&gt;Letsencrypt to watch for ssl certs and create the new one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It costs me about &lt;strong&gt;&lt;em&gt;$40&lt;/em&gt;&lt;/strong&gt; per month (3 nodes by &lt;strong&gt;&lt;em&gt;10$&lt;/em&gt;&lt;/strong&gt; and 1 Node Balancer) is really cheap for these machines.&lt;/p&gt;

&lt;p&gt;My workflow as a solo developer on the backend.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Make the code changes.&lt;/li&gt;
&lt;li&gt;Rebuild the image and push to Gitlab registry&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;kubectl apply -f recipe/&amp;lt;name of the app&amp;gt;/deployment.yml&lt;/code&gt; that's containing &lt;code&gt;&amp;lt;image_name&amp;gt;:latest&lt;/code&gt; or &lt;code&gt;&amp;lt;image_name&amp;gt;:$COMMIT_TAG&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next step to move it away from my local machine and use Gitlab pipelines.&lt;br&gt;
It's easy to support, deploy and don't waste time.&lt;/p&gt;

&lt;p&gt;In a case, in one day it would require to setup Redis or other databases I will use helm tool with predefined recipes to create pods, services, and deployment for Redis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Our game is &lt;a href="https://play.google.com/store/apps/details?id=com.balconygames.sweetyjumper" rel="noopener noreferrer"&gt;Sweety Jumper&lt;/a&gt;&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>kubernetes</category>
      <category>unity3d</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>How to use UnityWebRequest for your Rest API?</title>
      <dc:creator>Alexandr K</dc:creator>
      <pubDate>Thu, 03 Jan 2019 16:01:46 +0000</pubDate>
      <link>https://dev.to/balconygames/how-to-use-unitywebrequest-for-your-rest-api-23e0</link>
      <guid>https://dev.to/balconygames/how-to-use-unitywebrequest-for-your-rest-api-23e0</guid>
      <description>&lt;p&gt;When I started to work with unity the goal was to have the cross platform game and deploy the game to App Store, Google Play, Amazon, Facebook, Web, Chrome Extension to cover as much as possible platforms. The idea is good but it would require to focus on libraries that you are planning to use.&lt;/p&gt;

&lt;p&gt;At the first time I've decided to use &lt;a href="https://assetstore.unity.com/packages/tools/network/http-client-79343" rel="noopener noreferrer"&gt;HttpClient&lt;/a&gt; based on &lt;code&gt;System.Net&lt;/code&gt; namespace but as result of compiling to WebGL &lt;code&gt;System.Net&lt;/code&gt; and &lt;code&gt;HttpClient&lt;/code&gt; was excluded from the build and no connection between game and API.&lt;/p&gt;

&lt;p&gt;The solution is to use &lt;code&gt;UnityWebRequest&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;My examples how to build GET, POST requests with JSON.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections.Generic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine.Networking&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Newtonsoft.Json&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;Jumper.Network&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;abstract&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;API&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// TODO: add https certificate verification&lt;/span&gt;
&lt;span class="cp"&gt;#if UNITY_WEBGL
&lt;/span&gt;        &lt;span class="c1"&gt;// WebGL version is loaded by browser under https protocol.&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;HOST&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"https://api.example.com/client/"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cp"&gt;#else
&lt;/span&gt;        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;HOST&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"http://api.example.com/client/"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cp"&gt;#endif
&lt;/span&gt;
        &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;TOKEN_QUERY_PARAM&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"?token="&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;static&lt;/span&gt; &lt;span class="k"&gt;readonly&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;REGISTER_PATH&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"users/register"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;USER_ID_KEY&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;":user_id"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="cp"&gt;#region internal methods for http client
&lt;/span&gt;        &lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// in çase if user has no user_id because of missing internet connection on boot&lt;/span&gt;
            &lt;span class="c1"&gt;// we should use /games namespace for sending requests.&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;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ContainsKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;USER_ID_KEY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;IsNullOrEmpty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;USER_ID_KEY&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;GAME_PATH&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"/:game_id/sessions/:user_id/"&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;TOKEN_QUERY_PARAM&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="s"&gt;":token"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;GAME_PATH&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"/:game_id/"&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="n"&gt;TOKEN_QUERY_PARAM&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="s"&gt;":token"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;foreach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;kv&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;);&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;path&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nf"&gt;requestError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UnityWebRequest&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;responseBody&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Empty&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;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;downloadHandler&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;responseBody&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;downloadHandler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="s"&gt;"[api#error] request status code: {0}, data: ======= response: {1}, error: {2} ======="&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responseCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;responseBody&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;requestResponse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;UnityWebRequest&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;responseData&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;downloadHandler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&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;JsonConvert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DeserializeObject&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;responseData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;Debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;T&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;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;CONTENT_TYPE_JSON&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"application/json"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="c1"&gt;/// Create the instance of authenticated http client.&lt;/span&gt;
        &lt;span class="c1"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span class="c1"&gt;/// &amp;lt;returns&amp;gt;The client.&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;IEnumerator&lt;/span&gt; &lt;span class="nf"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;UnityWebRequest&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;UnityWebRequest&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;UnityWebRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kHttpVerbGET&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;UnityWebRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SendWebRequest&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                    &lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;Invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;UnityWebRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kHttpVerbPOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;UnityWebRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;UnityWebRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kHttpVerbPOST&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                    &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;downloadHandler&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;DownloadHandlerBuffer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                    &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uploadHandler&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;UploadHandlerRaw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Encoding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UTF8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;GetBytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
                    &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetRequestHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Content-Type"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CONTENT_TYPE_JSON&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SetRequestHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Accept"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CONTENT_TYPE_JSON&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SendWebRequest&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
                    &lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;Invoke&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="k"&gt;break&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;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;IEnumerator&lt;/span&gt; &lt;span class="nf"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;object&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;UnityWebRequest&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
            &lt;span class="nf"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;UnityWebRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kHttpVerbPOST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;JsonConvert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;SerializeObject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;IEnumerator&lt;/span&gt; &lt;span class="nf"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;UnityWebRequest&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
            &lt;span class="nf"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;UnityWebRequest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kHttpVerbGET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;internal&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;wrapCallback&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;T2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;doneCallback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// in case of having missing done callback use empty function to skip checks&lt;/span&gt;
            &lt;span class="c1"&gt;// on null or not callback instance.&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;doneCallback&lt;/span&gt; &lt;span class="p"&gt;??&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;_arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_arg2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&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;span class="p"&gt;}&lt;/span&gt;
&lt;span class="cp"&gt;#endregion
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Example of usage Api.cs&lt;/span&gt;

&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Newtonsoft.Json&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;UnityEngine&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections.Generic&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;System.Collections&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;Jumper.Network&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;class&lt;/span&gt; &lt;span class="nc"&gt;Users&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;API&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;static&lt;/span&gt; &lt;span class="n"&gt;IEnumerator&lt;/span&gt; &lt;span class="nf"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;Dictionary&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;Action&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;doneCallback&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;wrapCallback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doneCallback&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

            &lt;span class="k"&gt;try&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;REGISTER_PATH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;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;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isNetworkError&lt;/span&gt; &lt;span class="p"&gt;||&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responseCode&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="m"&gt;201&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                            &lt;span class="nf"&gt;done&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;requestError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
                        &lt;span class="k"&gt;else&lt;/span&gt;
                            &lt;span class="nf"&gt;done&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;requestResponse&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;null&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;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="c1"&gt;// catch here all the exceptions ensure never die&lt;/span&gt;
                &lt;span class="n"&gt;Debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                &lt;span class="nf"&gt;done&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;null&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;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Example from MonoBehaviour&lt;/span&gt;

&lt;span class="nf"&gt;StartCoroutine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;Api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GameProperties&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CurrentUser&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;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;err&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="n"&gt;Debug&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;LogError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
                    &lt;span class="p"&gt;}&lt;/span&gt;
                    &lt;span class="k"&gt;else&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="c1"&gt;// good to go&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;



</description>
      <category>unity3d</category>
      <category>gamedev</category>
      <category>indie</category>
      <category>madewithunity</category>
    </item>
    <item>
      <title>Game development is hard</title>
      <dc:creator>Alexandr K</dc:creator>
      <pubDate>Wed, 02 Jan 2019 13:13:42 +0000</pubDate>
      <link>https://dev.to/balconygames/game-development-is-hard-1bpc</link>
      <guid>https://dev.to/balconygames/game-development-is-hard-1bpc</guid>
      <description>&lt;p&gt;The last weeks I worked with my friends in free time on making our game from the beginning, we don't have experience in this area. Lets I want to describe how it begins.&lt;/p&gt;

&lt;p&gt;Me and my friend we were staying in the nice bar, drink the cool wines. We were talking about life after 30 :) and how awesome was the time when we played in the console games. We don't have enough time to play these days. I am backend developer, he was working as a developer for accountant software (but started to learn javascript and found the first job to work more in frontend area). I told my story about the school days when I was learning Macromedia Flash to build the small games.&lt;/p&gt;

&lt;p&gt;Then my friend said(Igor):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You know I have the friend(Vitaly) who works in the grocery shop but he wants to build the games as well.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It begins. 3 people from different areas.&lt;/p&gt;

&lt;p&gt;We decided to use Unity because it looks like it's the fastest way to build the game these days. &lt;/p&gt;

&lt;p&gt;I started to focus on the backend part and HTTP client for Unity to talk with the server.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What the idea for the game? OK, ... the idea is about ..., talk with friends, take anything from the tutorials and build it. Looked good, let's continue and make the product.&lt;/li&gt;
&lt;li&gt;Where to get the assets? OK, ... it's so hard but search for assets in Unity store. We had black Friday prices, 45$ and we got UI asset.&lt;/li&gt;
&lt;li&gt;Where to get the player asset? OK, ... google it, found the asset, talk with the owner, get approve and update INFO popup in the game. Done it.&lt;/li&gt;
&lt;li&gt;Test and test it.&lt;/li&gt;
&lt;li&gt;How to earn money? We can earn, we added in-app purchases and watch an ad to continue but it didn't break the gameplay. You can still live without it and it would not distract the game.&lt;/li&gt;
&lt;li&gt;Get the feedbacks. We are using gyroscope control. It looks like we need to change it.&lt;/li&gt;
&lt;li&gt;For now, it's in google play market &lt;a href="https://play.google.com/store/apps/details?id=com.balconygames.sweetyjumper" rel="noopener noreferrer"&gt;Sweety Jumper - Android&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Now we don't have the marketing or ads to promote the app, it would require to spend more money but hopefully if people like it, it would not require to spend) :)&lt;/li&gt;
&lt;li&gt;I would suggest to use gameanalytics.com to see your users (DAU, MAU), at least you would see the stats about your plays.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;in the other articles, I will try to describe the primary bottlenecks on using Unity and game dev for the beginner at all.&lt;/p&gt;

&lt;p&gt;Games(I believe it should more than one :)):&lt;br&gt;
&lt;a href="https://play.google.com/store/apps/details?id=com.balconygames.sweetyjumper" rel="noopener noreferrer"&gt;Sweety Jumper - Android&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Social:&lt;br&gt;
&lt;a href="https://twitter.com/balconygames" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt;&lt;br&gt;
&lt;a href="http://instagram.com/balconygames" rel="noopener noreferrer"&gt;Instagram&lt;/a&gt;&lt;br&gt;
&lt;a href="http://facebook.com/balconygames" rel="noopener noreferrer"&gt;Facebook&lt;/a&gt;&lt;br&gt;
&lt;a href="https://balconygames.com/" rel="noopener noreferrer"&gt;Website&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Screenshots:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffsz4h3m4gossma4f8ncb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffsz4h3m4gossma4f8ncb.png" alt="screenshort"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffbk8yoita8jzdsw6lli2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffbk8yoita8jzdsw6lli2.png" alt="screenshort"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdo6spsmzvoq98jkjgpio.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdo6spsmzvoq98jkjgpio.png" alt="screenshort"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx0v9o8uskrgyb2pmzisn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx0v9o8uskrgyb2pmzisn.png" alt="screenshort"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>indie</category>
      <category>indiegamedev</category>
      <category>unity3d</category>
    </item>
  </channel>
</rss>
