Posts

Showing posts from 2019

Unity3D JSON Serialization (save game data)

Image
Let's keep this short:
My BoxingDay activity was to create a small Unity3d project utilizing JSON serialization for saving game data. Basically, this sample project shows how to save and load game data in one serializable class.

Whole project is available at Github:
https://github.com/jliias/SaveData
(I believe it should work as such)



In this sample project I will serialize GameData class, that contains following variables:
bool adsEnabled
int coinsCollected
int highScore

These variables are packed and unpacked to text format using JsonUtility API that can be used to convert Unity objects to and from JSON format. Basically, it is possible to pack and unpack simple objects to text format by using this API (e.g. collections or arrays are not supported).

Serializing to JSON is done using ToJson method, and and deserializing using FromJson method.

It is important to add [Serializable] to the top of class that will be serialized.

This is very simple solution and as far as know this should …

Using Unity3D LWRP and shader graphs in real game

Image
My previous Unity3D post was demonstrating my trials with scriptable render pipeline and shader graphs. Now I have gone one step further and combined these techniques with one of my previously released game. "Ball Twister"was originally released about an year ago. I did not advertise it too much because of boring outlook and bit simple gameplay. However, now I have found this game perfect for testing scriptable render pipeline and shader graphs in real 3D environment. Attached video shows how different new version of Ball Twister looks compared to the original one. Original version (on left) is using standard Unity render pipeline and shaders. Enhanced version (on right) is using LWRP (or URP) and shader graphs.



In enhanced version, rolling checker board texture, swirling sky and obstacle materials are all using shader graphs to create a sense of movement just by tweaking textures. Basically, only objects that are really moved are black obstacles and coins. Everything el…

New logo for WestSloth Games

Image
The original logo of WestSloth Games was created by me for several years ago. Basically, it was a hanging sloth that was built using voxels. I guess MagicaVoxel was the tool used to create it.

In the beginning logo looked pretty ok. But over time it started to look confusing and not so good anymore. So there was a clear need to draw a new logo.

But what kind of a logo is good one? Some views can be found for example from this article concerning logo design:

"A good logo is distinctive, appropriate, practical, graphic and simple in form, and it conveys the owner’s intended message."

So yes, logo must be at least appropriate, practical and simple. Those were the words I thought I understood. 

Additionally, there was also a short list of characteristics of good logo:
1. Simple
2. Memorable
3. Timeless
4. Versatile
5. Appropriate


So, I tried to follow these guidelines and started drawing with Inkscape. After 30 minutes of fiddling logo looked like this:




















How does it look? Does it meet all…

Unity3D LWRP Shader Graph demo (rolling checker board)

Image
I started getting familiar with Unity render pipeline usage, because I had plans to utilize that in my upcoming game project. As a by-product I recorded a short video how to create a rolling material (or texture) using Unity3D shader graph.

Shader graph is a way to build shaders visually by creating and connecting different nodes. I would think it is simple enough even for beginners after you understand how to setup and use it.

My shader graph demo recording is available on WestSloth's Youtube channel. There is no speech included, but I hope it gives at least some idea how Unity3D shader graphs can be utilized.


I was using Unity 2019.2.13f1 and created a new project with LWRP template, that automatically brings in required packages needed in this demo.

Edit: I added another Unity3D shader graph video to Youtube.


-Jussi.

Unity3D events, delegates and Action

Image
Delegates and events are very powerful features of C#. With them you can write clean and efficient code also in Unity.

However, I have found delegates bit confusing to understand. Most of the examples I have seen are not so easy to understand, especially if you are a self-taught coder like me. :)

Most of the examples I have found are using both delegate and event definitions. Something like this:
public delegate void PlayerHit(int damage); 
public event PlayerHit onPlayerHit; 

But personnally, I like using Action<> type instead. It allows you to replace two lines with one and it will make your C# code simpler. It also removes some confusing buzz around delegate definition. Here's an example:
public static event Action<int> PlayerHit;

So, at least for me this looks more understandable.

Please find below two very simple code snippets from my GitHub repository to see a real life example using Action in defining delegate. In this example event passes one integer, but you can…

Flamingo Tap Tap Run

