Archive for month: September, 2013

Find Your Next Unity3D Job

Category: Industry News, RMC News     |     Tags: C#, Games, Mobile, Unity3D

Finding Your Next Job

As game developers we have complete freedom to choose the tools and teams with which we work. Unity is of course a fantastic tool-set for game development and the industry is hungry for talent.

In fall 2013, I transitioned from consultant to full-time employee again to meet evolving career goals. At that time, I researched hundreds of full-time and freelance job postings for Unity game developers. To more deeply understand what are the most popular requirements for prospective employees, I’ve put together information on where to look for your next job, and what employees value in prospective employees. Take a look!

Where to look

Employers looking for Unity3D Developer talent post job listings on a variety of locations. Unity-related job listing sources;

Unity Job Position Titles There is quiet a variety of job titles which focus on Unity-focused game skills. Often the job list title does not include ‘Unity’ in the title, and you may get more results by omitting ‘Game’. However to focus the search results I include this list;

  • Unity (Game) Developer
  • Unity3D (Game) Developer
  • Unity (Game) Engineer
  • Unity3D (Game) Engineer

What Employers Want

Amount of Experience

Prospective employers like to see you have a few ‘shipped’ (launched) games in your portfolio.

  • 3-5 years for senior positions (0-2 for Junior)
  • 2-3 shipped game titles for senior positions (0-1 for Junior)

IMHO, this requirement is an vague predictor of value. Just like ‘years’ of experience. I have hired dozens of employees as well as subcontractors, and for me it is a far more effective indicator of future efficacy to discuss with the candidate his specific experience with ONLY the areas of the Software Development Life-Cycle (SDLC) which are germane to the role. This list includes; project planning, systems analysis, systems design, implementation (i.e. coding), integration and testing, installation/deployment, and maintenance.

Requirements For Senior Positions

The skills, responsibilities, and requirements of a position obviously depend on the company who lists the position, but here are some of the most common items. I’ve divided the skills among basic ‘employee‘ skills, positions with some manager responsibilities, and then between various programming disciplines. Each discipline is pretty separate — for example a job positions may require ‘game’ skills but not any ‘multi-player’ experience. All of these items are taken directly from real-world Unity-related job posts I have found. I included a short explanation for each item too.

Employee

  • Self-motivated: This is probably the #1 thing I see. Companies are trying more and more to be ‘flat-hierarchies’ where both power and responsibility are spread more evenly across all staff. You may see the management approach as ‘Kanban’, ‘Agile’, ‘team-based’, ‘cell-based’, ‘a studio of studios’ or something similar. Flat encourages each team-member to feel more ‘close’ to the project and ostensibly contribute more. I think it is a great philosophy. In my experience the ‘flatness’ is more ‘talk than walk’ — but that is ok. To fit in – be proactive, transparent, and communicative. If you ask AND answer your own questions, manage your own tasks, and speak before spoken-to about the challenges you are facing, you are on the right path.
  • Passionate: This is probably the #2 thing I see. I consider passion one of the most powerful things in life. Intrinsic appreciation brings intrinsic motivation. However, it is unfortunately rare that a company really cultivates passion in those who they don’t think have it.
  • Team-player: I feel item is most important for two reasons. One programming is a very personal, cerebral process. It is akin to putting ones thoughts into code. The same left-brained personality that is drawn to programming is NOT drawn to interpersonal communication and the vast challenges that exist there. Communication and empathy favor the right-brained. As the internet success bubble was building 10+ years ago, it was feasible to market your experience as a ‘rock-star’ programmer. This is someone who can come in and kick ass (as an individual). Rockstars contribute well to a management-less regime, and there were plenty of those. However, the HR & PM atmosphere has matured and we already see a more team-based approach. So because team-work is rare among programmers its important. Secondly, I am a strong believe that (especially in flatter hierarchies) we are all managers — meaning as super employees we all exist to leverage the skills of those around us in addition to our own direct contribution. As teams adopt more flexible, iterative development (see ‘Agile’) each team member is more of a thought-leader than just a ‘doer’. I feel strongly that it is the collaboration between those who are genuinely interested in excelling at collaborating which creates the virtuous cycle that turns good game projects into truly great ones. Can you amplify the effectiveness of your coworkers?
  • Excellent written, verbal communication: For the reasons just stated, programmers are not always good communicators. Besides the interview process (which is a historically horrible predictor of job performance), how can prospective employers evaluate the communication skills of an employee? That is indeed a challenge — and a great subject perhaps for another article. As a worker, it is recommended to educate yourself on communication as much as you do on technical skills. This requires an honest look inside at gaps in interpersonal skills. We all have them. At larger companies the HR department may have free resources on this; books, workshops, lectures. Your communication (emails and public speaking at meetings) should be honest, compassionate, and concise. At smaller companies it takes discipline and a champion – like yourself – to make the time for growth in communication skills.
  • Interested & capable to learn quickly: For any type of employee in any field, self-education is and will be increasingly valuable.  However, in technology this is paramount — especially as languages, platforms, devices, and consumer expectation are growing so rapidly.
  • Ability to work under high pressure deadlines: This is very common. Also is ‘we have a start-up like atmosphere’. I would call this ’emergency preparedness’ as emotional IQ skills. I think indeed that it is important. However it is trite (meaning-less from overuse) and it shouts ‘our management is disorganized’. Applying for a position listing this, it is recommended that you ask thoroughly about the expectation on utilization (expected hours per week) and access (emergency ‘work’-calls on nights and weekends) of employees.
  • Agile/Scrum project management experience: Instead of traditionally documenting 100% of a project and calendar upfront, teams are embracing a more realistic, ‘wait and see’ and ‘just-in-time’ organic process. Agile is not a match for all employees, and is certainly not a match for all (most) companies either. In the 7-8 years since this buzz-word as been mentioned to me in consulting projects, I have not met one team that FULLY embraces Agile.

