Working for Unity

It’s now official: Starting from next month, I’ll be working full-time at Unity.

This blog has been mostly about moving slowly toward entrepreneurship and away from the mundane grind. One could argue that this move is a step backwards. I see it more like a step to the side.

My experiences with work has never been very positive. I don’t really fit that nine-to-five mold. Since discovering Unity the tool, the company behind it has made a special impression on me. They seem different. I can’t quite explain how, but it just seems that way. Visiting the Copenhagen offices confirmed this. It wasn’t anything like any of the other companies I worked for.

I did have some doubts: would I be giving up a part of my independency? Maybe. Wouldn’t this impact the development of my own products? Yes. I might even lose some money? Possibly. Then I realized something: I’ve always ended up in the wrong places by trying to rationalize like this. Following your passion means following your gut. My gut was screaming for me to join Unity. So that’s what I did.

What this means for my current products RageSpline and RagePixel?

By agreement with Unity I will keep selling RageSpline, but won’t be actively developing it anymore. I’ll fix bugs, merge outside patches and answer e-mails, but I won’t be adding significant new features myself. Some people might be a little upset about this, but remember that I’ll still be making awesome things for Unity.

With RagePixel it’s a little different. It’s so early in the development cycle and I don’t have the time necessary to push it forward. I wan’t to focus on my work at Unity. This means that I just have to let RagePixel go. I’ll reboot the bot infested forums and try to encourage an open-source community around it, though. I can only hope that others will pick up where I left.

My involvement with the Asset Store Madness sale has to end as well. It’s too weird for a Unity employee to organize this sort of thing. I’m trying to find someone else to take over the website and run the next sale somewhere in the future. If you are one of the top-tier Asset Store developers and would like to pick up the torch, please contact me.

That’s it. I can’t wait to start at Unity. See you at NinjaCamp!

Written by Juha Kiili

April 7th, 2012 at 9:47 am

Posted in Uncategorized

Observations and Extrapolations

I’m not a programming veteran, experienced artist or a game design guru. My game development portfolio is very light and my mileage is low. I think this makes it easier for me to question some of the game development phenomena.

I also like to see myself as a jack of all trades creative guy. I love doing everything on my own. Not trapped in the mindset of a specialized coder, artist or designer, I can see the big picture more clearly. Steve Jobs talked about a special place where art and science meet. Now, I’m not Steve Jobs, but I’d like to think I’m in touch with that place.

For a few years now, I’ve been going through huge amounts of blogs, papers, speeches and ideas on game development. Technical, business, marketing, design, indie, AAA, MMO, social, mobile, freemium… everything. This is what I do when I get excited. Like an information sponge I just absorb everything I can find. In the next few paragraphs I’m going to share some of the things I have observed and also extrapolate a crazy hypothesis.

Before that, from all the stuff I’ve read, I’d like to highlight two of the finest specimens: Daniel Cook (@dantheduck) from Lost Garden and Tadhg Kelly (@tiedtiger) from What Games Are. If you are in the game development business there’s just no excuse for you to not read every word they ever written. Just do it.

2D vs. 3D

In the 80s, when I was first introduced to games, most of them were 2D. It’s natural to become nostalgic about your first youth experiences. Those experiences become the norm which everything else is compared against. I too feel nostalgic about wonderfully large retro pixels and limited palettes. I just keep wondering if they are as awkward for the teenagers today as 70s disco is for me.

During the 90s, when I was a teenager, the game industry made the shift from 2D to 3D. I never really liked the 3D aesthetics but fell deeply in love with the spatial immersion of 3D multiplayer shooters. The fierce competition combined with a deep sense of “being there” hooked like crack. Racing games really benefited from the third dimension, too.

Apart from these two genres, I didn’t really fancy the shift to 3D at all. RTS games felt much tighter in classic isometric 2D, graphics in 3D adventure games were a big joke and I still don’t understand why you’d want to render 2D platformers in 3D. I think the game industry got a bit carried away and tried to make every possible game in three dimensions. Games and 3D became synonyms. Big games also started emulating Hollywood and doing “interactive stories”. I stopped playing games at that time.