Image
Edit 9.9.2019: It seems that Flamingo Tap Tap Run is our most downloaded game after one week from publishing. However, I have to admit that few tens of downloads is enough for this "achievement". :) 

My game development journey continues with "Flamingo Tap Tap Run" Android game, with pretty simple visual outlook and simplified mechanics. Please download game for free from Google Play Store and have a try!

My emphasis with this project was on character animation because my previous games have been using animations for maximum of 4 frames per move. Therefore, this was first time I used Spriter tool for creating and extracting complex animation spritesheets for Flamingo movements. For example, I was using 64 frames for walk animation. After all messing and fumbling result looks pretty ok and at least character animations are lot smoother than in my previous projects.


Game logic was created with Unity3D and C#. New tricks (or structures) for me were delegates, that wer…

Issue with Unity3D: "Found plugins with same names, and ."

Image
*** IMPORTANT *** Following contains my approach for fixing duplicated plugins error in Unity3D. I have no idea if it is a correct way to do this, but it worked in my case. 
BACK UP YOUR PROJECT BEFORE TRYING THIS APPROACH! 
*** IMPORTANT ***
So. let's start. 
I decided to try using Android App Bundle (AAP) instead of regular APK because I got an understanding that it might make game download and installation size smaller. However, I was using bit too old version of Unity3D so I downloaded latest version from their site and converted my exising game project for that.

Game conversion from Unity 2018.2.13f1 to 2019.2.0f1 was running smoothly with no errors. But when I tried to compile my little game for Android, I got bit strange error message:  "Found plugins with same name,  and  . Delete the one of the duplicate plugins" (please note the empty spaces around 'and' word). 












I have seen something like this earlier when struggling with different plugins, but duplicated p…

Running multiple domains on one NGINX server

In addition to westsloth.com domain we have now registered westsloth.fi domain for our planned business in Finland (mostly HW/SW consulting and financial and office management services).

As we are doing this part-time, we want to keep web hosting costs in control. Therefore we wanted to run the web pages of both domains on same server.

The original homepage of WestSloth Games (westsloth.com) has been running on single AWS Lightsail instance. In this solution, the monthly expenses are well-know in advance. But on the other hand server capacity is limited to some level. Anyways, the load for westsloth.com has not been too large for the Lightsail instance to handle it. So we thought we can easily run westsloth.fi on same server too.

Westsloth.com webserver is built using NGINX, Gunicorn and Django framework plus local MySQL database. Web page is built using Bootstrap front-end framework.

Adding another domain to NGINX setup was done by following these instructions on applicable part:
http…

We are officially a company!

Image
After 6+ years of existence and hobby-based game development, WestSloth Games is now part of a freshly registered company called Westsloth Oy! My family member needed to set up a company for invoicing occasional work, and we decided it's time to make Westsloth a real game company!

To secure company's finances our main businesses are computer hardware and software consultancy plus office and financial management services. But game and app development stays as an essential part of Westsloth and we hope games will start generating revenue in the future.

This change does not have much impact the way we develop games: At the moment I am doing development on a part-time basis (my day job has priority). But of course things can change. And as before, we know we are still ramping up our game development competence and our target is to do every new game better than the previous one!

Transition to company control is ongoing and there will be some changes e.g. in WestSloth Games social …

WestSloth Games: New website with brand-new domain!

Image
In addition to game development hobby I have improved my web development skills by creating and developing websites for my own purposes.

Now I have taken a step towards cloud services and web backend by releasing brand-new landing page for our released games:
http://www.westsloth.com/

Page features:
- Single-page, album-style design
- Responsive, scales for all screen sizes
- Admin console with login for adding/removing/modifying games entries easily

Under the hood:
- Django web framework
- Bootstrap front-end component library
- Local MySQL database. Option to use Postgresql e.g. from Amazon RDS
- Gunicorn Python WSGI HTTP server
- NGINX web server
- Runs on single Amazon Lightsail instance (AWS EC2, in practice)
- Amazon Route 53 for domain hosting and DNS

Basically, building simple landing page using Django was surprisingly easy: There are plenty of good tutorials available all over the web and almost all issues were solved by googling error messages. It took me approx 2 hours to ge…