I have found that my self-motivation and desire to learn voraciously to be some of my strongest attributes. I have found getting ‘out of my own head’ and bringing truer empathy to workplace dynamics to be an ongoing challenge. I have worked hard to add team-work and communication to my repertoire through intensive study and driving my experiences toward growth. At one large employer I was lucky enough to sponsor a 12-month team building program for me and my staff of 12 programmers. Not everyone loved it. It is hard to do ‘extra’ things at work when deadlines loom. However respecting the soft-skills (everything that is not technical) will come with the employee’s maturity.  

There is a very real chasm between programmers and designers. There is a chasm too between goals of making the game ‘fun’ and making the game ‘profitable’ (e.g. monetization and monetization metagames). Any employee who can bring efficiency and maintain morale between these groups will shine to upper-management. I’m very lucky to have a University art degree which gives me compassion for the challenges of artists working within increasingly technical workflows. On the fun-vs-profit I have learned hard lessons to defer-to and support whatever is the mission statement of the team/company. While I choose to be a programmer, my background brings a little more peace to my teams, I think.

Manager

Management responsibilities vary greatly between personnel management or project management. The trend of ‘flat hierarchy’ organization we see today often spreads these responsibilities to ‘normal’ staff and gets rid of dedicated management. So the normal staff (i.e. artist or programmer) who is ALSO handling management duties. While employees may embrace the theoretical meritocracy (anyone can be a leader), the loss overall from lack of academic management understanding (ostensibly lost because dedicated manager roles are lost) should not be underestimated. Also solitary team members, talented but socially awkward may not be compatible with such teams. Another potential loss. Position listings which require leadership of people or projects may include the following;

  • Conflict resolution: Foster a spirit of teamwork and unity among department members that allows for disagreement over ideas.
  • Plan Staffing Levels: Assess man-power vs work-load, assist HR in recruiting, interviewing, hiring.
  • Effective performance evaluation: Provide feedback through employee recognition, rewards, and disciplinary action.
  • Experience mentoring/coaching: A good manager leads, a great manager creates leaders.  Recognizing and allowing subordinates to flourish is critical. Guiding and cultivating requires maturing and generosity. This leader may champion other employees’ causes to upper management and HR too.
  • PM Software Expertise: Knowing the most common 20% of functionality in any one PM software (e.g. BaseCamp, Unfuddle, MS Project) is sufficient. However, I’ve seen managers that are so familiar with PM they can offer flexible per-team and per-project changes to the workflow. One size does not fit all in PM.
  • Agile/Scrum: Increasingly common. See ‘Agile’ above.

