Update 12 – Version 1.03 (iOS) and 1.0.4 (Android)

After launching Hex Disarm on iOS and Android, I left the game for a few weeks to gather lots of critical data and feedback. After leaving the game for a few weeks I then analysed all my data and organised all my feedback. Alongside gathering feedback from users who have played the game I also had a meeting with Oli Christie at Neon Play to discuss my game and he also gave me a lot of useful feedback to implement into this update.

These were the main points of feedback I received:

Good:

Bad:

  • Tutorial is not clear
  • The first tutorial level does not give an accurate representation of the game
  • Stuck on level 28
  • The tiles overlap the popups on the first few levels
  • There is no haptic feedback on the green tiles
  • Glitches when a bomb is processed, and you press something else
  • Shame there’s only 200 levels
  • Confused by colours
  • The sounds are annoying and need to be removed or looked at
  • Remove the delay when disarming the last bomb
  • Should be clearer as to what tile is the bomb
  • Should be able to scroll through level selection
  • Show the user red, orange or yellow tiles instead of the bomb

While I was at my meeting with Oli Christie, he also gave me some valuable marketing advice for Hex Disarm. He stated that he would expect Hex Disarm to have a CPI of around $1 because it is harder for the user to understand as they will have to use their brain. Therefore, it might not work very well as a hyper-casual game.

However, this does not necessarily mean that the game cannot be profitable, but it does mean that the marketing plan will have to be adjusted. So, if the game has a higher CPI it could be marketed as a puzzle game and then more in app purchases can be introduced in order to increase the Average Revenue Per Active Daily User (ARPDAU). For example, I could charge for level packs, different themes or different modes. Alternatively, instead of releasing the game for free I could potentially release it for a few pounds instead.

Alongside all this feedback, I also gathered a good amount of quantitative feedback.

I average around 12 Daily Active Users (DAU)

Android has 3x more active users than iOS

Since switching the game to 3D, removing ads in the first 10 levels and improving the on boarding of the game, the number of users who completed the first 10 levels jumped from around 20% to 40%. However, this is still a low amount of people completing the first 10 levels.

1 user has completed 102 levels in one session

1 user has completed all 200 levels. He also sent me this tweet:

This tweet also showed that he paid to remove advertisements as the no ads button is not on the screen.

Since launching Hex Disarm on Android, 3 people from Belgium, United Kingdom and United States have paid to remove advertisements from my game.

I currently have around 400 users.

The average user completes between 1 and 2 sessions

My day 1 retention is extremely low. However, this could be because many people downloaded my game just to provide me with feedback and weren’t my target audience.

However, my day 30 retention seems to be a bit better. This shows that some of my users are getting addicted to my game and are returning.

On average, my users complete around 15-40 levels.

Most of my users press the continue button as soon as they start the application.

Someone has completed 77 random levels!

On some days, over 30 random levels have been completed!

By using this quantitative data, I can establish that:

  • Most of my users are on Android. This could be because it launched first.
  • The changes I made in Version 1.0.2 made a considerable improvement to the number of users who completed the first 10 levels.
  • Some people have become addicted to my game. With one user completing all 200 levels and one user completing 103 levels in their first session!
  • 3 people have paid to remove advertisements from my game, so I’ve made around £8
  • My retention is not great but that could be due to who was downloading my game. If I paid to produce targeted adverts in order to attract my target audience maybe I would see a higher retention.
  • Some people enjoy playing my random levels. Perhaps I should look at charging for this mode to increase my revenue.

So, based on all my quantitative and qualitative feedback I changed these things in version 1.0.3 (iOS) and 1.0.4 (Android):

This update was released on the 1st December on Android, but the iOS update is likely to be released later because my access to a mac is very limited. It is expected to be released in December or January.

Update 11 – iOS Submission

After the success of the release on Android, I had one of my friends that I used to work with offer to make iOS builds for me so I could release the game on the App Store. I decided to take him up on this offer as I did not have a mac easily accessible to be able to create iOS builds. So, he helped me out by creating iOS builds and uploading them onto the App Store Connect so I could submit them to Apple. So, I paid for the Apple developer account and went through the process of setting up an account.

While Apple were reviewing my account, I started to prepare for releasing the application on the App Store. The first thing I had to do for iOS was to implement a popup explaining how the IAP works and I also had to add a button to restore purchases as it does not happen automatically on iOS. Another thing that I had to complete before my game was ready to submit to Apple was to create a privacy policy. I devised my privacy policy and then uploaded it here: https://kierantownley.com/privacy-policy/. In my privacy policy I had to explain how I was using data and how I use Unity Ads/Analytics.

