JetBrains Rider – Alternative to Visual Studio

For quite a long time Unity installer was coming with custom MonoDevelop distribution to assist Unity developers with starting with game development. At that time it was the only available option for many, since other solutions were simply too expensive. Then Visual Studio Community has been introduced and almost immediately it became the default Unity C# IDE, but only on Windows operating system family. It seems like quite soon we will have another player on the market and his name is JetBrains Rider.

.NET enslaved by Windows

It’s not surprising that the language created by Microsoft works best on Windows operating system family. It seems that even Microsoft is surprised by how .NET got so popular these days. It’s a bit of a problem, because today we’re entering a new era in which Windows is no longer a dominant operating system in the world and .NET is widely used on variety of platforms thanks to Unity. If Microsoft wants to keep .NET position and profit out of development tools, .NET must become a cross-platform framework for real.

The first step of becoming more open to multiple platforms was introducing .NET Core (wikipedia) – the first open-sourced .NET implementation. Then Microsoft introduced Visual Studio Code – the first editor with “Visual Studio” in name that works on MacOSX and Linux. Still Visual Studio Code is “only” a GitHub Atom fork. It’s a great editor, but it’s nothing when compared with original Visual Studio IDE running on Windows with ReSharper onboard. Speaking of which…

There’s a new player in the game

There’s a market gap for sure – more and more developers tend to use Mac OS X or Linux as their development platform and beside Visual Studio Code and MonoDevelop (which is good, but not so great) there was nothing worth considering until recently.

JetBrains is a Czechia based company known for the creation of a great Visual Studio extension called ReSharper, and IntelliJ IDEA (IDE for Java developers). It seems like they’ve recently decided to merge those two.

JetBrains Rider is a cross-platform .NET IDE based on the IntelliJ platform and ReSharper. If you don’t know either one of those, then consider this as a great opportunity because learning these two tools will change the way you work with your code forever. Do I need to tell that it will increase your productivity? Yes, it’s a buzz-word, but it’s true! What is more important, it will make your work easier and you – happier.

How valuable your time is?

Do you value your time? How much time do you spend on writing easy but bloated code and how much on focusing on problems that matter? ReSharper is a tool that helps you to get through the parts of the code that are not requiring too much of your brainpower. It consist of powerful generator and refactoring methods that will assist you on demand. It also includes code analyser that makes sure you won’t make any simple-to-prevent mistakes. Besides that, it just tries to be smart and friendly to a developer.

Rider comes with native Unity plugin! It does not only make it aware of *.meta files, but also know MonoBehaviour specific methods like Update(). Thanks to it you will see a code-completion of these methods and you won’t be seeing any warnings about unused functions.

It’s even aware of Unity-specific optimizations like tag-comparing:

And maybe it’s not that important, but it also shows how Rider developers are getting into details – colouring of Color struct constructor:

Yeah, your guess is right! It shows you the actual defined color!

I won’t make a complete list of ReSharper features, because there’s just too many of them. Instead, please browse the documentation. There’s a lot of great and simple to understand examples out there.

Still, it’s important to mention that Rider, by contrast to Visual Studio Community and Visual Studio Code, is not free. Actually, it is distributed via Early Access Program which now costs nothing, but it’s justified to believe that Rider will be using a subscription payment model. For many people this information would be a no-go, but consider whether it is worth it – it can increase your productivity (in my opinion quite a lot, if you get to know it well).

But I’m happy with my Visual Studio on Windows!

I’m also a satisfied Visual Studio user on Windows. Why changing it then? The reason may be quite simple, take me for example. I’m working on Windows about 50% of time. Rest of it I spend on my MacBook and Linux Mint. On all three I sometimes need to do something in Unity. The real pain is that I have to use totally different IDE on all three platforms since Visual Studio Code for some reason does not play well with Linux (some strange mono issues) and I had to use MonoDevelop there. I’m really looking into Rider to get out from EAP to use it constantly on all of my 3 development platforms. And even now, while it is still in early stage, it works really, really well! Yet, if this scenario doesn’t fit you at all, I still encourage you to try it!

Conclusion

Rider is a fresh approach to .NET development. It focuses on developer’s productivity, happiness and it is aware of current market trends, which makes it an interesting alternative to Visual Studio.

JetBrains reader can be downloaded for free from its home page. Each version has a expiration period of one month. New versions are released at least once a month so until Rider is still in development, you will be able to work with it without any costs.

I strongly encourage you to learn as much shortcuts as you can – this IDE has been created for those who favor keyboard over mouse. If you don’t know the shortcut that you’re looking for, try hovering over an option to see a tooltip that often will tell you wanted key combination or try pressing shift twice to open Search Everywhere popup. It allows you to search through all of the Rider actions.

Optimize yourself! [Part 2]

Things you can do better in Unity!

This is the second part of our tips list, that can help you increase your productivity with Unity.

The first part can be found here. So definitely check it out if you haven’t already!

1. Unity project setup wizard

When you’re creating a new project it often takes at least half an hour to setup everything. There are at least 2 ways for you to save time here:

  1. Simple: create a project template with basic setup, folder structure and version control ignore file. This will be the most efficient one to make and you can put stuff in it already. But it is not the most customizable one, so probably you will need to spend this additional time on finishing your configuration.
  1. Advanced: create a module that will be responsible for setting up your whole project in a way you want it. With as many game/folder structure/architecture variants as you’d like to have. And in a perfect world, it would be great to have such module but it takes time to make it.

No matter which option you choose, it is always helpful to have a solid foundation for you project 😉

2. Finally you drag the list of objects into the component

Sometimes you may come across a case where you have to fill the list of objects with objects from a scene or a project. When you’ll first try to select all of the objects you’d like to assign, you’ll realise that Inspector is no longer showing you object with your list to fill. There is a very simple solution to that, and not many people know about it.

In a top right corner of Inspector there’s a lock button, that locks Inspector focus on current view.

Now you can select as many objects as you like and you can easily drag and drop them all into the list in Inspector.

Done!

3. Use build-in json tools

Normally, when you are working with JSONs, you have to have JSON parser. After parsing a string into JSON object, you have to assign all the values from JSON to the desired object, which is super boring to write each time…

However, since the Unity 5.3 they gave us built-in JsonUtility which will do most of it for you!

Warning: JsonUtility currently works only with ‘structured’ JSON and does not support types, like dictionaries. If this is a problem for you, then you probably need to find a fully-featured JSON library.

For more information about JsonUtility you can go to: https://docs.unity3d.com/Manual/JSONSerialization.html

4. One script that handles all of the platforms?

If you are new to programming, you probably don’t know much about platform dependent compilation. If you are into programming, then you have probably seen a code that uses platform dependent compilation a few times, but you might not understand how it works. It’s simple! It gives you the power to write the code that will be executed only on a specific platform. So you might ask why it’s good to use it? Because you can use libraries designed only for one platform.

For example: you are making the greatest game of all time for Android and iOS. And you want to implement that last feature, namely leaderboards. You’ve created a button to show these native leaderboards and assign method OpenMainLeaderboard() to it. And now it’s time to implement this method, but how will you run Google Play Services on Android and Game Center on iOS?! That’s simple! Use platform dependent compilation!

Example:

With that you don’t have to worry about the missing references from libraries that are not designed to run on other platforms.

If you’d like to find more platform directives go to: https://docs.unity3d.com/Manual/PlatformDependentCompilation.html

5. Don’t waste your time for reimporting project over and over again

Aren’t you tired of waiting for your project to be reimported each time you change build platform? For me it’s not only boring, but also wasting a lot of time! But there is a mighty solution for that, which no one ever told you about!

In Unity there is something called Cache Server. It can be configured to work on your local machine or on a dedicated server. This cache server will save your reimported assets and when you change your build platform, it will give you back your reimported assets, so you don’t have to reimport them again! This is great! And the only thing you have to do is to go to Unity > Preferences > Cache Server and change Cache Server Mode to Local or Remote.

You can read more about Cache Server on our blog:

http://blog.theknightsofunity.com/using-unity-cache-server/

http://blog.theknightsofunity.com/unity-cache-server-localhost-make-sense/

Summary

That was top 10 things that you can do better in Unity (with those in the  previous part)!

I hope that this list will help you save a little more time that you will still waste by watching another cat video on the internet 🙂

If you have your own trick to speed up your work, then don’t hesitate to share it in a comment section below.

And don’t forget! Optimize yourself!
You can also subscribe to our newsletter, so you won’t miss our posts in the future!

Optimize yourself! [Part 1]

Things you can do better in Unity!

How many times you’ve been bored or annoyed because of some stuff you had to do over and over again? Probably countless… But fear no more!

Bill Gates once said “I choose a lazy person to do a hard job. Because a lazy person will find an easy way to do it.”.

And you might ask why even I’m bringing this quote here? It’s because I am going to make you lazy in a good way… 😉

Let’s get it started

The main reason we came up with idea for that list is the fact that we (as  humans) are lazy by design and we don’t like to repeat ourselves in our daily tasks. As a  result, we came up with tools and tricks that we use to make our life easier and we hope to make it easier also for you!

So here are top 10 things you can do better in Unity:

1. Change your play mode editor color!

How many times you’ve been tweaking your game to be in this one perfect spot? And all of a sudden you realized that you just clicked on pause button and lost all of those changes? Of course this is how Unity works, but how many times you forgot about it? Probably not only once. 😉

So the simplest solution to remind you that you’re in the play mode is to change editor’s play mode color! To do so, just go to Unity > Preferences > Colors and change your Playmode tint color to something more vivid.

Results?

2. Let the code write itself

There are many tools that can extend your IDE and give you just a little bit of support for your programming skills. One of such extensions is JetBrains ReSharper which is so useful that you probably won’t want to program anything without it.

This tool analyzes the code for you. This tool writes the code for you. This tool finds bugs for you. THIS TOOL EVEN FIX THOSE BUGS FOR YOU! Maybe not all of them, but it fixes the typical ones without any problems 😉 If you are programmer then you should definitely check it out.

Here are some examples:

  • Converting code to Linq:

  • Converting code from Linq:

  • Adding missing usings:

  • Generating methods:

Home page of ReSharper: https://www.jetbrains.com/resharper/

3. Optimize your build pipeline

When you’re developing your next very best app or game you are probably making a lot of builds per day. Each build can take up a few minutes or even an hour to make. This is bad especially because it’s impeding your work till the build is finished.

So let’s count the time you waste because of that process. Let’s say that your project is medium sized and need ~20 minutes to build on Android and ~1 hour to build on iOS. And you’re making 1 build per day at minimum. Now let’s sum up the time it takes to make those builds in one month (20 work days): Android builds – at least 6h 40m. iOS builds – at least 40h. This is more time than it took first spacecraft (Luna 1) to make flyby of the Moon in 1959! Which took only 36h! But how to save so much of your time? Use external tool to make those builds for you!

For a long time, the most popular one was Jenkins, which offers you a lot of flexibility. Also, it’s giving you basically unlimited possibility to configure your build pipeline to suit your needs, for example:

  1. Watch repository for new commits.
  2. Analyze code.
  3. Make a build.
  4. When finished, send build file to a FTP server.
  5. Send mail with a build report and a link to build file.

Of course there are a lot more options, and if you ever need more, then you can always add some. Oh, and I almost forgot! It’s available for free! So you just need to go to their website, download it and install it on your build machine 😉

More about Jenkins: https://jenkins.io

The other tool is provided by Unity itself and it’s called Unity Cloud Builds. It of course assures better integration with editor, where you can basically configure everything you need to start using it. Like Jenkins, it is also available for free, but with Unity subscription your builds will be higher in priority list and will be processed faster. Additionally, after each build Unity generates the link to your build to download or to share with your friends 😉

More about Unity Cloud Builds: https://unity3d.com/services/cloud-build

So what are differences between these two? Jenkins is open-sourced and has a huge library of plugins to install. You can for example integrate 3rd party APIs like Slack with it. Jenkins also allows you to configure it any way you like it and give you a possibility of setting up your own build pipeline. On the other hand, Unity Cloud is only focused around Unity and you can’t add anything to it. Of course you can configure Slack to get notifications from Cloud or use Webhooks that Unity provides, but that’s it. But the advantage is that it is straightforward, easy to configure and use.

Which one should you use? If you need something simple, then go with Unity Cloud Builds. If you need something more advanced, with a lot of configuration options, then go with Jenkins.

4. Store your data in convenient way

Many people put the data into objects on a scene or hardcode it somewhere else. With that approach it’s often hard to find where you have to make a change in order to achieve a desired result later in development…

But we’re here to present you two better ways to store data:

  1. Text Asset, which can be JSON, Excel file or any other text format. The problematic aspect of it is that in such file you can put only text, and you need to have a parser to read this file and get your data.
  2. The other and more convenient way is to create ScriptableObject. You can put there anything you like. Text, numbers, textures, material, models, etc. And most important thing is that you can use it like any other asset in your project and reading data from it is as easy as getting a variable.

Here is an example of ScriptableObject code:

And with that code you can easily create as many WeaponData objects as you want 😉

5. Auto references

Creating UI is not the most pleasant thing to do, mostly because you have many scripts, that need even more references, which you have to assign by hand. Wouldn’t it be great to have all of these references filled all by themselves?

Of course! Here is a sample implementation for that:

Here is class example of use of that implementation:

Here is how it looks in Unity:

These references were added automatically! 😉

Summary

So, here’re 5 tips that hopefully can help you exclude a chore part from the Unity development process and boost your productivity. I’ll be adding more tips like that in the next part, so stay tuned!

You can also subscribe to our newsletter, so you won’t miss our posts in the future!

Dream Big, Start Small

What motivates you to go on with your ideas? Would you like to build a game that will be the next big thing in the industry? Who wouldn’t!

A path to success

People ought not to hear and talk about failures. Instead of it we discuss successful stories about how a small indie developer has made a game that brought him thousands dollars of income per day. Some of these ideas seem to be so simple that you may think to yourself “why I did not come with such an idea?!”. I will tell you why – it’s nearly impossible to be successful at very first attempt, you have to fail first, fail often, fail miserably, fail hard. You will never know how to build a successful product until you learn how to not create one.

Not very heartening vision, isn’t it? At first, I didn’t want to believe it. I had a strong faith in each of my projects even if almost all of them were failed attempts to create something bigger. I’m a very stubborn person, so even after a series of big failures, I kept going. But sometimes I was seriously thinking about giving up. I’d like to give you a piece of advise on how to deal with failures and how to reach out for a success much quicker than I did. I hope that your understanding of what a failure is will change, because believe me – it’s not that bad.

Start small

If you’re playing any game for the first time, you need to learn how to play it. There can be a tutorial, or a set of easily understandable stages where you are learning the mechanics. Then, it’s all about exercising to get through more difficult stages. From time to time, there can be a boss fight and the final boss at the end of the game. Final boss should be something that will test everything you’ve learned while playing the game. Beating him gives a great satisfaction that your hard work finally brought you to that very point.

With some exceptions you wouldn’t go for a final boss fight right after starting to play. You know that you do not have enough experience and you will fail. So why would you then go and try to create an epic game with large world and extraordinary story-telling if you don’t know how to create a simple puzzle game? Maybe because you do not realize that this is your personal final boss.

Think of a gaming industry as your newly bought game. Even if you feel that you know how to play it, assume that you don’t – that’s a safe assumption that can be easily verified in a short period of time. Now start small. Put your plans about big and wonderful games aside. Think of something really small, like Tetris or Breakout. Make a list of ideas and choose one that you believe would need the smallest amount of time to achieve. This is where you want to start!

Don’t get discouraged by that! Small and simple games can be interesting and exciting. Just think of it as of an exercise about creating a good game mechanics out of a simple idea. Great AAA games are filled up with a bunch of smaller game mechanics, even if you might not realize that yet. A game theory may be something that you need.

Don’t worry about the game marketing at the beginning. Even if you create a good game and there will be nobody to play it, make more games. Cross-promote it, talk about your creations on Reddit. If it is good, you will surely get some attention. Besides attention, you will also get some feedback. A word about feedback – wait for opinions to repeat itself. If you will hear several opinions about the same thing, this means that it may be really important thing to take care of. Otherwise, don’t waste your time.

Dream big

When you will decide to start small, there will alwaysbe a dream that will have to wait for its time to come. But how could you know when the time is right? Trust me, you will! Until then, you will get a plenty of experience, you will know your enemy well and most probably – you won’t be alone. You may get to know a bunch of experienced people who saw you going forward step by step and will be willing to help you with your dream.

Do you know somebody that is so full of life that it affects all the people around her or him? Being a positive person significantly changes your surroundings. You will attract people who are thinking similar, change minds of those who are uncertain and scare off toxic people. The same applies to you – if you’re working hard with belief that someday you will fulfill your dream – you will attract people who are similar to you.

Be prepared that your dream may evolve to something else. As you will be discovering the market better and you will understand more and more what makes a game successful, you may alter part of your idea. That’s a good thing, because by doing that you’re increases the chances of your big dream becoming successful.

What if your big dream will fail… again? Until now you surely have learned that a failure is not the end of the road and even a failed project can be continued. Sometimes it just needs a little push to a different direction, a fresh idea or even a restart.

Keep believing in your dreams. Be prepared for a failure and learn why it happened. Make sure to fail a little less with each new project. Repeat the process and one day you will fulfill your dreams. This will be your final boss and the reward for everything you’ve learned on the road so far.

MonoBehavior calls optimization

What if I told you that Unity can be wasting a lot of CPU performance just by calling your MonoBehaviour functions? It doesn’t really matter what your scripts are doing. If you have hundreds or thousands of them, you should be aware that there’s a new field of optimization.

Magic methods

MonoBehaviour functions calls are slow. And I’m talking about functions like Update(), LateUpdate(), OnRender() etc. They are so-called magic methods, and if you’re familiar with object-oriented programming languages, this concept looks like calling a method using reflection mechanism (reflection enables method calls even if you don’t know the interface). Reflection calls are expensive, so Unity does everything that is possible to cache any operations, so the set of CPU instructions needed to call a magic method each frame could be minimal. But it can still be slow, very slow…

Why is it so slow?

I’m not gonna talk about the details (but if you really want to read about the details, look at the end of this article for the links), so just imagine that Unity tries to be as flexible and easy to use as possible. Making something easily costs CPU power because the engine cannot make any assumptions about your game and it needs to do a bunch of checks to call your magic functions on the right objects, in the right order, and to not crash in the meantime.

Can it become faster?

Oh this is my favorite part. Yes! It can! How? You have to take the responsibility of calling Update() function by defining your own function and calling it from a manager. This way, you’re taking responsibility for updating your objects. How much faster it can become? Well, it depends on the platform. Let me use the measurements done by Valentin Simonov on official Unity blog:

Mono with fast but no exception settings.

Here you see that the difference can be worth the time. This is a measurement of calling Update() 10000 times.

Writing a manager

I will present a fairy simple example of a manager called BoxManager that is managing BoxManaged scripts. Manager has two responsibilities:

  1. Keeping the list of managed objects updated
  2. Calling update-like functions on managed objects when manager Update() is called.

The code may look like this:

As you can see, it’s really simple. Before implementing Update() function let’s take a look at BoxManaged.cs.

It registers itself when enabled and de-registers when disabled. Fair enough. ManagedUpdate() function is a function that will replace Update() magic function. Let’s implement BoxManager.Update(), so it will be able to call all BoxManaged.ManagedUpdate() at once.

And that’s it! Really! Now in ManagedUpdate() you can do everything you would normally do in the Update() function.

Please note that I did not use foreach for iterations. Firstly, because it’s generating small amount garbage Unity’s version of Mono. Secondly, because it simply seems to be slower.

Should I care?

It depends on what kind of game are you creating and what is the target platform. Ask yourself a question – do you have many MonoBehaviour objects with Update() calls? It doesn’t necessarily need to be Update(), it can be anything that it is invoked with each frame. Then, if you’re targeting mobiles, it’s definitely worth to try! Targeting standalones? It’s still something you may consider, especially if you’re planing to have huge amount of objects.

Sometimes you may need a manager even if you’re have a relatively small amount of objects. On iOS there was (I don’t know if it has been fixed or not) a problem with OnRender() function. Having it on 30-40 objects could decrease the game’s performance twice! The solution? A manager like the one presented above, but instead of calling Update() it should be calling OnRender() code. Yes, it will work!

Please keep in mind that this is one of many optimization strategies that you can use. Yet this one is quite hidden – unless you know about it, you will have a hard time to find about this one. That’s the reason why this article has been brought to life.

References:

https://blogs.unity3d.com/2015/12/23/1k-update-calls/