Programming – General

  • Write clean, documented code and also Employ object-oriented programming (OOP):  These are both legitimately vital and top the list of the most commonly required skills. If you are a best practice champion ( I absolutely am, but often waiver to the (lack of) seriousness of my clients), investigate your prospective employers techniques to establish (coding standards bible) and police (mandatory code reviews) such clean code. If the team does not make time for best practices, and most (especially in ad-agency based work) do not, then such practices will not be done.
  • Programming Language: The majority emphasize C#, some mention C# & JavaScript*. I have not seen any that mention Unity’s only other coding language — Boo. While rare, it is worth mentioning that positions specifically related to rendering disciplines may also ask for experience with Unity’s ShaderLab language. ShaderLab’s style it similar to CgFX and Direct3D Effects (.FX) languages and it is used to describes everything needed to display a Material.
  • Use version-control (GIT/SVN): Any mid-sized or larger team is using version control. I must assume. Smaller companies may not have the technical know-how to require it of you. In all cases use it! In my experience there are 3 levels of version-control experience; 1) you can update/commit fine but must call over a coworker for assistance on code-conflicts or other tasks, 2) You can handle all of that and you can ALWAYS fix your own mistakes, 3) You are the person who sets up build automation and answers other peoples git problems. Admittedly I my level is somewhere between #1 and #2. GIT is awesome, and scary.
  • Experience in AS3/Flash: This is VERY common in the listings and I believe this is for 3 primary reasons. First, the Flash has a very strong history in the casual game market starting around year 2000/2001. Second, the skills of a Flash game developer are directly relevant to a Unity game developer position. Lastly, due to strategic changes by Adobe, and the community’s reaction, many Flash game developers are looking for non-Flash jobs. Employers are smart to tap into the Flash game developer market. The ‘death’ of Flash was/is/and-will-be strongly exaggerated. As of 2014, really talented Flash developers still have their pick of top jobs in casual game development — including to a lesser degree in cross-platform mobile.
  • Experience in iOS/Android SDK: Unity teams deploying to these devices may need your native coding skills to create plugins for C# to speak directly to ‘hidden’ features in the device. Also, it is correctly assumed that if you know these platforms, you have experience creating for mobile (and handling some of the related challenges below).
  • Use test-driven development (TDD) practices:  While this one listed, I’m curious if the job really requires it and doubtful the team leaves time for it. Test-driven development is a strategy of creating unit tests ‘as you go’ for your work, rather than later or never. It is proven to yield less breakable, less bug-prone code, but it is FAR less practiced than listed. Kudos to prospective employers who dreaming big and list this in the job post, but it is trite. The best code I have written (with respect to stability) has been on TDD teams, however some of the most frustrating projects have been where such best practices are required but not allocated for (expertise, time, workflow, accountability).

*JavaScript and UnityScript are synonymous here

Programming – Game

  • Passion for games: EVERYONE lists this. Trite. Obviously important.
  • Mobile: Handle device-specific features (accelerometer, camera, etc…), mobile api’s (Ad integration, in-app purchases, etc…), and mobile development workflow (app-store submission, etc…)
  • Cross-platform: Handle multiple screen resolutions and cross-platform workflow
  • 3D: Knowledge of 3D-specific math (Vector, matrices, etc…) provides value to working on core game mechanics and camera (following, avoiding, line-of-sight) systems.
  • AI: Chain of command algorithms to patrol, seek, attack, the player, etc…
  • Rendering: Experience creating shaders allows you to shape the way the game is rendered, creating unique looks like we see in Limbo and Geometry Wars.
  • GUI: Handling input and layout of buttons, text, and overlays. On your team, this worker may be the artist with the most programming skills or the programmer with the most art skills.
  • Prototype creation: Some developers like working with established, proven API’s and common mechanics. Those who demonstrate incredible creativity and communication and also favor more experimentation, hacking, and are at-home with loose requirements/documentation can excel at the earliest stages of pro-typing new game and app concepts.

Programming – Cross-device

  • Mobile: Working on mobile presents many, many challenges. Small screen-size, multiple-screensize, touch input, device-specific features, and more…
  • Ability to optimize: While always important in software, and increasingly important for games, optimization is of paramount importance on the resource-starved mobile devices. Knowledge in optimizing rendering for fast and stable frame rate as well as optimizing for low file-size and low ram-consumption are most commonly requested.
  • Multi-screen: The business requirement to launch on computer, phone, and tablet requires games to be flexible and (asset) workflows to be well-organized. While primarily important to UX and UI experts on your team, these concerns will touch your life too.
  • Multi-platform: With middle-ware tools like Unity, game developers are both blessed and cursed by the write-once-deploy-everywhere paradigm.  Your game projects can do more for more potential game players, but this often requires (figuratively) forking your code to handle the various deployment paths. Team leaders with good solution/design patterns should set the tone, but each developer must be cognizant of the readability and flexibility of her code.

Programming – Tools / Systems

The workflow of every game project includes making some tools to assist the development process. Unity’s incredible editor scripting together with the Asset Store marketplace, make tool-development skills even more relevant and marketable. While on small teams these responsibilities may not be expansive, larger teams often dedicate one or more developers exclusively to the creation of tools.

  • Tool/API design for coworkers: Very very different than traditional end-user-focused development, designing and developing systems with your fellow coworkers in mind has its own batch of challenges. Analyzing upfront what the needs of your team will be requires both experience and technical know-how as well as excellent leadership and communication skills to discuss needs with your team. Unity is so very friendly at tool-creation even one-man-teams need tools. When your team size is 5 to 8 (very common today), a proactive developer can save precious resources with intelligent work-flows and tools. A few examples include level-editors for in-IDE level generation and well-designed API’s to send high-scores from the game to your companies back-end systems.
  • Extend Unity: Knowing the UnityEngine and UnityEditor API’s related to creating custom inspectors, custom windows, gizmos — all greatly expanding what you and your team can do with the Unity IDE is of critical importance. This is the ‘how’ which correlates to the last bullet item.
  • Knowledge of CMS: Your Tool/API may very well speak to a back-end for level-data, user-data, or more info. Knowing how to use a Content Management System (CMS) is a no-brainer requirement, but mastery on CREATING them and setting up easy to use workflows for technical and non-technical team members is really valuable.
  • Knowledge of back-end/database: You may need to program server code or collaborate with those who do. Knowledge with common languages (PHP, .NET, etc…) and tasks (database setup) are important.

Programming – Multi-player

  • 3rd Party Multi-player API Experience: Knowing the Xbox Live, PSN, Steamworks…
  • Good knowledge: of contemporary competitive and cooperative multi-player gaming paradigms
  • Latency/Lag-Hacking: Handling client-prediction algorithms to minimize loss of perceived world-sync for end users.

Programming – Unity Specific Stuff

In addition to the requirement of ‘must know ‘UnityEngine API’ we also see…

  • Must have Unity-Pro License: This requirement is listed in freelance jobs (I have no problem with that) and also (surprisingly) in full-time jobs. It reeks of an employer that does not provide you your computer workstation and the software on it — which is a very real red flag. In a way this is a indirect requirement that you are familiar with the few (honestly) critical pro-only features, but I find it to be a sloppy investigation.
  • Knowledge of Packages: The most common 3rd party libraries I see mentioned are NGUI (easily the most common), 2DToolkit, and surprisingly Playmaker. I think PlayMaker is great and has uses on nontechnical and expertly technical teams, but I’m very surprised its greatness has bubbled up already to job listings.

Unity3D Dev Diary: uEventDispatcher

Category: RMC News     |     Tags: Debugging, DevDiary, Testing, Unity3D

About RMC & Unity3D

Rivello Multimedia Consulting (RMC) provides consulting services for applications and games. RMC specializes in Unity3D development (see our work here). Please contact us today with any questions, comments, and project quotes.

uEventDispatcher

Problem

Unity3D is a great gaming IDE and runtime. Like any tool I use regularly, I have many constructive criticisms as well. For example, there is no adequate one-to-many messaging system. The UnityEngine includes BroadcastMessage & SendMessage but it is not adequate and has many public, deserved criticisms.

Solution

Streamline messaging between classes using uEventDispatcher.

Benefits include;

  1. Easily add/remove and dispatch custom communication
  2. Strongly-typed data payload
  3. Compiler properly warns you about major misuse cases (mistyping, etc…)
  4. Works within any class type and requires no special ‘Interface’ or ‘Inheritance’
  5. Does not rely on reflection (slow performance) like BroadcastMessage/SendMessage

Usage

Here is an example that shows the COMPLETE API of uEventDispatcher.

[code]

//————————————–
// Imports
//————————————–
using UnityEngine;
using System.Collections;
using com.rmc.events;