Now 2D is back. Stronger than ever. Two of the things that contributed most are the rise of mobile platforms and the rebirth of the classic bedroom coder: the indie developer.

On a mobile platform 3D makes much less sense. That doesn’t seem to prevent people from trying it. I guess they are still in the “games equal 3D” mindset. Maybe there’s pressure to put stuff out as fast as possible. All the pipelines are for 3D so companies brute-force desktop/console games to fit small mobile screens and hope for the best. Most of the big mobile hits are already 2D and I’m going to make a bold and naive prediction that 2D is going to “win” in the future. Tablets are a different story, though.

Indies are the second biggest thing to boost the 2D renaissance. What really makes 2D a tempting choice for indies is the amount of resources needed. Visually competitive 3D takes so much more work that it’s just out of reach. And I’m not talking about engine technology. I’m talking about raw graphic assets. Almost every 3D indie game out there that tries to copy an AAA first person or free camera design never ships and/or looks like shit. Most of the big indie hits are 2D. Even Minecraft and Fez are games that circumvent the pitfalls of the 3D workload by embracing naivistic graphic design.

Specialization

Specialization is a cool thing. Our society relies heavily on it. One guy is planting seeds so we can eat, another is manufacturing clothes so we don’t freeze and a third one is telling jokes so we don’t get depressed. Each can hone their special skills and everyone benefits from this synergy. You can’t really deny its power in our industrialized society.

However, there is a point to be made, that specialization might not be so clear-cut when it comes to highly complex and creative stuff like game development. My point is that in classic industrialized specialization the jobs are much more isolated and predictable. A farmer who produces food for a policeman doesn’t need to understand anything about crime fighting, and the policeman doesn’t need to care about fertilizers either. When it comes down to more creative jobs it gets messier. Code, art and design in game development are highly interconnected and predictability is near zero. No game design doc ever survives the contact with the actual development process.

From where I’m looking at, the game industry still seems highly specialized. When I was still in school a couple of years ago, there was a series of lectures by people from the games industry (mostly big companies). Every single one of them told us we needed to specialize in order to get a job. You need to have one skill and you need to work on that. Period.

Now you think I’m questioning the specialization. That game companies should stop doing it and everything will be better. Not at all. I’m just making a hypothesis that specialization generates certain kinds of games. The kinds that are made by big teams. The kinds that benefit from having familiar mechanics and a huge amount of predictable assets. 3D shooters with Hollywood stories and racing games with photorealistic scenery. Surely you get higher quality graphics when an artist has specialized in modelling AK-47s for the past 15 years. Better quality parts don’t always make a better car, though.

Maybe there exists a whole other space of different kinds of games that can only be created by nonspecialized small teams with digital age Da Vincis. Maybe tight cross-discipline thinking is the area where future game development innovation flourishes. I know I’d much rather try that than be an optimally specialized cog in a well-oiled machine.

Tools

In the past year I’ve created two tools for Unity: RageSpline and RagePixel. They are both manifestations of the above: 2D and nonspecialization. The 2D aspect is quite literal. They are both tools for 2D development. The nonspecialization needs more explaining.

An extreme case of a nonspecialized (or should I say, a generalist) game developer is someone who does everything. He does code, art, design, audio, music and everything in between. I’m this guy. Many of the other indies are too. The mindset is different from the classic specialized developer. Everything is more interconnected. Everything becomes one.

To the generalist things like asset pipelines seem very futile. It’s very frustrating to jump from Unity to Photoshop and back again when iterating. It starts to feel obvious that you’d like to work in a truly pipeline-free environment. In this enviroment you could jump between code, design and art instantly. Specialized software like Photoshop and Blender are for specialized workflows. What the renaissance developer needs is integration.

Both of my tools did the same thing: they integrated art asset creation into the main game development engine (Unity). RageSpline did it for vector graphics and RagePixel for bitmaps. This kind of integration is revealing many new workflows that I couldn’t even predict beforehand. It is something that turned out to be much more powerful than I expected. The stuff currently bouncing in my head for RagePixel is going to be some serious shit.

Written by Juha Kiili

March 17th, 2012 at 12:14 am

Posted in Uncategorized

My Indie Story So Far

It’s kind of personal and I wrote this mainly for myself, but I think there might be lessons for others too.

About a year ago, when my granny passed away, I met a lot of people at the funeral that I haven’t met for a long time. I was sitting in the ceremony and looked around. I saw many faces that “suddenly” seemed so very old. This being the funeral and all, I got a really strong feeling about how short life is. I felt that I’m playing it too safe and being miserable for it. At that very same evening, I asked my mother if she would help me start a company.

I didn’t really have any viable products or ideas. I had one game in the App Store making pennies and I was making another. I figured that the act for doing the paperwork and starting a REAL company would push me forward. I had a full-time dev job which I kept and was really open to my employer about my new endeavors.

I noticed Unity had an Asset Store for selling extensions and assets. I realized I had developed this spline editor for my new game that I could sell. Why not just put it out there for $50 and my company gets it’s first real product. It sold 60 units in first five days. I couldn’t breathe. It was a bit too awesome.

Soon I got very upset going to my 9-5 job and my morale went down. I couldn’t get anything done and work just piled up. My product kept selling well and I was very close to rage quitting and going for the “indie dream” out of frustration. Although it should have been happy times, I was actually miserable. I couldn’t sleep. I already had an e-mail for resignation written, but something kept me from sending it.

Finally I just went to my boss and confessed that my mind is on my own projects and I can’t really focus and feel very stressed. I said that maybe if I worked part-time (50%) for half the salary. My boss wasn’t too excited, but I think he saw that if he wouldn’t agree, I would just brainfart. I worked half-time for couple of months and got some time to relax. My mood got much better. My boss asked if I could work more and first I didn’t go for it. He kept asking every week and finally I caved in. Luckily I was sane enough to ask for a raise and got it. Now I’m working about 70% and almost making the same money I was making full-time in the same job earlier.

My first product (RageSpline) has now sold almost 600 units and grossed $36k. Unity takes it’s 30% cut so I netted about $25k in 8 months. I’ve kept improving the product every month and I’m also going to release another shortly (RagePixel). I think I could live with this income if I quit my job and obviously would have more time to make additional high-risk products like games, but I feel it’s not the right thing to do right now. Many people would make the jump, but I have gut feeling against it.

I’m now in a very good position mentally and financially. Everything I make from my company is basically extra and I’m saving it for later. I might go full-time indie someday, but currently I don’t feel the urge anymore. My dayjob is sometimes still boring compared to my own projects, but I don’t feel that bad going there anymore. I’m slightly busy and don’t always have the energy to do stuff outside my work, but I feel like I’m in a more balanced situation. The future seems very bright and I feel like anything is possible now. I just don’t feel like rushing it anymore.

Written by Juha Kiili

January 19th, 2012 at 8:54 am

Posted in Uncategorized

Blunk & RagePixel

Here is a link to the game: Blunk

My last post was many sunsets ago, but such is life.

On Christmas, I had one week off from work, and noticed the Unity 3.5 and their Flash contest. First I thought that I don’t want to “waste” my Christmas for coding, but soon came to my senses. I think sitting in front of a computer screen is a proper, noble and legal way to spend the holidays. My Mrs. didn’t agree, though.

I saw a triple opportunity in the contest:

  • Get to the top10 and win something
  • Take the new RagePixel toolset through it’s first real project
  • Free pre-launch visibility for the product

My biggest risks were:

  • RagePixel is still too rough for production use
  • Top10 is crowded by quality pre-made games by massive teams
  • My wife is killing me for ruining the Christmas

Now that the game is done, I couldn’t be happier. RagePixel, despite it’s rough edges, delivered way better than I expected:

  • Making assets was fun and fast. Finished 5 days early!
  • I have a realistic shot into the top10
  • She lets me live. For now.

Written by Juha Kiili

January 6th, 2012 at 9:16 am

Posted in Uncategorized

Unity Editor Scripting: Mesh Leakage

I haven’t been very active with my blog, but for once I made a discovery that might be worth sharing. Finally a proper tech post! Hooray!

If you ever got sucked in to the wonderful world of Unity editor scripting and tried to generate meshes outside the run-time mode, you might stumbled across this warning message in the console:

As a matter of fact, I think most of my customers – who bought the 2D vector graphics extension RageSpline – have had to live with this warning for a while now.

It is not a showstopper, though. Every time you save your scene, Unity checks if there are meshes that don’t belong to any gameobjects and gets rid of them. You get a warning and thats it. Life goes on.

BUT IT’S ANNOYING! And looks unprofessional. It’s like my Mrs. after I’ve done the vacuuming: She digs up a tiny piece of dirt somewhere and the nagging starts. Every fraggin’ time. I hate that. It ruins the best part of vacuuming, which is the ending part.

The reason for mesh leaking lies within the sharedMesh property. Every GameObject that has MeshFilter-component, has a sharedMesh property with it. Like the name implies, this is a mesh that is shared. But shared with who or what? Well, it’s shared with other GameObjects. And to be technically accurate: with other MeshFilter components.

When the user decides to make duplicate of an existing GameObject, what happens to the sharedMesh is the root of the problem. The sharedMesh property is automatically set to refer to the same mesh that the originating GameObject has. Now the old existing GameObject and the newly created duplicate both refer to the same mesh. While this is a proper behavior for most of the use-cases, it’s not for mine. I wan’t every mesh to be individual and not shared. Or maybe I want some of them shared, but not automatically.

But can’t I just grab the duplication event and handle this? Well, no. Unity doesn’t provide me an access to such an event. Or at least that is my conclusion after doing some extensive googling. Only place where this situation can be handled is in the Awake()-method. Awake() is a method that gets called every time the GameObject is generated. Whether it’s when you load the scene, instance an prefab or press play on you editor, Awake() gets called. Right now we are only interested when this happens in the edit-mode.

So the Awake() is called and Houston we have that problem. You know the problem I talked about: The vacuum cleaner and the nagging, and the… Oh wait… Back to the subject. We now know that the sharedMesh that we have on this GameObject might be referenced by some other GameObject too. Not always the case. Awake() might called for the scene load or dropping our script to empty GameObject. But it’s possible, that somewhere out there lies a GameObject, that is sharing my beatiful mesh with me. My precious.

To handle this perfectly, we need to stop guessing and find out for sure. The only way to know is to iterate through every other GameObject of this type and compare my sharedMesh with it. If a match is found, we generate a new Mesh instance for this. If not, we do absolutely nothing.

In the Awake():
1. Check that you are not in the run-time mode
2. Iterate through every GameObject of this type, expect myself
3. Check if there are any sharedMesh equals to my sharedMesh
4. If yes, generate a new sharedMesh instance via meshFilter.mesh = new Mesh()
5. If not, do nothing
6. Profit

Here is a crude example of how your Awake() might look. I’m also generating MeshFilter and MeshRenderer if they are missing.

    void Awake() {

        if (!Application.isPlaying)
        {
            MeshFilter meshFilter = null;
            MeshRenderer meshRenderer = null;
            
            meshRenderer = gameObject.GetComponent("MeshRenderer") as MeshRenderer;
            if (meshRenderer == null)
            {
                meshRenderer = gameObject.AddComponent("MeshRenderer") as MeshRenderer;
            }

            meshFilter = gameObject.GetComponent("MeshFilter") as MeshFilter;
            if (meshFilter == null)
            {
                meshFilter = gameObject.AddComponent("MeshFilter") as MeshFilter;
            }

            
            if (meshFilter.sharedMesh != null)
            {
                MyPreciousObject[] objects = GameObject.FindObjectsOfType(typeof(MyPreciousObject)) as MyPreciousObject[];

                foreach (MyPreciousObject myPrecious in objects)
                {
                    MeshFilter otherMeshFilter = myPrecious.GetComponent(typeof(MeshFilter)) as MeshFilter;
                    if (otherMeshFilter != null)
                    {
                        if (otherMeshFilter.sharedMesh == meshFilter.sharedMesh && otherMeshFilter != meshFilter)
                        {
                            meshFilter.mesh = new Mesh();
                        }
                    }
                }
            }
            
            if (meshFilter.sharedMesh == null)
            {
                meshFilter.sharedMesh = new Mesh();
            }
            
        }
    }

I hope this really works, because I haven’t given it real-life testing yet, but it seems promising. If you know something about this matter that I’m missing, shoot me with an e-mail to juha [at] juhakiili.com

Cheers!

Written by Juha Kiili

September 30th, 2011 at 12:01 pm

Posted in Uncategorized

Ragespline.com and v1.1 launched

Just a short post to announce the launch of ragespline.com. The site will have written documentation, video tutorials and hopefully many featured RageSpline games.

I also finally released v1.1 update of the RageSpline in the Asset Store, after two months of hard work. Go get yours now!

Written by Juha Kiili

July 2nd, 2011 at 10:09 am

Posted in Uncategorized

My first two months in the Asset Store

This is a follow-up post to my earlier post: My first five days in the Asset Store.

For those who are not familiar with the story of RageSpline: it is an extension to Unity which allows you to create 2D vector graphics inside the editor. You can get a feel of the tool from this video.

Originally, I was going to post a follow-up after the first month, but I was so busy coding the v1.1 update, giving support on the forums and replying e-mails, that I just let that one month anniversary pass by. Well, I’m still busy and v1.1 still isn’t out, but I’m going to post this anyway. That’s the irony of indie blogging: when cool stuff starts to happen you are too busy to actually write about it.

When I released RageSpline v1.0 in the Unity Asset Store I was still in more or less considering it as an experiment. Just ship a product and see what happens. Now that I have seen the light, I have taken a different approach. I’m trying to build a product that would hopefully brings me income for long haul and grows to be a sustainable business. In the wake of this new professionalism, I have now invested some of the income to hire outside help.

Juho Lehtinen, a Web Developer from Lehtumedia, is helping me launch an official website at ragespline.com. The website will provide much awaited documentation, scripts and tutorials. I would also love to feature cool looking RageSpline powered games. Wink wink ;) .

Arash John Sammander, Designer and Artist from TAIK, is shooting tutorial videos on how to efficiently use the RageSpline. These will be eventually released at the website too and complement the written documentation nicely.

Breno Azevedo, Game Designer and Technical CG Artist from Fluidplay Studios, is creating an extension for RageSpline called RageTools. It will provide SVG import and animation support plus much more. This project is not funded by me and will be a separate product in the Asset Store once it is released. I’m of course supporting this as much as I can.

I myself have been working my ass off with the upcoming v1.1 update, which has a lot of code rewritten from scratch. I’ve recreated most of the user interface too, and it is now much less crowded despite the vast amount of new features. The update is now in beta stage and I’m optimistic that we will see the actual release in Asset Store very soon. I’m still holding on to my decision of not publishing any set release dates, though.

As always, I saved the best punchline last: the sales figures.

My first two months in the Asset Store generated over $11000 sales. Unity Asset Store taking their 30% cut leaves me with approximately $8000. Not bad, not bad at all.

Written by Juha Kiili

June 23rd, 2011 at 2:52 pm

Posted in Uncategorized

Tagged with , , ,

My first five days in the Asset Store

Whenever someone in the game developer community even so much as hints about actual sales numbers, it gets a lot of readers. It also seems that there is a huge bias for reporting success vs. reporting failure in the Blogosphere. I’m no exception to the rule. This is a Bragposttm. No doubt.

