Survive at all cost and find the way out of the infested space vessel.
Created by: Dimitry Mitrofanov aka "Pixeye" ( Gamedesign/Programming) , Alexander Yazinin (Art/Animations) and Akmulin Artem ( Sound Design/Music )
Greetings everyone and thanks for visiting Cryoshock page! We are a small indie team with a burning desire to produce the best quality games.
My personal story of using Unity goes from version 2.0 a decade ago, and I grew up from hobbyist programmer to indie developer with a released game (Dungelot ) thanks to Awesome Unity tools that simplify game developer life a lot.
Cryoshock is a hand-drawn modern pixel art 2.5D brawler/action game about a guy that woke up after cryosleep on the gigantic infested spaceship. During the journey, he will find out what happened to the ship and the crew and maybe even manage to fight through this nightmare and escape on a lifeboat.
Fast, intense action
Early alpha version:
Controls: arrows to move, Z - shoot, X - punch, Shift - roll, Space - jump
Controller ( xbox ) : L2 - roll, X - shoot. A - jump, B - punch
If you get killed just wait for a sec or two, the game will automatically restart.
MacOS ( not tested )
I write game logic with in-house ECS framework designed on the top of the Unity. It allows me to experiment with game mechanics a lot without fear of breaking core of the game.
The best thing about Unity is how quickly I can extend editor by custom self-written or 3rd party libraries. Our workflow wouldn't be so great without :
This tool is a must-have for organizing the inspector view. We never use more than one monobehavior on the game entity ( only as a wrapper between unity game object/components and our framework) - and Odin Inspector is very handy in grouping variables inside of those scripts.
Let's face it :) Unity animator is an great tool for 3d games but it's a pain to work with 2d animations in unity — thanks to PowerHoof for providing excellent 2d animation tool.
TexturePacker from CodeWeb is a lifesaver when you need to deploy some sprite atlases.
I don't know what would I do without post effects from Colorful FX. They are very easy to use and help a lot in making the game look from vignette to noise and analog tv effects. On the picture below I use screen coloring process for boss appearing.
Se Natural Bloom And Dirty Lens.
This library gives stunning bloom effect. In Cryoshock game I use a lot of HDR colors, and this library comes in hand to show those colors. I use it to express HP of the hero. The hdr color of the player's helmet shows current health. The green color of the helmet means that everything is OK : )
Unity Pixel Perfect Camera.
As we are creating hand-drawn pixel art, it's essential for us to show it as crisp as possible. The PP camera is something we were waiting for a long, long time : )
Rewired with no doubt the best solution for working with input and controllers. I can't imagine how much time I've saved on by using this awesome library.
Our tips on working with Unity.
Use scriptable objects whenever it's possible! They are not only great as data containers but also can have some logic inside. Let me provide a simple example of how useful SO can be.
Normally in a 2d game, you will often need a simple animation solution: s sprite sequencer. I wrote one myself and attached the sequence controller to desired objects.
Then, I make a special SO script. Let's call it "Template Animation." It will contain an array of sprites and step between frames.
[CreateAssetMenu(fileName = "Template Animation", menuName = "Actors/Templates/Animation")]
public class TemplateAnimation : ScriptableObject
public float step = 0.1f;
public Sprite sprites;
Now you can easily add new "Animation Template" assets and attach them to the sequencer controller.Use extensions. Often a suitable method is preferable than a class object.
One of my favorite examples :
public static class Phys
public static readonly RaycastHit2D hits = new RaycastHit2D;
public static readonly Collider2D colliders = new Collider2D;
public static int CircleOverlap2D(Vector2 pos,
int mask = 1 << 0,
float min = float.NegativeInfinity,
float max = float.PositiveInfinity
return Physics2D.OverlapCircleNonAlloc(pos, radius, colliders, mask, min, max);
By making a wrapper for Unity physics methods, we can save some time on actual coding by reducing routine of hits/colliders initialization.
int hits = Phys.CircleOverlap2D(position, 0.05f, 1 << 11, position.z + cAmmo.template.depthMin, position.z + cAmmo.template.depthMax);
for (var i = 0; i < hits; i++)
var col = Phys.colliders[i];
I'll add more documentation about our process soon. Hope you enjoyed this article and found our game appealing. See you later!