//————————————–
// Class
//————————————–
public class TestEventDispatcher : MonoBehaviour
{

//————————————–
// Properties
//————————————–
// PRIVATE
private EventDispatcher eventDispatcher;

//————————————–
// Methods
//————————————–

// PUBLIC
/// <summary>
/// Start this instance.
/// </summary>
void Start ()
{

//CREATE
eventDispatcher = new EventDispatcher (this);

//ADD 0, 1, 2, OR MORE LISTENERS…
eventDispatcher.addEventListener (TestEvent.TEST_EVENT_NAME, _onCustomEvent1); //default is EventDispatcherAddMode.DEFAULT
eventDispatcher.addEventListener (TestEvent.TEST_EVENT_NAME, _onCustomEvent2, EventDispatcherAddMode.SINGLE_SHOT);

//TEST REMOVE
//eventDispatcher.removeAllEventListeners();
//eventDispatcher.removeEventListener (TestEvent.TEST_EVENT_NAME, _onCustomEvent1);

//TEST HAS
//Debug.Log (" hasEventListener(): " + eventDispatcher.hasEventListener (TestEvent.TEST_EVENT_NAME, _onCustomEvent1));

//TEST EVENT SETUP FROM 3 DIFFERENT SCOPES
eventDispatcher.dispatchEvent (new TestEvent (TestEvent.TEST_EVENT_NAME));

}

//————————————–
// Events
//————————————–
public void _onCustomEvent1 (IEvent iEvent)
{
Debug.Log (" 1. _onCustomEvent1(): " + iEvent);
}

public void _onCustomEvent2 (IEvent iEvent)
{
Debug.Log (" 2. _onCustomEvent2(): " + iEvent);
}

}

[/code]

Status

The project is now complete and live on the AssetStore. It is free. Check it out today!

Unity3D & C# Design Patterns

Category: Quick Tips     |     Tags: C#, Design Patterns, Games, Mobile, Unity3D

As always, RivelloMultimediaConsulting.com/unity/ will be the central location for deep articles and tutorials, Facebook.com/RivelloMultimediaConsulting (like us!) will engage the growing RMC+Unity community, and for the latest opinions and cool links follow me at Twitter.com/srivello.

Design Patterns Defined

As BlackWasp explains, Design patterns provide solutions to common software design problems. In the case of object-oriented programming, design patterns are generally aimed at solving the problems of object generation and interaction, rather than the larger scale problems of overall software architecture. They give generalised solutions in the form of templates that may be applied to real-world problems. Design patterns are a powerful tool for software developers. However, they should not be seen as prescriptive specifications for software. It is more important to understand the concepts that design patterns describe, rather than memorizing their exact classes, methods and properties. It is also important to apply patterns appropriately. Using the incorrect pattern for a situation or applying a design pattern to a trivial solution can over-complicate your code and lead to maintainability issues. A group of developers, the Gang of Four, publicized these 23 design patterns.

Creational Patterns
1. Abstract Factory Creates an instance of several families of classes
2. Builder Separates object construction from its representation
3. Factory Method Creates an instance of several derived classes
4. Prototype A fully initialized instance to be copied or cloned
5. Singleton A class of which only a single instance can exist
Structural Patterns
6. Adapter Match interfaces of different classes
7. Bridge Separates an object’s interface from its implementation
8. Composite A tree structure of simple and composite objects
9 .Decorator Add responsibilities to objects dynamically
10. Facade A single class that represents an entire subsystem
11. Flyweight A fine-grained instance used for efficient sharing
12. Proxy An object representing another object
Behavioral Patterns
13. Chain of Resp. A way of passing a request between a chain of objects
14. Command Encapsulate a command request as an object
15. Interpreter A way to include language elements in a program
16. Iterator Sequentially access the elements of a collection
17. Mediator Defines simplified communication between classes
18. Memento Capture and restore an object’s internal state
19. Observer A way of notifying change to a number of classes
20. State Alter an object’s behavior when its state changes
21. Strategy Encapsulates an algorithm inside a class
22. Template Method Defer the exact steps of an algorithm to a subclass
23. Visitor Defines a new operation to a class without change

Design Patterns for Unity 3D / C#

C# is a robust language, and all popular design patterns are possible. However, which design patterns are most appropriate to Unity3D and game development?

1. Which patterns above are ‘built-in’ to the Unity3D experience?

I’m curious of your help here. Please add a comment below.

2. Which patterns above would you like to see in my training series?

My Unity3D & C# HD Video tutorial series will feature sections about architecture and design patterns. What would you like to see covered? [polldaddy poll=7364605]