Once Apple approved my account, I started to go through the process of submitting my app to the app store. I submitted the first version to Apple on the 6th of November and it was rejected for 2 things. The first one was that my in-app purchase was not executed correctly, and the other reason was because some of my UI was overlapping on iPad. This issue was quickly resolved by adjusting the canvas scaling to work on all resolution sizes.

This is the response I received from Apple:

This was then fixed as part of the version 1.0.2 update: https://gyazo.com/35e24825cfc6c486322a7178933195e6

The second time I submitted my app to the App Store it was accepted and then it became publicly available on the 8th November.

Here is a link to Hex Disarm on the App Store: https://apps.apple.com/us/app/hex-disarm/id1485861396

Update 10 – v1.0.2

After I released v1.0.1 I continued requesting feedback and looked at putting my game on more sites such as Reddit. From these posts I managed to generate some more downloads and therefore, receive more valuable feedback. So, this is a summary of the points of feedback I received from the 1.0.1 update:

Good:

  • Polished
  • Looks good
  • Interesting
  • Confetti and celebratory text are nice
  • Addictive
  • Simple
  • Even a 6-year-old could play it

Points of improvement/bugs

  • Too many colours
  • The ads start too soon
  • Improve transition speed
  • Use calmer sound effects
  • Start screen level doesn’t update if you return to it
  • The menu system is not responsive
  • You can touch the content behind the popups
  • Level 20 was too hard
  • Hard to understand the difference between red and dark red

Alongside the direct comments I received from the users, I also had a large amount of analytics data to use to judge how the game is going. Therefore, these are the main points that I noticed from the first 5 days of the game:

Good

  • I had 178 users
  • The average play time was around 10 minutes per user
  • I had received 2 purchases of the no ads product
  • At least one person has completed all 200 levels
  • People do not often fail levels multiple times

Bad

  • Around 20-30% of users completed the first 10 levels with most users dropping off after the first level or after seeing an ad
  • Have around 5-25% retention

Here is my graph for the % of users who completed the first 10 levels:

As you can see from this image, the number of users who complete the first 10 levels seem to be levelling out at around 20%. Therefore, the on boarding flow of the game is the key area of the game that needs to be looked at as this number is too low. Another potential cause of the this is that ads are also shown in the first 10 levels, therefore, users could be leaving the application as soon as they see the first advertisement.

Based on this graph, you can see that the average playtime per user changes dramatically after the 3rd of November. This could be because many users had played the app to provide me with feedback but had not actually played the game for a considerable amount of time.

So, based on the feedback and the analytics data I started working out what I wanted to include in version 1.0.2. The key change that I wanted to make in this version was to convert the main game grid into 3D. I decided to do this to try and make the game a bit more visually appealing in the hope that it would increase retention. I also used some advanced techniques, such as zoning to make the player feel like they are progressing through the levels. I also used a new animation of the level moving down to make the player feel like they are moving to the next level. While moving over the grid to 3D I noticed that it wasn’t very performant, so I rewrote lots of the grid generation system, so it just uses an object pool instead of destroying and creating the grid every time. This reduced the time it takes to generate the grid from around 30ms to around 2ms. Therefore, I was able to make my animations feel a bit snappier and just generally a bit smoother.

Another key decision that I made in version 1.0.2 was to reduce the prominence of the level selection so that the user doesn’t have to navigate through the level selection to get to the next level. I have done this to try and get the user into the game as quickly as possible and this reduces one of the steps that the user must take. This also addresses one of my points of feedback as it makes my whole menu system feel a bit snappier. I was considering removing the level selection as 100% of the people I asked about it said they never used it in my game, other than just selecting the next level. However, I decided against it as it would be good for people to replay previous levels if they are showing the game to someone else.

The other major change I made to try and increase the conversion in the first 10 levels was to completely remove full screen ads for the first 10 levels. I did this in the hope that more people might complete the first 10 levels and get addicted before viewing ads. Therefore, if they are already addicted to the game, they are much more likely to watch the ads or pay to remove them. This idea originally came from someone providing me feedback on version 1.0.1.

Therefore, these were the changes I made in version 1.0.2:

Adjusted the level selection so only 8 levels are shown at a time ( https://gyazo.com/fc46147325927a9d84cbcc40f11d9760 )

I swapped out the 2D grid for a new 3D grid!

Improved the flow between all levels ( https://gyazo.com/cc1362842276be8a424aa623532da7bc )

Improved the onboarding flow ( https://gyazo.com/2508e5111dcff9deed333f66f50c7c92 )

Improved multiple animations throughout the game ( https://gyazo.com/5f66f2e9cb7bf3c1b568d8a20dc65da6 )

Fixed numerous UI scaling issues on some devices ( https://gyazo.com/35e24825cfc6c486322a7178933195e6 )

As you can see, pretty much all these changes came from the analysis of the analytics data and the feedback received.

Version 1.0.2 was released on the 7th November on Android.

Update 9 – v1.0.1

So, as I mentioned in the previous week, when I launched the game, I sent out a few tweets, messages etc to try and get people to play my game so I could gather some feedback. In the last few days I have received a huge amount of feedback and have had to create a google sheets doc to keep track of all the feedback I have received (available here: https://docs.google.com/spreadsheets/d/1D1RvDZEozLfUjMt0P-3qOIJf-GW5H02qZXLYnIZZE1g/edit?usp=sharing).

Within a day of launching Hex Disarm, someone had already completed all 50 levels! Therefore, I knew in this update that I had to add many levels in order to keep my users in the game.

To summarise the main points were:

Good parts:

  • Visually pleasing
  • Easy to play
  • Relaxing
  • Relaxing music
  • Like the hot and cold dynamic
  • Simple
  • Satisfying
  • Fast paced
  • Upgrade on minesweeper
  • Very addicting

Points of improvement/bugs:

  • Infinite ads after going back to level select screen
  • Colour of the bombs sometimes appear incorrectly
  • Too many ads
  • Should add a random mode that generates the grid again when you detonate the bomb
  • Should add an animation when completing the game
  • Improve the tutorial
  • Improve loading speed between levels
  • Difficulty scaling can be improved
  • Add a different colour when the bomb touches 2 or more bombs
  • The start of the game is a bit boring

After receiving this feedback, I took it all on board and starting developing version 1.0.1. In this version I made these changes:

  • Added 150 new levels
  • Added a ‘random’ mode for an infinite amount of levels and that it generates the grid again when you detonate the bomb.
  • Added an extra animation when level 200 is completed.
  • Added a new colour when a tile is connected to two or more bombs
  • Adjusted the difficulty curve for the first 50 levels
  • Fixed an issue with the colours of flipped tiles being incorrect when disarming bombs
  • Fixed an issue where adjacent bombs would not disarm correctly.
  • Other minor bug fixes and optimisations

Here are some gifs/screenshots that show the changes in this update: 

150 new levels:

Random mode: https://gyazo.com/9dcd84c51fb5c8b5b93f41443b6f7893

New colour when a tile is next to two or more bombs: https://gyazo.com/f110733cc1ad6335ab495eaabecf80ec

Fixed issue with adjacent bombs not disarming correctly: https://gyazo.com/b27d181cacaae48af1c09ba1f6f7edb1

Fixed an issue with the colour of flipped tiles near bombs: https://gyazo.com/bf042d55f7dfda221a942453ef12c27c

I released this update on the 31st October.

Update 8 – Setting up Google Play and launch

In order to launch my game, I first had to make sure that I had a Google Play developer account setup. This required me to pay a £25 fee to setup the account and fill in a few forms. Once I had got the developer account, I began uploading AABs (Android App Bundles) to the Google Play Store to test my game. I first began uploading them to the internal test so I could test my in-app purchases, advertisements etc.

A few days before I decided to launch my game, I let someone test my game without any input from me and received quite a bit of feedback from this test. The main points were:

  • They were not sure what they should do at the start of the game
  • They didn’t know how to navigate to the settings
  • They didn’t know what the numbers in the UI indicated

Therefore, based on this feedback these are the changes I made:

I decided to add a small tutorial to the first few levels of the game to introduce the players into the game and let them know what they should be doing.  (https://gyazo.com/d9f2c2f46924ae378041e0227000c480)

I made sure that the settings icon was always visible and decided to not use a collapsed menu anymore:

I added some text around the numbers in the UI to indicate what level the user is on or how many bombs are remaining in the level:

Then on the 29th October I launched my game onto the Google Play store. Once the game had gone through the Google Play review process, I contacted some people to get them to try out my game. So, on Twitter I tweeted out my game with some hashtags to try and get some attention (https://twitter.com/kieran2307/status/1189479516642656256). I also posted on LinkedIn (https://www.linkedin.com/posts/kieran-townley-256313157_hex-disarm-apps-on-google-play-activity-6595265384142643200-lNsw/), on my Instagram story and sent it to the rest of the Unity team at my place of work. Over the next few weeks I will gather as much feedback as I can and then make changes to my game based on that feedback.

All the feedback I gathered has been added to this Google Sheets document: https://docs.google.com/spreadsheets/d/1D1RvDZEozLfUjMt0P-3qOIJf-GW5H02qZXLYnIZZE1g/edit?usp=sharing

Here is a link to Hex Disarm on the Google Play Store: https://play.google.com/store/apps/details?id=uk.KieranTownley.HexDisarm

Update 7 – Analytics

One of the final steps before I launched Hex Disarm was to implement the Unity Analytics API. Unity Analytics will allow me to analyse exactly how my users are playing my game. For example, I will be able to see exactly how many users have completed the first 10 levels or what level the user quit on.

In order to record these events, I had to perform some API calls to send these events to the Unity dashboard. So, I created an Analytics Manager script that handles all my analytics events. In order to perform a Unity Analytics API call, I just had to call Analytics.CustomEvent() with my parameters for the event that I wanted to execute. These are all the events I have inside the application that I can monitor on the dashboard:

  • Level Completed
  • Level Failed
  • Level Skipped Level Select
  • Level Skipped
  • Level Quit

Update 6 – Unity IAP API Implementation

After I setup the Unity Ads API I decided that I wanted the user to have a way to remove the ads if they didn’t want to watch them all. So, I looked at other hyper-casual games and saw that they would often sell a “No Ads” package for around £2.99. Therefore, I implemented the Unity IAP system to allow the user to pay to remove advertisements. Throughout my placement I had used Unity IAP a lot, so I already had the knowledge to be able to add my purchasing quite quickly and effectively.

I decided to set up the “No Ads” product as a Non-Consumable product so that if the users deleted the app and then redownloaded it they would still have the “No Ads” product enabled. However, this required me to do some purchase restoration in order to make sure that the product was being restored correctly.

Here is my remove ads button working in the Unity Editor: https://gyazo.com/aab5c8ed1d323101cd217dcce5fd3daf

Update 5 – Unity Ads API Implementation

This week I decided to implement the Unity Ads API as my monetisation method in the game. To implement Unity Ads, I just had to download the Unity Ads package and then import it into my Unity project. Once I had imported the package correctly, I just had to make sure I had the Unity ads set up on the Unity dashboard. Once this was done, I created an AdManager class that handled all my advertisements throughout the app. I decided that, based on other hyper-casual games, I was going to show a banner ad inside of all levels, show a full screen ad every 5 times the grid generates (but only after the user completes a level) and then I wanted to use a rewarded ad to allow the users to watch an ad to skip a level.

The implementation for Unity Ads was simple as I only had to call Advertisement.Show(nameOfAd) and then it would show the advertisement to the user correctly.

Here is what a banner looks like in the Unity Editor:

Here is a working full screen ad in the Unity Editor:

Here is a working reward ad in the Unity Editor with my unlocking animation: https://gyazo.com/d02a163fcf744edf21f4cf274eedfc5e

Update 4 – Level Selection and UI

The week I decided to add some UI to my game. I decided that I wanted to keep all my UI in the style of the hexagon grid, so I decided to use hexagons throughout the app. This will also help to reduce the final build size as I will be reusing the same sprites.

The first part of my UI that I created was my in-game UI. For this I just used a couple of hexagons and text to let the user know what level they are on and how many bombs are remaining in the level. In the corner I added a button to access the settings, remove ads and provide feedback. I create a nice animation for this where the UI seems to fall from the settings button.

GameUI: https://gyazo.com/b69463ddfd263cbdec4c20d76d26602c

Here is my menu open animation: https://gyazo.com/22322a1ec37396fba98f052a4482b3f2

Here is my settings animation: https://gyazo.com/c96415beff871c41c18b95f1b8920a0f

After I created the game UI, I wanted to add a level selection. I decided to keep the same hexagon theme and create a level selection that connected hexagons together to form a path. I generated this path on runtime using some predefined dimensions of the hexagons. The hardest part of this was to get the transitions between each level to correctly line up in the centre of the hexagons.

Here is my level selection: https://gyazo.com/f820c80c84efd189f1df34b019a55edf?token=43b040d711a3912f609bcefa9ac37a35

Next, I created the start screens and the popup system. The start screen was just a simple screen that allows the user to navigate to the level selection screen or to access the settings. For my popup system, I used a popup base class to create my popups from, so they all have the same styles/animations. I was then able to show a popup using the Popup Manager class from anywhere throughout the app.

Start screen: https://gyazo.com/8314adcc36da37b02bedce2da24cc094

Feedback popup: https://gyazo.com/a0f28e30192eea03c690a0e66e6ce474

The final thing I did for my UI was my UI animations. I decided that I wanted every aspect of the app to flow nicely so I created some animations that look like the UI all just flowed together. I did all my UI animations using LeanTween, so I was able to animate elements between two values using a curve to create a nice animation.

Start screen -> level selection -> level: https://gyazo.com/ff356296d6cbbfb40fa4e52faf7fe301

Level -> level selection: https://gyazo.com/03f99a6706c06ab32989287826110c3a

Here is a screenshot of my GameUI:

This is what my level selection looks like now:

Start screen:

Feedback popup:

Update 3 – Flipping, Colouring and Bomb Disarming

This week I wanted to get the flipping/colouring mechanic working. The first thing I did was make sure you can flip tiles. In order to flip tiles, I check if you are hovering over the tile and then if you press on the tile then flip it. When a tile is flipped it is animated to its stored colour and scaled to create a nice flip effect.

Here’s a gif of the flipping so far: https://gyazo.com/96517cd6c931f123882a8d03c09a9934

The tiles stored colour is set from the bombs. So, the bombs cycle through 3 layers of neighbours around them and then set the colour of the tiles on those layers in accordance with the distance away from the bomb. So, if the tile is 1 layer away from the bomb it is red, orange if it is 2 layers away and yellow if it is 3 layers away.

This is what the colour generation looks like at the moment: https://gyazo.com/8b61ba7eb5ace15682bc9e0c092f78eb

This week I also implemented the disarm logic. This logic is for when the user has successfully flipped all the bombs surrounding tiles, it disarms the bomb and creates a nice effect. If the user has disarmed all bombs, then the game is finished. When the user disarms a bomb the colours of the tiles are redone so that they can hint towards another bomb that the user has not yet found.

This is my animation for when a bomb is disarmed: https://gyazo.com/427cad950556da4c9e43c96211de55b5

Also, this is my animation for when the final bomb is disarmed: https://gyazo.com/e101f303298551623f1f1600d4e8cdc7

I also implemented the logic for when the user clicks on a bomb. When a user clicks on a bomb, the bomb will detonate and blow up the grid in a nice animation. When a user detonates a bomb, the grid will be regenerated, and they will have to start the level again.

This is my bomb detonation animation: https://gyazo.com/447e1f930ec510db2dbc8a60bc98d220

Here is a screenshot of a coloured grid:

Update 2 – Bomb Allocation and Levels

This week I implemented the bomb allocation and level creation. Before I started allocating bombs, I had to come up with a system to generate the levels. I decided that I would do this by seeding the random generation so that every user would get the same levels. So, I set up my levels by using a big dictionary with the level number and then a list of ints that contain all the level info. In this list is the grid radius, the number of bombs, the number of bombs to show to the user and then each random seed for each bomb.

To receive the correct levels, I just get the level data from the levels dictionary. Once I have the level data, I then setup the grid using this data. In the process of setting up the grid, I need to spawn in the bombs. To decide where the bombs are located, I randomly select a number between 0 and the amount of grid tiles. This number is randomly generated based on the seed that is provided in the level info. Once the bombs have been selected, I check how many bombs I need to show and then show these bombs to the user.

This is a gif of bombs being generated: https://gyazo.com/da199905e91032ed30aeb42090d2f926

Here is a screenshot of a grid with bombs in it:

Update 1 – Grid generation

Once I decided I wanted to make a hexagon grid game I decided that I needed to make something that can generate a flexible hexagon grid for me. So, I began working out how I should generate this grid.

The first bit I did was to work out how far apart the tiles should be to form the grid. I did this by simply placing the tiles in the editor to work out how close they should be. Once I established how far away the tiles must be from each other, I then worked out how I would spawn the first 6 tiles. I did this by using the centre tile and then adding the difference to the position of each 6 tiles that surround the centre tile.

Here is how it generates the first section of the grid: https://gyazo.com/eedd3fa60585b524a40a10afce9c2e7c

Once I had accurately generated the first layer of the grid, I then looked at expanding the grid. I did this by expanding upon the first layer by creating tiles in a line from the six tiles that surround the centre. This created a web shape grid.

See the web shaped grid here: https://gyazo.com/f2cf323dc9f6ae6cd1889ce8d325f09e

Once I had this web shaped grid, I then had to fill in the holes around the grid. I did this by working out how much space is between the two closest tiles in the layer (that are already spawned). I then worked out how many tiles should go there and then instantiated tiles into correct positions to fill these gaps.

Finally, this is the grid generation algorithm working to generate a full hexagon grid: https://gyazo.com/3baf3283c157a2c30ae818999f1e2d50

Here is a screenshot of the final grid: