Blog

How to go from self-taught to professional game dev

Many people, especially on Twitter, have asked for advice on how to become a professional game developer if you are completely self-taught. Since I am not a parrot and repeating myself gets boring I figured I’ll answer that question here once and for all.

Let me first tell you my story: My name is Kristin and I am 27 years old by now. I initially studied psychology but I have been working in the games industry as a game programmer for about four months now. I never went to university, nor have I had any kind of professional training that taught me programming – I did it myself over many hours, with a bunch of books and a lot of trial and error. When I decided to kiss psychology goodbye I did what probably everybody else does and what may lead you to this post – I googled.

Now, that’s when I became really, really frustrated. What you read the most is people telling you that you need to have a fancy college degree in Computer Science of any kind. And if you don’t have that you’ll have to sacrifice for unpaid internships. You know, the kind where you probably won’t do much programming and you are eventually ending up playtesting or – which is worse – bringing someone coffee. It should go without saying that an unpaid internship might be great for someone who is 16, but if you have reached a certain age it is obviously not an option – there are bills to pay.

Obviously, after reading all the relatively negative articles I was devasted, it felt like my dream crumbled away, which is one of the main reasons why I am writing this post – I don’t think any of it is true.

Do I think everybody could be a game developer? God, no! You do need to have a few qualities to actually stand a chance and here they are :

Work ethic:

Being self-taught means that while you might know how to do something, you probably don’t know the best way to do it. There will be times where you are set on a project and anybody with proper training and/or experience will know what to do right away, whilst you have to figure it out. Your colleagues will most certainly be faster than you and you might have to throw in some night shifts to do stuff in a timely fashion. It’s the price you pay. Obviously, it won’t be like that forever – but it probably will be for the first few months.

Honesty:

You have to make sure to tell your potential boss where you are at, there is no point in saying you can do something you can’t. You’ll waste their time and yours. Someone who hires you or even just gave you the chance to have an interview does know that you are self-taught. He won’t expect you to know everything. There is no shame in saying that you can’t do something if you are willing to learn it.

Willing to learn:

Being self-taught only goes so far, there are limited resources and even if it would be possible to read every book on programming that exists, it would still be highly unlikely that you do know every common practice, which makes sense – but you do have to be willing to learn. Working with professionals will teach you more than all the books you’ve read – I can vouch for that. I’ve learned incredibly much already.

If you match all these criteria – great – you do stand a chance! Now, how and where to apply?

I highly suggest and I can’t stress that enough – work on a portfolio before you try to apply. Portfolios are a common practice in the games industry and they do give a possible employer an insight into your abilities. I wrote a post about portfolios which I still stand by here: Some advice on portfolios. If you want an example of a portfolio that actually got someone a job, look around here – because this is mine :-).

Once your portfolio is done it’s time to send out a few E-Mails. What I ended up doing was looking online who is hiring. One thing, that is very important is that all these jobs you see posted might sound scary and they list a bunch of things you might not be good at, keep in mind that this is just what they picture their ideal candidate like, it’s not set in stone most of the time. What I am trying to say is – Be brave, just try and apply – the worst thing that can happen is that they won’t answer or they say no right away. The only thing that is really important is that you are honest about who you are and what you’ve done – I’ve heard a lot about people “pimping” their CV’s – don’t do that. The job I now have had a bunch of things listed that I had never worked with but they still hired me because they saw potential.

There is one last thing I want to point out. I know that switching careers is stressful and being rejected can hurt but you do have to be considerate. If you are starting out like me then you don’t have experience and no degree – asking someone to hire you is basically asking for a lot. They are taking a risk because there are no references, there is no one that can vouch for your abilities, it is understandable if they don’t want to take that risk – but if you keep your cool and you still make a good impression – it is most likely that they will keep you in mind. And while you might not be a good candidate right now, you may be later in time.

I hope this post helped you out a bit. Feel free to comment or tweet questions if there are any.

 

Being a girl online

I am by no means a social justice warrior or an extreme feminist. (Pretty sure I will end up getting shit just for that sentence alone, but whatever.) I do wish for equality but I still do enjoy a little tradition, I never had an extreme opinion about that topic and I don’t think to have one is really necessary.

About three years ago I had a blog about my experiences being a female gamer, that site was never meant to trigger or hurt somebody, it was mainly me telling my stories not aiming for much except to make people laugh, cause to be honest- even if it didn’t seem funny at the time while it was happening to me – I think it is quite funny if I think about it now.

Since I don’t really need a portfolio anymore because my lucky ass found the greatest job I could possibly imagine I thought I might transfer all those blog posts to this site, they are here for you to have a laugh and maybe gain some perspective on how things can be when you are female and roaming around online.

One thing, that is very near to my heart is the following: – and I only mention it because back then I had a guy giving me shit for that – I don’t want you to feel sorry for things that happened to me back then. In all honesty, think about it that way:  every story has two sides – maybe someone just perceived things differently, that’s always an option. I certainly don’t see these posts as sad stories, for me they are funny anecdotes.

I hope this is enough of a disclaimer but if you still feel triggered or what not and you want to harass me about it, here is your green card, do it – I don’t mind! 😉

I’ve been into games for several years now, ever since I was sixteen actually.

As far as I can remember (Bare with me, it’s been a decade!), there were pretty much no girls playing anything online when I started. I was the only girl I ever heard of playing Counter-Strike back then.

I really vividly remember moments where I accidentally shot a team mate and of course, as one does, I said sorry via in-game voice chat and just a second later I had ten new friends requests on steam.

Times changed a lot since then. Now I see a shit ton of girls calling themselves gamers. I guess there is some sort of trend going on.But what really grinds my gears about that is that I see so many girls on social media using the phrase “I am a gamer.” to meet guys. Which sounds insane if you imagine the stereotypical World-of-Warcraft gamer that probably still lives in his mom’s cellar (I swear to god, this is not meant to be rude!)

Why did it ever become trendy to be a nerd or gamer? I kinda hope that this trend will be over soon because I am really sick of getting compared to chicks that post naked pictures of themselves using controllers as props, but that then actually think Tetris would be the name of the orange juice container.

I really don’t want to be seen as sexy just because I tend to like video games but I really don’t want to hide because of my gender either… I mean is it too much to ask that I just want to be left alone about that?

I am pretty sure you know those kind of women that scream “Don’t sexualize me!” but then post half naked pictures of themselves somewhere online? Well Lady, I am sorry to inform you – but you are the reason women are sexualized. Nonetheless it’s 2017 now, and still – if I join a Teamspeak server there is at least one guy awkwardly moaning “Oh, do we have a girl here?” – Well Bro, thanks for stating the obvious. I don’t want people to make a fuss about me just because I am female – there is nothing special about that, half the population is female.

You know, it’s always a different story if I flirt back, which I do from time to time.

If you are a girl online, you have to be prepared to being sexualized and harassed the minute you start interacting with people – which doesn’t mean everyone is a stupid moron who just thinks with his lovestick – there are decent people, but there are the idiots too.

Here, have an example of a probably very frustrated twelve-year-old who decided to leave me a very loving comment on my steam profile.

steamhass

Anyways,stay tuned if you want to hear/read a lot of crazy stories that happened to me playing games online.

Behavior Trees in Unity

As you probably know,  Behaviour Trees are the way to go for a lot of AAA Titles and there is a good reason for that! The biggest perk Behaviour Trees come with is their simplicity, especially for complex projects. Obviously, Finite State Machines still are the easiest to implement – but in the bigger picture – they can get shockingly overwhelming with increasing amount of possible states.

This blog post will cover the basics of a Behaviour Tree and how to implement your own Behaviour Tree framework. Keep in mind that there are a lot of great solutions out there on the Asset Store that are way more detailed and fine-tuned as what I am showing you here. This blog post is merely for those who have no idea about Behaviour Trees and just want to see how it works and how it’s done in a simple way.

EXPLANATION:

What is a Behaviour Tree?

It is a branching, hierarchical system of different tasks that share a common parent, which is called the root. Picture a tree with the roots, the stem and all its little branches that eventually have leaves attached to them.

Now,  Tasks can represent tests or behaviours. If you have been working with Finite State Machines before you will know that they follow transition rules. F.E. if a target is close enough – attack. A Finite State Machine has to test all of the conditions for all of the states it could possible go to from the state it is currently in. A Behaviour Tree works differently in a way that its flow is defined by each single task’s order within the entire tree hierarchy.

Behaviour trees are executed starting from their root task, continuing through each child, which, in turns, runs through each of its children until a condition is met or the action task/ leaf task is reached.

Task Types:

There are different types of tasks, but all of them have one thing in common and that is that they will always return one of the following states:

SUCCESS – The condition we checked for is met.
FAILURE – The condition we checked for isn’t met.
WAITING – The condition we checked for has not been determined.

I think SUCCESS and FAILURE are pretty much self-explanatory, so let’s focus on WAITING.
Behaviour Trees can get really complex, therefore a lot of their implementations are asynchronous and this is why we need a waiting state. Imagine a tree with 100 tasks of different complexities, some of them may even need a couple of frames for evaluation, if they wouldn’t run asynchronous, this would result in massive freezes if we would have to wait for each task to either return true or false/SUCCESS or FAILURE.

Composite Tasks:

Composite tasks can have more than one child and their state is based purely on the evaluation of its children – as long as the evaluation of its children is still running, it will be in WAITING state. These tasks can be split up into different types as well, Sequences and Selectors, those separations are made upon the way their children get evaluated.

Sequences run from left to right. A Sequence only returns SUCCESS if all of its children have been evaluated as SUCCESS.

Selectors return SUCCESS if at least one of its children returns SUCCESS. The only way a selector returns FAILURE is if all of its children returned FAILURE.

Decorator Tasks:

A Decorator task has only one child. It may seem strange to rely on a child if there is only one of them but the decorator is special in a way that it takes the state returned by its child and evaluates it based on its own parameters, it can specify for example how and how often its child gets evaluated.

Just as composite Tasks, decorators can be split up into different kinds based on their functionality.

Here are the most common ones:

The repeater will repeat the evaluation of a child until it returns either SUCCESS or FAILURE.

The inverter will inverse the return of its child.

The limiter will limit the number of times a task will be evaluated to avoid a weird looking behaviour loop. It is different from the repeater in a way that it will only try to do something for a certain amount of times before moving on to trying something else.

Like is said, the possibilities are endless and you surely can combine different functionalities aswell, although I would advice you to not go overboard with this as things will get unorganized if you do so.

Action Tasks:

Action Tasks or leaf Tasks are the outermost tasks of your Behaviour Tree. They will carry your executed agent behaviours like walking, running, shooting, fighting and so on.

IMPLEMENTATION:

Now that you know how Behaviour Trees work in theory, I wrote a simple Behaviour Tree to show you how all of this is applied codewise.

See the entire Source Code on GitHub

 

 

 

The Psychology of a Gamer

As a former psychology student, I’d like to share my knowledge which is applicable to game design/development. It would be a shame to waste it after all.

What a game developer/publisher wants to achieve usually is a game that excites a lot of people for a longer period of time. What you want is bonding, you want them to return and spend a lot of time and possible money on your game – that’s not just economy it’s actually also psychology.

Luckily human behavior has been researched for quite some time now and this high level of engagement, we as developers/publishers are seeking, is called the Cognitive Flow. This flow has been experimentally evaluated in the 70s, resulting in the following theory:  a persons skill and the difficulty of a task are connected to result in varying emotional and cognitive states.  What does this mean and how does this apply to games? Well, let’s say we are developing a game that right away starts with the hardest level, obviously this is barely manageable for a player to solve – this resolves in an anxious feeling, promoting to give up. Alternatively a game that is too easy would bore the player and result in leaving it aswell. Only if you find the middle ground between too hard and too easy you’ll have a chance of achieving a so-called flow state which would engage the player.

Why would you want to achieve a flow state?

Well, as a developer/publisher your goal is most likely to promote and sell your game or maybe even in-game-items. It’s been researched that people in flow states are high in focus on the game, they feel in control, action and awareness merge together, they lose their self-awareness, feel time disorted and they feel like the task is the only thing they need to focus on in that moment. What does that mean to you? If players are that determined to suceed in your game, they first of all spend a lot of time in it and second of all they are way more likely to pay for content.

How do I achieve flow states?

There are four main characteristics that can increase the probability of flow states.

I.) Concrete tasks and manageable rules

We need clear rules in order to keep the flow up – feeling helpless and disoriented is going to lead to disengagement. Game Designers and Developers should take in consideration that we only have a limited attention span and we can only process a certain amount of information in a short period of time. Relevant information shouldn’t be given too quickly or too short as this can result in missing something crucial. It’s been proven that when we don’t understand a task completely – we are more likely to become frustrated and give up completely.

II.) Realistic capabilities

Even if the rules and goals of a game are completely clear, if the player is unable to achieve it because it is just to hard – he will have a bad experience and disengage. Basically the same goes for to easy tasks. A Developer or Designer has to make sure to balance out the difficulty of a game, optimally by having a learning curve, allowing the player to improve his skills over time.

III.) Clear and timely performance feedback

A player is less likely to enjoy a game without any feedback on performance. Think about when you were a kid and you played football without counting points, as a child – that probably satisfied you because you hadn’t developed the urge to compare yourself to others/higher standarts yet – but now as an adult, this seems like the most boring thing to do. We need competition to feel accomplished – even if its just trying to beat our own high scores.

IV.) Don’t overwhelm players by distracting them

Surly fancy animated buttons look cool, but a lot of them can quickly overwhelm and distract. It has been shown that distraction and draining attention by overwhelming a player can increase the likelyness of them to stop playing. If a game has stunning graphics, that’s neat – but you have to find a healthy balance espacially between shiny, bouncy things because they can be overwhelming if there are to many of them. In that regard what seems to be cool at a moment can quickly get too much for a person to take in which leads to a lack of focus.

Examples:

Well there are many games that use one or more of those techniques and thats a big part of what makes them so successful. Look at Counter-Strike – it’s been one of the most known Shooters of all time – why? You have a chance to grow in Counter-Strike, you’ll eventually get better the longer you play as your aim get better naturally – this allows you to improve. Its also highly competitive with immediate feedback of peromance. After each round you see your score! They even improved that by giving out the stars in Counter-Strike Source at the end of each round and the domination feedback in Counter-Strike:GO.

Another great example that actually used these techniques to earn a lot of money through In-App-Purchases would be Candy Crush:

The game itself and its rules are rather simple. The difficulty is increasing intensity in each level you proceed. They basically lure you in by giving you free boosters every now an

Procedural Sky

This is a simple tech demo for creating a day and night cycle with adjusting sky, light, atmosphere and fog.

How it works:

I am starting with determing the length of the day in seconds and counting the time. The current time acts then as my evaluation point for all the settings for Sun, Light, Atmosphere, Exposure and Fog. I added the option of using the different ambient modes Unity offers.

Explaining this is rather hard as it really just is a bunch of gradients and curves which we then evaluate depending on the current time. I highly suggest taking a look at the source code, you’ll see it is a rather simple approach but it gives you a lot more freedom in creating the sky instead of just setting three set skybox settings.

See the entire Source Code on GitHub.

Screenshots:

 

Demo:

687474703a2f2f692e696d6775722e636f6d2f6579317863594d2e706e67

 

 

 

Unity Update-Manager

I wrote a blog entry on performance optimization before. It focused on how code optimizations can enhance your performance by about 50 percent.You can check it out here!

This tech demo goes a bit deeper and to do that you’ll first have to understand what Unity does unter the hood. Unity utilizes a messaging system that lets you use a bunch of functions that will be called at specific events during runtime. Said functions are your basic Awake(),Start() and Update() for example.

The engine checks each MonoBehaviour for those functions and then adds them to lists according to the functions they intail. At runtime Unity iterates through those lists and executes the methods from it one by one.

This does sound great, and oviously it works – but there is room for improvement.

What are we aiming for?

We want to have some more options then what Unity gives us and more control over the functions we had to begin with.

How to do it?

First off all we’ll have to extend MonoBehaviour with public virtual void functions for ManagedUpdate, ManagedFixedUpdate and ManagedLateUpdate (See the ManagedMonoBehaviour class on GitHub for reference.)  Next up we’ll need the UpdateManager.

The UpdateManager class holds an array for each type of Update call. It keeps track of all of them and sorts them into individual arrays for each kind of Update. At it’s own Update, FixedUpdate and LateUpdate it iterates through the arrays and calls their managed functions.

You’ll find the entire source code at the end of this entry, but keep checking back as I am going to publish this as a free Asset on Unity’s Asset Store.

Source Code:

See the Source Code on GitHub!

Deep Profiling Results:

Check out the screenshots for results, they’ll speak for themselves . This has been testest by having 101 active objects each with 3 functions either calling Update() in the unmanaged version or ManagedUpdate() for the optimized version.

Obviously this isn’t as realistic of a result as it could be, by actually adding it to a game – but it should give you a plain idea of what is possible.

unupdates

updated

Performance Optimization in Unity

I did a lot of research on the topic of performance optimization in Unity. I recently added all of them up and compared the results to decide whether they are worth it or not. Obviously, there is no such thing as too much performance but with having clean, pretty code in the back of your mind, you have to evaluate and see to which extent code optimization is worth it. You’ll grasp the full meaning of this if you continue reading.

1.) Minimize Vector Math

Let’s say you are calculating a Vector3 velocity by a float speed and Time.deltaTime. If you do it like this:

Vector3 newVelocity = velocity * speed * Time.deltaTime;

Under the hood of Unity, this does actually make two vector multiplications.
But if you then just combine all the floats together first by simply placing parenthesis Unity only will do one vector multiplication.

You could go even further with that and optimize it even more by doing it like this:

float factor = speed * time;

newVelocity.x = velocity.x * factor;
newVelocity.y = velocity.y * factor;
newVelocity.z = velocity.z * factor;

Now you will start to understand what I meant by making compromises regarding clean coding. Obviously, this doesn’t look as bad in a simple code with a few lines, but it will be way harder to read on a longer project.

2.) Reducing Engine Calls

Unity is written in unmanaged C++ code, while we are working with managed C# code – so everytime we request something from Unity the engine has to process a lot of data to go on the one type of code to another.

Let’s say you need an object’s transform, by calling gameObject.transform, Unity does some safety checks before returning, for example checking if the object does exist. You can avoid these checks if you cache the objects Transform. Obviously, this is only a good idea if you are sure that the object can’t be deleted.

Another thing that would be a good idea to do in this regard is instead of using Time.deltaTime creating a globalDeltaTime and using this instead.

Or, if you are sure that an object’s position isn’t going to be touched by anything else but your script you can simple cache your lastPosition yourself and update it if you move the object.

3.) Set Position and Rotation at the same time

This is only possible if you are using Unity 5.6 as this was a hidden function in earlier versions that could only be activated if you had access to the Unity Engine Source Code. This function is very useful if you have to change position and rotation of an object as it allows you to do both things at half the price.

Deep Profiling Results:

Now I know this is rather theoretical and you possibly heard some of those tips before but I actually went ahead and tested it out in a scene with 1000 active objects that had the following very unoptimized script attached.

unoptiscript

And here is the deep profiling of exactly that scene and the performance output in the game view:

unopti1unopti2

And here is the optimized version:

optiscript

And the test results under exactly the same circumstances:

optimizedAopti2