Wednesday, November 21, 2018

Unity3D Interview Preparation

Over the past 13 years I’ve seen my fair share of the interview process from both sides of the table. The following tips can be applied for a variety of technologies but are mostly geared towards those interviewing for full time or contract Unity3D developer positions.
The hiring process can usually be broken down into four main hurdles:
  1. Introduction
  2. Quick Assessment
  3. Thorough Assessment
  4. The Offer
Step 1: Introduction
Unity3D jobs are typically for highly desirable positions such as game development or virtual reality. This means that the competition can be fairly intense for a good Unity3D contract or full time position. In order to move forward in the interview process you are going to need to stand out from the masses by using your portfolio, resume, and cover letter. Resumes and cover letters are pretty standard for most industries; there are a plethora of resources online covering them so I’ll hit one point on each and then focus on the Unity3D portfolio.
One item I would make sure you do not overlook on the resume is to ensure it is in a file format every OS can easily view such as PDF. It can be frustrating for an employer to try to open a ‘Pages’ document on their PC only to have it missing fonts and oddly formatted due to file conversions.
One Item I would make sure you do not overlook on the cover letter is to actually write one. I realize it is much easier to just send in a resume but the cover letter is your big chance at selling yourself. You should research the company you are applying for and tailor your letter to their ideals and needs. This is your chance to highlight your past experiences that exemplify the skills they are seeking. If you can not muster up the energy to write a cover letter for a potential job then that job may not be right for you. Ideally, you should feel excited about the job and your excitement should show through in your cover letter.
While the cover letter and resume are important, it is the portfolio that will move you past this step for a Unity3D job. I taught an entire course called ‘Online Portfolio’ as an adjunct lecturer at Butler University. We can’t go over everything here but the key points are to showcase your past work, clearly define your contributions, and ultimately prove you would be an asset to their team. A portfolio can be anything from an interactive website with examples they can download and play to a document with screenshots and brief paragraphs describing a few projects and your contributions. If you do not have any projects to share then it is time to dive into a hackathon or start a hobby project. Additionally, if you have code you are allowed to share I’d also include a link to your github as part of your portfolio.
Step 2: Quick Assessment
If you successfully complete step 1 then you will typically be asked to complete a phone interview or an online test. In both of these cases the company is trying to vet you to make sure you are worth the time and money for a more thorough assessment. This is especially true for out-of-state interviews as an onsite in that case can be costly.
Phone interviews and online tests typically involve technical coding challenges. The best thing you can do is practice. There are sites available for this such as HackerRank that provide coding challenge examples. All of the ones I have tried include a C# option so they can be applicable to Unity3D. Go through as many as you can leading up to the test as you can never over-prepare. Try to cover common data structures, search algorithms, and sorting algorithms, as well as the pros and cons of using each.
Besides general coding you will also want to brush up on your Unity specific topics. Here are some examples of things you should know: Asset Bundles, batching, coroutines, draw calls, scriptable objects, shaders (fragmented versus vertex), culling, debugging, and profiling. Debugging and profiling is my favorite topic to question when I am interviewing a potential hire. I want to make sure you know how to troubleshoot issues. Do you know how to add breakpoints in your IDE? Do you know how to diagnose frames per second spikes? Do you know how to track down a memory leak? If you answered ‘no’ to any of these questions then take some time to research profiling and debugging before your next interview.
Lastly, review some design patterns that are commonly used in Unity3D. ‘Object Pooling’ is a great pattern to reduce instantiation hitches. ‘Chain of Responsibility’ is used in most input systems to prevent multiple colliders from being triggered on the user interaction events. ‘Observer’ is commonly used to listen for events dispatched by low level objects such as an enemy being destroyed. ‘Factory’ is often used in user interfaces to build out common elements like lists for leaderboards and inventory selection screens.
Step 3: Thorough Assessment
If you made it to this point then they are interested and you are most likely one their top few candidates. They will either invite you to an onsite and put you through some white boarding or they will give you a small project to complete over the next couple of days.
If you are given an onsite then you will want to buy the following book and work through examples from each chapter. I did an onsite at Amazon and was amazed that two of the four interview questions were pulled directly from this book: 'Cracking the Interview Code'. You should also be aware that they aren’t just judging your code. They also are judging whether or not you fit the job and the team. I passed the technical portion of an interview at Facebook but then was turned down because they didn’t think I wanted the job. It was true too. I was more interested in another company but I was surprised that I made it obvious to them during my interview. Lesson learned, how you act is just as important as what you say. Make sure you show an interest in the company, its employees, the project, and ask a ton of questions.
If you are given a project then this is your chance to show off. Over the years I have had to remake Asteroids, build a variation of Donkey Kong, create a slot machine, and a trivia quiz. When given a Unity3D project to complete you should first read their requirements very carefully and make sure you hit each bullet point. They will be judging you not only on the final product but also what is under the hood. Break down the challenge into classes and take extra care in how you use inheritance and composition to adhere to S.O.L.I.D. object oriented design principles. One key is to separate data logic from the view by using scriptable objects. Another is to ensure your project and scenes are organized and variable names and methods are named appropriately. As always, comment your code and ensure it is easy to follow.
If you have time at the end then sprinkle on a bit of love into the project. The asteroids challenge I was given was for EA’s Playfish Studio. I decided to make it an underwater asteroid game using their fish logo as the ship. The trivia quiz challenge was given to me around Halloween so I made it themed around classic scary movies and even added a cheap scare at the end using a screaming clown face. These touches go a long way in standing out compared to the other candidates.
Step 4: The Offer
Throughout the entire process you should be making sure the company interviewing you is a good fit for you. The offer is where you really get to turn the tables and have them sell you. For example, they will most likely ask you what you currently make. Try your best to avoid answering that question and instead answer the real question which is how much do they need to offer you in order for you to take the job. This can be a difficult question but you can get a decent idea of how much you are worth by visiting sites such as ‘Glassdoor’ or browsing similar job posts on sites such as ‘Angel’ that include salaries. I tend to have two numbers in mind: my ideal and my bottom floor. Answer their salary question with your ideal and don’t settle for lower than your bottom floor. Sometimes it is good to request a general ballpark earlier in the interview process. After spending a couple days on the Halloween Trivia challenge, I was offered a salary half of what I was making at the time. Had we discussed ballparks earlier on it would have saved me a couple days of work.
Conclusion
Preparation for Unity3D interviews is similar to most technical jobs with the addition of the portfolio as well as brushing up on some key Unity3D concepts. Regardless of whether or not you land the job you want, learn from the experience and take it to your next interview. If you take the attitude of continuously learning, improving, and adding to your portfolio, then you will eventually succeed at landing a Unity3D contract or position.

Friday, May 12, 2017

Keyboard based Debugger for Unity3D Projects

There is nothing complex here but I've found the following code extremely useful to quickly test functionality without having to mock up buttons. All you have to do is add this component to a GameObject then select Keycodes that you would like to pair with functions. You can also flag whether you want this to only occur in the editor or if you want to leave it for live production.

I'd like to get in the habit of posting more code. I tend to avoid it as anything interesting to me is usually overly complex or client specific. That said, if you found this snippet helpful I'd love to hear from you and I'll keep posting bite sized components that I find useful.

Example of the component:


Code:
 public class KeyboardCommandManager : MonoBehaviour
    {
        [System.Serializable]
        public struct KeyAndResponse
        {
            public KeyCode Key;
            public UnityEvent Response;
            public bool EditorOnly;
        }

        public KeyAndResponse[] KeysAndResponses;
        private List<KeyAndResponse> ActiveKeys;

        private void Awake()
        {
            ActiveKeys = new List<KeyAndResponse>();
            if(KeysAndResponses!=null)
            {
                for (int i = 0; i < KeysAndResponses.Length; i++)
                {
                    var keyAndResponse = KeysAndResponses[i];
                    if(!keyAndResponse.EditorOnly || Application.isEditor)
                    {
                        ActiveKeys.Add(keyAndResponse);
                    }
                }
            }
        }
 
        void Update()
        {
            if (Input.anyKeyDown)
            {
                 
                    for (int i = 0; i < ActiveKeys.Count; i++)
                    {
                        var keyAndResponse = ActiveKeys[i];

                        if(Input.GetKeyDown(keyAndResponse.Key))
                            keyAndResponse.Response.Invoke();
                    }
                 
            }
        }
    }

Thursday, May 26, 2016

Sharing code between Unity3D Projects

Here at Taqtile we are working on multiple Hololens projects at once and would like to create a core library for overlapping features such as an adjustable window to place or custom interactibles.

Unity3D does not natively support external folders but I found a few workarounds:

SVN Externals
This stackoverflow answer seems like the best solution but relies on SVN but unfortunately we are using Git.

Git SubTrees or SubModules
A submodule seems to be the closest thing to an SVN External but it is more of a reference to the code path at certain point in time. SubTrees are a complete copy. Neither seem ideal since we'd like to be updating the core library continuously. While you can rig both to commit and update via command prompt, most of our team uses software such as GitHub, Tortoise, and SourceTree and support seems limited or non-existent.

If you happen to have one of these solutions working on Git software with a GUI for non-technical team members I'd love to hear about it in the comments.

SymLink
The solution we landed on was Symbolic Links. A symbolic link is a Windows feature to make a folder that is located in one directory to appear to be located in another. Here is a tutorial on creating Symbolic Links.

But it is as simple as running the command prompt and running the following from a relative address:
mklink /J .\Assets\TaqtileTools ..\TaqtileHoloTools

You can even make a .bat file and commit it to the relative directory so anyone setting up the project for the first time just needs to execute the bat.

Note, given that Hololens is solely a PC environment at the moment we can safely assume the entire team will be running Windows. However, Mac users could create something similar as well.

Friday, May 20, 2016

Hololens - Manipulate Gestures and Resizing Windows

I had a bit of trouble finding documentation for how to make a re-sizable window for Hololens and thus want to document my findings here.  As this is all fairly new please share your findings in the comments.

Here is the goal... in 2D form:

On the device you can click and drag (manipulate) any of the blue cubes to scale the window.  And you can click and drag the center circle to re-position the window in 3D space.

If you have a device you can find an example of this by opening the Photo app and clicking resize in the top right corner.

Prep:
First and foremost make sure you are up-to-date with the latest Unity build which currently is 5.4b16: http://unity3d.com/pages/windows/hololens

Otherwise you may crash while trying to listen to the manipulate gesture.

Gestures:
If you aren't familiar with Gestures you can learn more about them in detail here: https://developer.microsoft.com/en-us/windows/holographic/gestures

Manipulate is going to be our focus since we are going to move/re-size based on the user's hand movements.

Tutorial:
Microsoft's Holograms 211 tutorial will get you most of the way there. Namely the GestureManager code though their example uses both Navigation and Manipulation which adds a bit of complexity as you can't use both at the same time.  Since we only need Manipulate we can nix the Transition code and just add the GesturesSettings.ManipulationTranslate to our recognizer we are using for tap.  I'll share my code below.

Integrating with HoloToolkit:
Microsoft's HoloToolkit code base's GestureManager is different than the one in the tutorial. I decided to try to pick and choose bits from the 211 tutorial and drop it into the Toolkit code but ended up with a half baked solution.  You could manipulate items while gazing at them but as soon as the item lost your gaze the manipulation would stop. The trick is to make sure you Override the focusedObject. Otherwise when the focus object changes the gesture is cancelled.


GestureManager Class:
This class mixes the HoloToolkit code with the Holograms 211 Tutorial and makes adjustments to handle the change in focusedObject.



Handling:
To handle these events you will need to wire something to catch the starts and then update while manipulating.  I have my corner buttons catching the start manipulate calls and then triggering StartScaleManipulation while my center button triggers StartManipulation. Code below:



Custom Hand Manager:
I am not sure if we added the FocusedGameObject or if that was originally in the HoloToolkit and since removed. In either case, this is the HandManager we are using. Feel free to rename to HandsManager or customize how you see fit.



Saturday, July 5, 2014

Two and a Half

I hate to start with a cliche but time flies. Its been two and a half years since I have posted an update!

I'm still going strong at Kihon. We are in beta on our 4th title: Conquest of Champions which is in Early Access on Steam or you can download it from the site on PC/Mac. Eventually we want to get it to tablets and be cross-platform but the current focus is to iterate quickly on the desktop.

In 2013 we launched Dojo Danger.

In 2012 we launched SketchPhrase.

Earlier in 2012 we raised a round with Rick Thompson and made Kihon a legit business... well, I guess it was always legit but raising a round, hiring employees, etc really raises the stakes a bit.

And then of course there was Baby Monkey which I posted about in 2011.

On a technical side I've gone from Flash to Cocos2D to Unity3D.  I personally still have a soft spot for Flash, especially when it comes to tweens and animations.  However, I must admit Unity3D is a pretty powerful engine from a team's perspective.  Cocos2D was OK but I'd recommend skipping over it and just going straight to Unity3D, especially now that they are making an effort to support 2D natively.

I still keep my hands in the code and game production though admittedly is becoming less and less over the years.  I'm probably spending less than half my time coding now while the rest has gone to running the company and everything that entails.

I hope to post a bit more about the business side and the inner workings of Kihon as I originally intended when I was just starting years ago... however, I would be naive to promise such a thing.  Hopefully I will be on here again soon though. Until then!











Sunday, November 20, 2011

Freebie! Baby Monkey weekend Give-away

Kihon is running a special this weekend by offering Baby Monkey (Going Backwards on a Pig) for free.  If you haven't already, now is the time to check it out!

Still hesitant?  Whats wrong with you!  Check out this review, it sums up our new features such as Costumes, Backgrounds, Free Monkey Bucks, etc.  Review.

Friday, November 18, 2011

Speaking Monday at UofA

I'll be at UofA Video Game Developer's Club this coming Monday, Nov. 21st.  It'll be at 5pm in the Gould-Simpson building, room 813.  I believe non-students can attend.  More details can be found on the club's homepage: https://sites.google.com/a/email.arizona.edu/ua-video-game-developers-club/

If you are in town, come check it out.