Five days ago, I got a mail from Caitlyn from the Unity Asset Store Team: “Your product RageSpline has passed the review and is available at the store.” I smiled and nodded in approval. I quickly opened the actual Asset Store and BOOM. There I was, already showcased on the big banner space. I smiled so hard that I bit my own tongue. Fast forward five days. I’ve been smiling so hard recently that I’m considering plastic surgery to get my normal expression back. Luxury problems I guess.

The story of RageSpline started a few weeks ago. My current game project – RageCube – was looking like the screenshot on the left. I wanted it to be more like the picture on the right. Most of all: I wanted roundness. Unity’s own primitives are quite, uh, primitive. I hate to use 3D modeling software for 2D purposes. That is like shooting a fly with 10-feet cannon. “All I need is a couple of splines”, I thought.

Luckily, I wasn’t totally green on the subject. Couple of years ago, during my school project – Quickrally – I used splines to generate 3D racetracks. However, my mileage with Unity’s Custom Editor scripting was near zero. I was a bit afraid. This side of Unity seemed more of a black box. Oh boy was I wrong. The very reason that RageSpline exists today is the total awesomeness of Unity Editor scripting. I could write a book of love poems dedicated to it. I was finally brave enough to admit it: I was a Unity fanboi.

At this point, I didn’t really see the potential of the tool for others. I thought it was ok, but “not of use to others”. I’m not a very bright person when it comes to judging my own products. I often refer to myself as a natural born pessimist. Just read the very first post in this blog and you know what I mean.

One day I had an idea: since level creation was so fast with this new tool, it would be kind a cool to make a time-lapse video (above), where I build a single level for the game. At the end of the video, I would then introduce a link to the actual playable level. I made the video and it got some attention. People were saying stuff like “wow, great tools, did you make them yourself?“. Now I still couldn’t muster enough brainpower to realize that maybe I should actually sell them. Like I mentioned, I’m dumb like that.

Finally some people sent me e-mails and messages that said: “when are you going to release your tools in the Asset Store?“. At this point, I was like Homer Simpson with his thought bubble: “Asset Store.. ASSET STORE!!.. SHUT UP YOU STUPID MONKEY!”. After a week of hard polishing on my Easter holiday, I submitted the whole shebang.

And this is how the situation is right now. I generated sales of $3000 in five days. IN FIVE DAYS. What the hell? Of course Unity Asset Store takes its 30% cut, so I’m left with $2100, but that’s still mind-blowingly hilarious. I honestly thought that I would sell 10 copies max. I’m dumb like that.

Written by Juha Kiili

April 28th, 2011 at 10:41 pm

Posted in Uncategorized

Tagged with , , ,

RageSpline is now LIVE!


I just realized that RageSpline got an approval from the Unity Asset Store Team and it’s now LIVE! It costs 50$/38€ and it’s worth every buck for any Unity 2D game developer out there!

As far as I can tell, it’s also officially featured by them in the front page, so seems like everything went better than expected. This is also my first real product as a company, since my first game Memodies, was released as an individual.

If you don’t have a slightest idea what the h*ll I’m talking about, check out my previous blog post here

If you came here to find support for the product, please visit the official thread or send me a private message at the forums. My nickname is “keely”.

Written by Juha Kiili

April 23rd, 2011 at 6:43 pm

Posted in Uncategorized

RageSpline

It’s all Rage this and Rage that.

I’m nearing the release of my tool called RageSpline in the Unity Asset Store. For those not familiar with the Unity or the Asset Store, this means that I’m making a game development plug-in available for purchase. My plug-in (or asset as they say in the Unity community) is called RageSpline and it’s main purpose is to enable game developers to create smooth bézier shapes for their 2D games. In layman terms, this means that you can produce and iterate those popular cartoon-styled graphics (think Angry Birds) very very fast and draw them straight into your level. Very cool indeed!

I decided, that I need to have a small example game bundled with the RageSpline plug-in. 24h later I had made my game: RageCar. The speed of the development process is truly a testament to my new tool.

Written by Juha Kiili

April 19th, 2011 at 4:24 pm

Posted in Uncategorized