Disclaimer: this is an automatic aggregator which pulls feeds and comments from many blogs of contributors that have contributed to the Mono project. The contents of these blog entries do not necessarily reflect Xamarin's position.

May 20

Plastic SCM 4.1.10.440 External Release is out!!

Plastic SCM 4.1.10.440 (Kiev) is published now!

Take a look at the full list of changes is here. Visit the Plastic SCM download page to install or upgrade your Plastic SCM setup.

You can suggest and vote new features on the Plastic SCM Forum page and tell us your opinion about Plastic SCM or use the User's Voice channel, as well.

Let's see what's new in this release:


Bugfixes

  • When a local move was applied, the operation may fail showing an improper message: "Selector can't locate a revision for the item...". This issue was happenning because the local moves were not taken into account properly as depedencies. Now this is fixed.
  • Fixed some issues when using Plastic SCM with Mono 3.0. This version is not provided in our installer, but it's good to know that if you want to use it, now you can, and it should work like a champ.
  • Merge: An error was thrown when running a merge on Windows platforms that implied changing the contents of a symlink. This is now fixed.
  • Checkin: When this operation was performed from the GUI and there were not only small files implied (> 4Mb), the progress was not updated correctly for those files. Plastic SCM should show an additional progress for those files, but it didn't. Fixed.

Enjoy!

May 17

A good workflow to smoothly import 2D content into Unity, Part I: authoring and exporting

Unity has been used to develop numerous high quality 2D games over the years. This article, which is based on a talk I gave at three of our regional Unite developer conferences in Korea, Japan and China, gives in-depth instruction for a solid, real-life 2D production workflow. I hope this post can be helpful for any of our readers that are creating 2D games and interactive content with Unity. Due to the length of the tutorial, I’ve split it into two blog posts. Today you can read about authoring and exporting and tomorrow I’ll post the section on importing. You can find a link to download all the files at the end of the post.

The benefits of a good 2D content workflow

This tutorial takes you through the implementation of a real production workflow. When we talk about workflow it means the steps and processes used all the way from the initial authoring until the content is actually running in the game. Regardless of the number of applications needed in the chain from beginning to end, at a high-level a workflow consists of 3 major steps: authoring, exporting and importing.

For some it may seem odd that we need both an exporter and an importer since tools like Unity are able to import data directly. The reason we need both is because we’re essentially creating our own intermediate file format that acts as the glue between any two applications in your workflow, in this case between Photoshop and Unity. This eliminates the need for an external application to be able to read and parse an application’s native file format, and allows chaining of applications to process the content as it moves from one application to the next.

Authoring

It all starts with great content, and the first workflow we’ll look at is using the industry standard workhorse Photoshop. One of the great things about Photoshop is it’s simplicity to get started. Creating and editing imagery and graphics is painless and easy, and as your needs grow there’s an arsenal of tools and techniques at your disposal. The problem is that image files by themselves don’t have much ability to express useful meta-data for games in the same way that 3D models are able to do. What’s more, 2D is inherently in need of more meta-data given it’s limited nature of just being pixels.

So what we want to do is imbue the image with useful information so that ultimately we know how to use the image in a game. To do that, we can use groups and layers to organize and tag them with what we need.

We also need an example of 2D content that is useful and represents a realistic use. One of the last games I worked on before joining Unity was a simple 2D hidden-object game called Goddess Chronicles, and so we’ll use that as an example. In a hidden-object game the general idea is to find certain items that are hidden in plain sight in a scene such as the example shown below.

Depending upon the game you’re making, the meta-data you need to capture will be different. For this game the design called for 2 basic kinds of imagery: “scenery” and “items”.

The importance of layers

Scenery is the non-interactive content that’s there to provide the bulk of what’s seen, communicate a theme and support the gameplay by providing an environment where items can be hidden. So scenery will be placed into a group named “scenery” and we don’t need to care about the art layers in that group because they’re non-interactive. The items are the things you’ll actually be searching for within the scene and comprise the core gameplay. These are placed in groups that are named “item” and, unlike scenery, the art layers are important and each item can have up to 4 unique layers associated with them.

“Whole” layers are required for all items. Usually once an item is found there will be some effect such as zooming the item up, or placing it into the player’s inventory, and we need the whole image so that it looks right.

“Obscured” layers are used when you want to create the illusion that an item is behind something when in fact it’s floating in front of it. By erasing the pixels that should be hidden it tricks the eye into thinking that it’s actually behind something. In theory we could use whole images for everything, but there are many situations when it’s tedious for the artist to draw everything as separate pieces in order to hide an item, plus using the minimal amount of images in the game will increase the runtime performance.

“Shadow” layers are used to help visually place the items into the scene and look like they belong there. Shadows are kept separately from the whole or obscured image so that if the whole image is zoomed up or moved it doesn’t have an odd looking shadow following it, and instead we can just hide the shadow in the scene once the item is found.

“Hotspot” layers are used to increase or decrease the area which the item can be interacted with. For example if you hide a golf club in a scene it could be very difficult to click or tap on. By using a hotspot you could make the interaction area bigger and easier to use.

So putting all this together we can use groups to designate whether something in our scene is scenery or an item, and we can use the art layers for items to hold the whole image for the item and optionally include obscured, shadow and hotspot images. The image below shows a set of layers for some scenery and an item. The item group is labelled “item:Beads” and contains 2 art layers called “whole” and “hotspot”. The scenery group is labelled “scenery:Column” and it contains any number of art layers that can be named anything since scenery layers aren’t special and we don’t need to keep track of them.

The end result is that we have a well composed scene where the group and layer names are encoded with what we need to give them meaning in our game. You can download the package at the end of the post and have a look for yourself. The next step is to now get all this exported.

Exporting

Once we have some content, we need some way to get it all out for the next application in our workflow, which in this case is Unity. What we want to export are the images used to construct the scene along with the meta-data describing the position, order and other information. In order to do that we need a way to interact with the application at a low level with something that understands how to do that. Fortunately for us, Photoshop is scriptable using javascript and this will do exactly what we need.

In fact quite a few Adobe apps are scriptable including Fireworks, Illustrator, Flash and others. We can use this capability to write our own exporter that can prepare the images for use in Unity and also capture the meta-data we need to make them meaningful. Adobe provides useful documentation and a script editor and debugger called ExtendScript for free.

If you have the Creative Suite, it’s probably already installed on your system. On Mac it can be found in the Utilities/Adobe Utilities – CS6/ExtendScript Toolkit CS6 folder for the latest Creative Suite. On Windows, you should be able to find it at C:\Documents and Settings\\Application Data\ Adobe\ExtendScript Toolkit\3.8.

Pretty much anything you can do in Photoshop can be scripted, and if there isn’t an API for a particular thing you want to do, you can record actions and convert them to command codes that you can paste into your scripts (alpha channel operations, I’m looking at you!).

For our purposes, we need a simple script that basically:

  • Checks to see if we have an open document,
  • Makes sure the document has layers to export,
  • Prompts the user as to where the exported files should be placed,
  • Loops through the layers from back to front, trimming away the empty space, saving the image to disk and capturing the position and filename in an XML formatted string,
  • And finally saving out the XML data to a file.

The final exporter script is in the tutorial package. To use the script you place it in the Presets/Scripts sub-directory inside your Photoshop application directory. The script contains comments that explain what it does so I won’t go through all of it, but I will cover some of the more important parts.

Firstly, the scripts are written in javascript which makes it easy to learn and use. The javascript engine used by Adobe isn’t very fast, but it works and is debuggable with the ExtendScript editor which makes it very useful.

Since the meta-data is actually the part that gives meaning to the data, we need to spend the most time figuring out exactly what meta-data we need and how it should be formatted. I use XML as the way to specify the meta-data since that makes it really easy to parse later on in Unity. Based on the game design we know we have certain data that will be needed in the game. An extract of that data looks like this:

<?xml version="1.0" encoding="utf-8"?>
<HogScene xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <layers>
                <Layer>
                        <type>Scenery</type>
                        <name>Scenery 01-4 background</name>
                        <images>
                                <Image>
                                        <type>Whole</type>
                                        <name>Scenery Tree.png</name>
                                        <x>25</x>
                                        <y>63</y>
                                </Image>
                        </images>
                </Layer>
                ...
        </layers>
</HogScene>

So our exporter script will capture these simple XML elements during export and when it’s all completed write that out to a file.

In our exporter script, we start off with creating some file scope variables that we need for convenience and then call the “main” function which is defined right after that. The basic way this works is that when you run your script it’s evaluated and executed from top to bottom. You find examples on the internet where some code is contained in functions and some is not, and I find this a bit confusing. So I put everything into functions and call the entry point explicitly as a matter of convention.

Inside the main function, there’s a couple of interesting parts. The first one is the line:

duppedPsd = app.activeDocument.duplicate();

Duplicating the active document is highly recommended for two reasons. The first is that in Photoshop if you touch anything in a document, even expanding or collapsing a group, it causes the document to be marked as dirty. So if we didn’t duplicate the active document, the process of exporting would always cause it to be marked as dirty. When the artist quits Photoshop or closes the document they will be prompted to save, and they may not remember if they made changes to the document or not and will likely just save it. This will cause the timestamp of the file to be newer than the exported files, and once checked into version control will be confusing because a designer, producer or programmer won’t know if they need to re-export the file or not. This creates an endless cycle because the file will always be newer than the export. By making a duplicate it will leave the original document in it’s original state, which still may cause a problem, but that’s then a production process problem and not something we’re causing.

The second reason for duplicating the document is simply that things will go wrong while creating your own exporters, and when things go wrong it will leave your document in an unknown state. So by duplicating it we always have our untouched master copy to work with.

The next thing of interest in the main function is:

removeAllTopLevelArtLayers(duppedPsd);

Since we’re using groups as the containers for the things we’re interested in, we can let the artists or designers add art layers that aren’t in any group (“top level”). They can use this for concept or photo references, screen layout guides, or placing placeholder elements like a game HUD. So we clean up the duplicated file by removing these images before processing.

Other than that, the main function calls the export function, then creates and writes the XML file containing our meta-data.

The export function exportLayerSets is a recursive function. A recursive function means it calls itself if needed to “drill down” into our groups to find the lowest level group that is deepest in the scene.

function exportLayerSets(obj)
{
        for(var i = obj.layerSets.length-1; 0 < = i; i--)
        {
                exportLayerSets(obj.layerSets[i]);
        }
        ...
}

It does this by simply looping backwards through the list of groups, and if one of the groups has a group inside it, then it recurses and calls itself again with that group and so on. We loop backwards because in Photoshop the bottom-most layer in the list is the first one and groups and layers higher in the list are drawn on top of lower ones. So we process everything back to front.

Once we have an actual art layer, we then look at the group name and see if it starts with “item:”, “custom:” (which we used for HUD elements) or else it’s assumed to be scenery.

if(obj.name.search("item:") >= 0)
{
        ...
}
else if(obj.name.search("custom:") >= 0)
{
        ...
}
else // must be a scenery group
{
        ...
}

For items, we then loop through the art layers, switch on the layer and export whichever of the known types we support.

// process layers
for(var layerIndex = 0; layerIndex < obj.artLayers.length; layerIndex++)
{
        sceneData += "<Image>";
        obj.artLayers[layerIndex].visible = true;
        switch(obj.artLayers[layerIndex].name)
        {
                case "hotspot":
                        saveScenePng(...);
                break;
                case "obscured":
                        saveScenePng(...);
                break;
                case "shadow":
                        saveScenePng(...);
                break;
                case "whole":
                        saveScenePng(...);
                break;
        }
        obj.artLayers[layerIndex].visible = false;
        sceneData += "</Image>";
}

When we find something we want to save, we call the function to save the image as a PNG file. This function collapses the image and trims the left and top in order to determine the X and Y coordinates of the image. Then we trim off the right and bottom and save it out, and capture the meta-data into the XML string.

function saveScenePng(psd, imageType, fileName)
{
        // we should now have a single art layer if all went well
        psd.mergeVisibleLayers();
        // figure out where the top-left corner is so it can be exported
        // into the scene file for placement in game
        // capture current size
        var height = psd.height.value;
        var width = psd.width.value;
        var top = psd.height.value;
        var left = psd.width.value;
        // trim off the top and left
        psd.trim(TrimType.TRANSPARENT, true, true, false, false);
        // the difference between original and trimmed is the amount of offset
        top -= psd.height.value;
        left -= psd.width.value;
        // trim the right and bottom
        psd.trim(TrimType.TRANSPARENT);
        // find center
        top += (psd.height.value / 2)
        left += (psd.width.value / 2)
        // unity needs center of image, not top left
        top = -(top - (height/2));
        left -= (width/2);
        // save the image
        var pngFile = new File(destinationFolder + "/" + fileName + ".png");
        var pngSaveOptions = new PNGSaveOptions();
        psd.saveAs(pngFile, pngSaveOptions, true, Extension.LOWERCASE);
        psd.close(SaveOptions.DONOTSAVECHANGES);

        // save the scene data
        sceneData += ("<type>" + imageType + "</type>
                                <name>" + fileName + ".png</name>
                                <x>" + left + "</x><y>" + top + "</y>");
}

When we run the exporter on the file, we should end up with a directly of cropped PNG files plus an XML file with the same base filename as the original document such as that shown below.

Now that we successfully exported all our images and meta-data, we move to the next application in our workflow which is Unity and get the files imported. I’ll cover this in my next blog post. Thanks!

You can download a Unity package with all the files for this tutorial.

May 16

2000 checkins per minute and counting

Do you want to know how Plastic SCM performs under really heavy load? If you’re a Plastic enthusiast or just want to learn about the product… then keep on reading.

Why are we so obsessed with performance and scalability?

Version control performance is a critical point for lots of software teams out there. It is not restricted to a single industry: you can have big teams with big projects in aerospace, game dev, finance, telecom and many more. And the thing is that sometimes they can’t work in a distributed fashion, so they put a big burden on the version control server shoulders...

That’s why we regularly run load tests in Amazon to simulate lots of version control users putting a huge load on a single server… And this time we’re going through a quite interesting scenario: how does the server react when it is under a 2000 checkins per minute load?

The big “gang” theory

Big is a concept that changed quite a lot for us while evolving Plastic over the years. I still remember our first ever full checkin of the quake source code that we used for testing. It is not bigger than 1200 files (twelve hundred) but it took… a while. It was back in 2005.

Later we considered big a source tree around 20k files.

But things changed and today a good source tree is one with about 500k files and 40-80k directories and a big number of Gb in the working copy. And big, really big, is 1.5 million files.

What we consider a big number of concurrent users also grew up a little bit: back in the day 50 was sort of ‘hey, are they trying to crash it’ but today we’ve customers with 1200 concurrent coders on the same project on a daily basis… on a 350k files source tree.

The phantom bots menace

Here is the scenario we’re talking about: 300 bot clients crazily loading a single server. The point is not really figuring out how much load the server can handle, today the question is: as a developer doing regular operations, how much I am affected if my server is under heavy load?

Or, in other terms: as a developer, can I work smoothly in a big team or will team size be a bottleneck for the server and hence even the simplest operation will be taking ages?

That’s why the scenario is as follows (thanks to our designer :P): 1 human developer doing operations while 300 bots overload the server with concurrent operations at 2000 checkins per minute on a 350k files repository loaded up with a good changeset count.

Why not distributed?

You might ask: “hey, but Plastic SCM is a Distributed Version Control System, why are you using a central server instead of each developer checking in to their own servers hence removing the bottleneck??”

The answers are:

  • Yes, we can do that: use the distributed mode “if you can” and problems are over.
  • Noticed the “if you can” in the bullet point above? It is there for a reason: there are cases where distributed is not an option, at least not the option for everything.

When distributed is not an option

You read right: sometimes teams can’t go fully distributed. There are some reasons for this:

  • Not every team member is a programmer used to the dvcs paradigm. So asking them to checkin AND push is an overkill.
  • The repo is SOOO big that for whatever reason you don’t want to have a copy on each team-member machine. We can go around this one with Plastic SCM because we allow “partial replica” (a quite unique feature that cost us some headache to implement but now it is helping us to get more traction) but it is still not an option for some teams.

There are more options, but these two are a reality for many teams, especially in the gaming industry.

A few more reasons (for game devs) why “conventional” dvcs gets out of the picture:

  • They need exclusive checkout for artists. They DO need it. This one normally puts git and mercurial out of the table. Plastic supports exclusive locking even on distributed scenarios. We implemented a global list on a server acting as ‘lock master’ that the rest of servers can check (you can’t lock while you’re offline… which is doable but would be quite complicated and error prone).
  • They have also big files (like 1Gb or more) which also tends to be “game over” for Hg and Git and opens Plastic the doors.

But still, sometimes big teams working on big projects (and this can be true for smaller teams dealing with big projects too), simply want to simplify things: 1 server per location (running replicas across the different sites and taking advantage of both the distributed nature of the product plus the partial replica) and team members accessing the site server, plus only some of them working replicated on their laptops, at home and so on.

Then what is the issue with traditional centralized servers?

Easy, can’t scale while branching and merging in a big team (they have problems with small ones too, but it simply explodes on big ones).

If creating a branch takes ages (like minutes or so) or if your backend gets locked on a frequent basis… then you’re in trouble.

As you all know, the version control business is about replacing existing products on teams: almost everyone has a version control nowadays, so our job with Plastic is to probe we’ve more features, we’re faster, easier… the usual :P

But we’ve tough competitors so that’s why we have to create this sort of tests to show what the server can do.

Setting up the server

The server we used for this test is one of the biggest we set up for testing so far: 16 cores and 60Gb RAM.

But the Plastic server binaries are always the same whether they run on a laptop using 80Mb RAM or in a big loaded test server using lots of system memory.

There are some tweaks to consider, the main one is the number of “trees” to be cached in memory. Since Plastic SCM 4 the server deals a lot with “changeset trees”, basically the source tree you have on a certain cset. Since different changesets tend to share most of their source trees, caching them is fast and easy.

When you run Plastic on your laptop the server normally has to deal with only a single user, so it is all about having only a few trees cached (the one you’re working on basically) and loading more on demand (reusing most of the nodes) whenever you merge, diff or switch to a different branch.

But in order to speed things up for a big team where users will be requesting lots of trees, it is good to keep as many of them in memory.

This is the main tweak we configure for big servers: modify db.conf and add:


<MaxCachedTrees>50000</MaxCachedTrees>

Which will cache up to 50k trees (and the number can be bigger if you need to).

There are also options for servers under really heavy load which allow them to load the most recently used trees on startup prior to begin serving clients and hence reach a stable status ASAP. In order to set it up you can add the two following entries to db.conf:


<LastUsedCsetsLoad>40</ LastUsedCsetsLoad>

Which specifies the size of the LRU cache.


<LastUsedCsets>c:\cache\cache.txt</LastUsedCsets>

The file to cache all the info.

Bot clients

In order to create the clients we used what we call a “carnage test” (the name says it all) which is an executable file using the PNUnit framework (our extension to NUnit to create distributed tests) and linking to the Plastic internal client API.

This way we can create quite lightweight clients that use less resources than a regular one (for instance they do not create a regular workspace but run all operations in memory so putting even more burden on the server shoulders) and are quite easy to run with virtually no setup.

The watcher

While the bots are running we run some manual operations on a client machine to check how it is affected by the server being under heavy load.

In the past we just measured bots finishing their workloads, which is ok but it doesn’t really give you a perspective about “how does it look like to work on a server used by lots of developers”.

Numbers measuring completion time for 300 clients just tell you whether it scales or not (or it just multiplies by “n” the single user test result) but not really the feeling.

Next steps

Once we went through the initial tests we’re creating a much bigger repository with about 3+ years of history and a different type of “bot client”: something really simulating a developer instead of crazily doing operations and burning CPU.

The well-finished load test page

We’ve created a quite interesting page describing the scenario here and including a screencast of the “watcher” client.

Lvov Game Hackathon – the view from inside

Hi everyone! I want to share with all of you the news on Game Hackathon that took part in Lvov, Ukraine last weekend.

Unity Technologies was one of the sponsors, Ilya Turshatov and I gave a short presentation and were present there as mentors for those loooong 30 non-stop coding hours.

The format of the event:

  • Teams up to 5 people
  • 30 hours to develop your game (you are allowed to use frameworks and engines)
  • 5 minutes to present your game
  • The jury chooses the winners according the following criteria: game play, technologies used and innovations

Some statistics:

  • 61 participant
  • 20 teams at the beginning and 18 teams that actually made it to the end.  5 teams used Unity. There was one game on Flash, some even used HTML tables and jQuery.
  • 264 cans of RebBull drunk
  • 70 pizzas eaten
  • 18 table football matches played
  • 6 movies watched

Winners and some more…

The most pleasant part was that the 1st and the 3rd places were taken by the games made with Unity!  And the overall impression was that games made with Unity looked more finished, stable and with no obvious bugs during the presentation.Now a bit about the projects themselves. I will mention only some of them, which we found the most interesting, though I must admit that all projects were quite compelling.

“Tomato Wars”

by Patriotic Games won the 1st place by the jury’s decision, as well received 2 Mobile license (which they needed) from us. The game play was “bloody”. You are a tomato and you have a rifle and you make tomato juice from all other tomatoes that attack you in packs. The choice of the guns is available, all the objects are breakable. Oh, oh… and you have bombs *evil laugh*.

“Titanium”

by Empty. by Empty. Shake, rotate, turn – do whatever you want to get those damn’ rings on the Titanic’s funnel. Quite addictive, the girls from the HR department were constantly asking for updates every now and then during the Hackathon. They got the 3rd prize and also received Unity licenses.

“Divine Path”

by Creators.   A student and two schoolchildren created the whole new world (Asset Store rocks!).  It was not something extra impressive, but for 3 guys with no actual experience it looked not bad, and in some cases it looked more compelling than the projects made by professional developers. The main concept of the game was the lost world with no people left where your main goal was to find the evil god. You wouldn’t find any tasks or hints in this game (as according to Creators it’s too boring just to carry out the missions), as well as you cannot exit the game so easily J Before leaving you need to find the “save point”, e.g. the doors in the house. They received 1 Unity license as an encouragement not to quit the attempts, and to go on with their experiments.

And here are some photos from the event.

May 15

Broaden your reach with multiplatform publishing

Develop once deploy anywhere – that’s our proud boast. Currently, users can deploy content built on the Unity engine to nine different platforms, and in recent months we’ve announced support for seven more: Windows Phone 8 and Windows Store, BlackBerry 10 and PS4, PS Vita, PS Mobile and Sony’s new cloud gaming service. Plus, we’re working closely with Facebook to improve the Unity Web Player experience for Facebook gamers.

Designing content for multiple platforms becomes far easier if you think a few things through before you start. If you get your processes right, it’s easy to use Unity to build high wow-factor games across a range of devices.

Ten top multi-platform tips

 

1. Does this make financial sense? It sounds obvious but, before starting your project it’s as well to think carefully about the financial benefits of deploying your game to multiple platforms. On the one hand, making a successful game available on just one platform ignores easily acquired additional revenue. On the other, the costs involved in porting your game go beyond simply acquiring an additional add on license and clicking publish.

2. What about my demographic? Different platforms have their various strengths and weaknesses and are more or less widely used in varying contexts. Consider whether the type of interaction and game play your game is based around is suited to deployment to the platforms you’re targeting.

3. Start with your two most widely divergent platforms. If you plan on developing a game for three or more platforms, it makes sense to start by weighing up what you need to do to get your content to outlying platforms. By considering this first you will automatically cover much of the ground involved in developing content for your remaining platforms.

4. Beware obsolescence. Mobile platforms change at bewildering speed and supporting legacy versions of a platform that are becoming more obsolete by the day may, ultimately, just add to your costs.

5. Abstract out platform-dependent plugins. If, for example, you plan to build leaderboards and achievements for Apple’s Game Center be sure to build a leaderboard manager which abstracts the leaderboard calls and then makes the Game Center calls. That way it’s easy to add, for example, SteamWorks leaderboard support later on.

6. Ensure resolution independence. Plan how your HUD, UI, on-screen controls and buttons will be depicted at various aspect ratios. Design the UI layout in a modular way so you can space out elements without a re-design. Remember that, in Unity, you can specify resolutions in percentages.

7. Build high res source art. Let Unity do the downsizing for you. This prevents late-stage art reworking for e.g. iPhone Retina displays. Plus, when you need poster-sized promotional art, you won’t want to cry.

8. Think optimisation into mobile games from the start. Use light probes to store lighting information and bake this information into dynamic objects, work with simple specialized shaders and detailed, high-contrast textures, use object pooling techniques and profile early and often.

9. Consider investing in additional tools. Owlchemy Labs’ Multiplatform toolkit is available from the Asset Store. Amongst other things this end to end solution can ease scaling, strip redundant assets from your platform-specific build and help you manage and apply global asset compressions.

10. Frequent use of compiler directives. Unity supports platform specific compilation so you can partition your scripts to compile and execute a section of code exclusively for a specific platform.

May 14

Power of mathematics: Reasoning about functional types

One of the most amazing aspects of mathematics is that it applies to such a wide range of areas. The same mathematical rules can be applied to completely different objects (say, forces in physics or markets in economics) and they work exactly the same way.

In this article, we'll look at one such fascinating use of mathematics - we'll use elementary school algebra to reason about functional data types.

In functional programming, the best way to start solving a problem is to think about the data types that are needed to represent the data that you will be working with. This gives you a simple starting point and a great tool to communicate and develop your ideas. I call this approach Type-First Development and I wrote about it earlier, so I won't repeat that here.

The two most elementary types in functional languages are tuples (also called pairs or product types) and discriminated unions (also called algebraic data types, case classes or sum types). It turns out that these two types are closely related to multiplication and addition in algebra...

Unity Training

Hello!

Just over a year ago I joined Unity as a Trainer and Consultant. In this role, I’ve been travelling to customers around the world helping them learn how to get the best from our technology. I’ve visited games companies, universities, research centres and simulation customers, and the locations have spanned the globe, from Texas to Saudi Arabia, to Singapore. (TL;DR Videos Below!)

During this time, I’ve also been helping to build up the range of training material that we can offer to customers. A lot of this material has grown organically, some based on customer requests for training in specific areas, and some based on creative ideas that tie together Unity’s features into learning projects.

The style and focus of the training courses vary widely. I’ve visited customers who needed a crash-course for their junior developers, or training for experienced developers moving to Unity from a different environment. I’ve also visited teams of experienced Unity developers in the middle of projects who wanted a quick boost of technical knowledge to help get their project to the finish line.

In my beginner crash-course, I take trainees on a tour through Unity’s main features, bringing everything we learn together into a finished game – which usually involves plenty of flying saucers, explosions and sound effects. This seemingly simple project covers many of Unity’s core features such as the art and asset pipeline, physics, components, scripting, prefabs, particle systems, audio, and helps get developers who are new to Unity familiar with the editor.

A common request from games and simulation customers alike is training for our new animation system, and its integration with physics and pathfinding. For this, I run through the entire system from scratch, creating a third-person controller and NPC characters with many of the common games actions such as mouselook, strafing, sprinting and crouch walking. We learn how to import, edit and retarget animations, through to building up state machines and integration with input. We examine how to get the pathfinding system to properly control root-motion animated characters, and how to make sure our characters can interact with physics objects properly. This whole section takes about two days to complete, and serves as a solid foundation of knowledge for building character-based games in Unity.

Simulation customers often want to build applications for training purposes themselves, and the individual requirements in the Sim field vary so much that there’s no one-size-fits-all training program. Their goals can range from small mobile applications showing how to maintain a piece of equipment, to virtual reality workplace safety training, to ocean-going container ship simulation, and the training I put together for each customer attempts to meet these needs, giving them the understanding they require to make the best use of our tools.

One project I use for Sim customers begins with a model of a stapler. I show the trainees how to start with the bare 3D assets, and build up an interactive training application which allows an end user to progress through the maintenance steps. Obviously the point here is not to teach how to use a stapler! – what the trainees learn are the skills required to build whatever kind of equipment-based training applications they need.

The videos below show a broader cross-section of the content of training we’ve delivered so far to customers.

If you want to learn more about Unity and want training, contact your account manager to find out more.

Unity Training – Basic

Unity Training – Games Focus

Unity Training – Sim Focus

Plastic SCM 4.1.10.436 External Release is out!!

Plastic SCM 4.1.10.436 (Bombay) is available now!

The full list of changes is here. Visit the Plastic SCM download page to install or upgrade your Plastic SCM setup.

You can suggest and vote new features on the Plastic SCM Forum page and tell us your opinion about Plastic SCM or use the User's Voice channel, as well.

Let's move on to the meat ;-)


New

Closable wokspace tabs: This feature has been suggested by lots of users and now it's available!


Take into account that you won't be allowed to close the latest workspace. This is because a workspace at least is necessary to work with Plastic SCM GUI.

To make a closed workspace visible again, you need to open the workspaces view and make that workspace active:




Bugfixes

Switching to a workspace that contained multiple opened views with a SEID condition (such as owner='me') could lead to a "Item has already been added" error. This concurrency but minor issue has been fixed.


Enjoy!

May 12

How four indies conquered Kickstarter Part II

Last Friday we published Part I of our story on how four indie customers successfully funded their games with Kickstarter. Part I focused mainly on the content the teams worked hard to produce before launching their Kickstarter projects, and how that effort paid off in attracting backers and press coverage. In today’s post the customers talk about how they spread the word for the project, budgeting, and the positive power of community.

Kickstarter logo

Start spreading the word as soon as you press Go, and target the audiences you know will want to play your game.

“We targeted sites and blogs where there is a high concentration of people interested in RPGs, like RPG Codex”, says Jonas. “We knew our target audience and we found them and talked to them. Even though the audience for some of the RPG sites we targeted is smaller than that of general news sites, the quality of the exposure we got was much more valuable”.

Jake and Tamas spread the word through their Chicago-based community of developers. “It’s a great community here of independent developers that really helped us out”, says Jake. “I also emailed my contacts at blogs like rock paper shotgun and indiegames.com. Within a week of launching we met our funding goal and over the next three weeks we earned an extra 15-20% on top”.

Klaus says they benefitted from enthusiastic backers who have their own networks who promoted their project. “You can actually follow people on Kickstarter and get a notification when they back a project. So they end up acting as a kind of ambassador for your game”.

About the money: Set a realistic and modest funding goal, offer nice rewards not just for the highest tiers, but the most popular ones, and be prepared to learn as you go along!

Jake says that when it came to their funding goal, “we decided to be really specific about where all the money was going. Kickstarter is still a really valid option for just starting out and setting realistic and precise goals, such as ‘I need $200 to pay an artist or $300 to pay the band’”.

Michael and Aaron set their funding goal for the minimum amount they needed to complete Blindside and anything above that would go towards extra production value. “You should also expect to lose about 10% of what you raise to fees for payment services, to Kickstarter itself, and to people whose credit cards don’t work”, says Aaron. “And make sure your tax structure is correct! You don’t want to end up raising a lot of money and then losing a big chunk of it to poor or incorrect tax reporting”.

By reading up on other Kickstarter campaigns, the team at Logic Artists learned that the most popular tiers are 15 or 30$. “So, you want to get people to pick $30”, says Jonas. “We offered beta access for $30. But it’s is hard to figure out what rewards should go with what tiers, especially the high-level tiers. What kind of reward do you offer for $10,000?”

Jake and Tamas also provided physical rewards, such as posters and CDs. “We did a really bad job of budgeting the time it would take to make the items and forgot to include shipping costs, so it cut into the money, but we made up for the loss with some of the extra funding we got”.

“Tiers are a huge thing to nail the campaign”, says Klaus from the Back to Bed team. “We figured out early on that we’d have to make new tiers with physical rewards. People reach a limit where they don’t want to pay for digital items, they want t-shirts. One reward we offered was a framed piece of artwork, and that was quite successful”.

And beyond the money: Whatever happens, take the long-term view that you are building up a new community of people interested in your work

“Now we have this community for our game! We’ve even had to hire a community manager”, says Ali from Logic Artists.

“We’re all invested in the game now”, says Jonas. “We use our Kickstarter community as testers and get a lot of valuable feedback. We even gave them access to our bug trackers”.

“It’s been really nerve wracking. We bet our reputation on it and it was so much work. But Kickstarter has been a way for us to show our skills and make a name for ourselves as a brand new studio about to release their first commercial product”, says Jonas.

“In game design you always want people to test and iterate and tell you how to make it better”, says Michael. We didn’t have a budget for testers. We didn’t have an office. So it was fantastic to have this huge community invested in BlindSide. It was the easiest play-testing experience I’ve had and we got tons of feedback. It was remarkable and really helpful”.

Jake and Tamas had about 30 people sign up as beta testers and “the feedback was extremely helpful”, says Jake. “We also sent out a monthly newsletter to our approximately 200 supporters, showing them some secret stuff and prototypes”, he says.“These were the folks connected to the game since its inception, so they talked about it and spread the word when it was released”.

As Jake sees it, supporters who act as evangelists for your work are as valuable as the money itself. He talks about a friend of his whose Kickstarter campaign failed to reach its funding goal, but who walked away with a huge community.

“We were hearing about Kickstarter exhaustion already when we launched our campaign”, says Jake. “I know the landscape has changed, but I think the platform is still there for folks doing small, realistically established projects. We were totally ecstatic. To us it was great that you could be a creator and decide for yourself what it means to be successful. And the support we got early on has been amazing for us and super helpful”.

May 11

First Wave of Cross-Platform Evolve Sessions Available

Just in time for your weekend viewing pleasure, the first wave of Xamarin Evolve 2013 sessions are now available.  Dive into 8 technical sessions on Xamarin and cross-platform best practices. Highlights include:

Scott Hanselman’s entertaining session on how C# Saved his life, his marriage and made him an inch taller.

Bastion creator Andrew Wang, CTO of Supergiant Games, brings cross-platform lessons learned for all mobile app developers in his session Multiplatformism:  Lessons learned bringing Bastion to Six New Platforms.

Intro to Calabash, the automated testing framework used in Xamarin Test Cloud, is covered by creators Karl Krukow and Jonas Maturana Larsen.

Additional sessions cover mapping and location, code-sharing best practices, barcode scanning, and Xamarin.Mac. Enjoy!

Watch Evolve 2013 Sessions

May 9

New version of SemanticMerge is out - 0.9.22

Here we go again with a new release of SemanticMerge, the merge tool that understands your code (and maybe reads your mind too :P).

While we work on the next major release we’ve finished a few small but important changes ready to be published on our weekly version (I should better say the next two major releases since we’re already working on the biggest request on user voice :-O).

Let’s see what’s new on SemanticMerge 0.9.22.

Update system with built-in release notes

Yes, now when a new upgrade is ready, the upgrade window will show you what is new...

We’ve also added a --nocheckupdates flag so that you can avoid looking for fantastic updates... just in case.

If you decide to “update” then once you launch the tool you’ll see something like the following on the bottom right corner.

And once the download is finished it will give you instructions to restart:

We think the built-in update system will save precious time and will help all users staying up-to-date with the new versions.

SemanticMerge issue with “not valid license” message

Last week we launched support for Vb.net and since then some people experienced the following error: starting the diff tool they started to get a “not valid license” error message.

In fact the error was not really related to the Vb.net release but to the fact that the diff tool is not able to “request a new license” and that some people downloaded this new version just 15 days after downloading the first one, exactly when the built-in trial expired (Vb.net was launched 15 days after the initial c# launch).

Well, now it is fortunately fixed!

Encoding lost saving the result file

This is one of the bugs fixed on this release. There were issues keeping the encoding on the result file and it has been fixed now.

Fixed issues in conflict resolution

When conflicts had dependencies, there were issues solving them due to an internal cache update. It has been fixed too.

Next steps

We’re working on a number of features right now. We’re getting closer to release Java support, which is going to be the next big launch. We expect it to get really big since Java is one of the most widely used programming languages.

We’re also working on Mac OS X support. We guess we’ll need to add good Javascript support too in order to make the Mac OS X version really usable, and JS is top 3 request in uservoice as I write this.

But, we also think adding Mac OS X support will be great for all the Xamarin Studio users getting advantage of C# to develop for Mac, iPhone and even Android! :-). So let’s see what we can do to have it ASAP. We will be using the SemanticMerge Mac OS X development as test field for the upcoming Plastic SCM GUI for the Mac. We will be publishing the drafts of the Mac OS X Semantic Merge GUI soon, so you can give us early feedback.

The top 2 request is support for Linux so I’d love user feedback on your favorite GUIs for Linux.

We also need to move fast to support C, C++ (I guess we’ll be able to have C support earlier than C++ since it is simpler) and later Objective-C, but it will take a little bit longer.

We’d like to finish some proof of concept of “multi-file” SemanticMerge, which is also one of the super big features to come, but right now we’re fully booked. Remember we’re also releasing new Plastic SCM versions regularly each time ready for bigger and more complex companies.

Of course: we will be releasing support for fully automated SemanticMerge soon (not having to answer any questions if the merge can be automatically solved, as an option).

And one final note: we’re working on an astonishing “semantic visual diff” which will be able to render the differences visually, to better understand what is going on with your really complex refactors!

Social bar

Many of you have noticed we added a “social bar” to the SemanticMerge GUI. The goal is to help us (in fact help you helping us!) spread SemanticMerge so it reaches a wider number of users. It hasn’t been successful so far although people twits about SemanticMerge really often, but not using the tool.

Do you think it would make sense to add some sort of request to tweet when you finish a very complex merge?

Download

If you’re already using SemanticMerge the update dialog should show up the next time you run it. If not, don’t forget to visit www.semanticmerge.com.

dotNetRocks and all things semantic!

I'm glad to announce our latest media appearance... :-) this time in .Net Rocks!

We talked about branch per task, distributed version control, a little bit about motorbikes :-) and then discussed the Semantic Merge launch!

Enjoy!

Unity QA status for 4.2

Our next upcoming release is Unity 4.2. Without actually going into what it’s going to contain in terms of features, let’s take a look at the other dimension we work along: Quality!

We just released 4.2 beta 2 this week and I will give you an honest status on the quality and bug situation in Unity.

Current situation

Our rapid iteration for 4.2 took a hit because a lot of our developers attended GDC 2013 and we had some issues with an update of our build software.

As of writing this, we have 40 bugs to fix before we will be able to call it a release candidate, but we will naturally get some bugs during the beta phase we need to fix, so a reasonable call is 60 bugs left. How long it takes to get them done is a different matter on which I shall not speculate here.

Burnup

It is good fun to take a look at how much we put into the release. From a QA perspective, this is one of the biggest bug fixing releases we have had.

We will hit 500 bugs fixed before 4.2 goes to final release. This includes 100 regressions from this or previous releases we have put in, so this release does bring  an improvement in quality as well as features.

42% of all the bugs fixed have been found and reported by a customer, which we are deeply grateful for.

4.2 Customer bugs

Since 4.2 has been in alpha for quite a while, we have already had a good number of incidents (bug reports users submit, which we convert to bugs if we can reproduce them).

196 have been reported, 14 are still not processed and 119 have been reproduced and converted to bugs. Out of those 119, 30 have been fixed, so bugs which are not of a high priority are getting postponed in order for us to have as little code churn as possible. It should be some comfort that we are releasing faster if your bug has not been fixed this time around.

Bug Clusters

From a QA perspective it is always very interesting to see where the bugs are clustering, because clusters unfortunately indicate more issues to be found. The report I made for this highlights overall bug clusters and clusters specifically from user submissions, so we can see if there are patterns of bugs where QA is not doing well enough.

In this graph I see no immediate warnings, which is a sign that we haven’t introduced any big and buggy areas; at least not areas where users have reported many bugs to us yet.

Looking at the entire codebase, we have the following picture:

The numbers show priorities 1-7, where 1 and 2 are the ones slated for fixing in 4.2. Assets management lights up, but it is also a very big area. In total we have just over  2000 active bugs, which is not scary in a codebase the size of Unity’s, but we need to be vigilant about keeping this number down.

So that’s the current situation with our codebase. With all the work being done to solve the highest priority bugs I hope you will find 4.2 to be yet another improvement in our effort to give you the best and most productive tool for producing your game.

May 8

Introducing Objective Sharpie

I am pleased to announce a new tool from Xamarin: Objective Sharpie, a very powerful binding definition generator for third party Objective C libraries to help provide APIs matching the .NET idioms and ensure delightful APIs. Objective Sharpie

Objective Sharpie takes much of the manual work of translating Objective C APIs into binding definitions that are consumed by Xamarin’s binding tools. Download your third party library, point Objective Sharpie to its header files, and off you go.

It does this using Clang and the SDKs installed in Xcode to extract all the API metadata needed to produce a binding: selector names, argument and return types, enums, and so on.

The only prescribed work is to transform public C# names to conform more to the Framework Design Guidelines (though this is optional, it’s highly recommended to produce an API that is a joy to consume).

Visit the Objective Sharpie documentation to learn more and download the tool for use today.

In the future we expect to integrate Objective Sharpie directly into Xamarin Studio as part of the binding project workflow. For now though, it’s quite useful enough that we wanted to release it as a standalone tool.

Download Objective Sharpie


A Little Backstory

When I first started working to bring new APIs introduced in OS X Lion and Mountain Lion to Xamarin.Mac, it took a while to sink in the daunting and tedious task was laid before me. Lion in particular introduced hundreds, actually, thousands of new APIs – many of which were ported from iOS to Mac OS X.

This fear of monotony fueled me to implement a tool that used Clang as a library to gain access to every single detail of the source tree as it’s parsed. With this information, I was able to start generating C# code that represented a verifiably correct binding.

It’s important to note that we build Xamarin.Mac and Xamarin.iOS using the exact same binding tools that are available in Xamarin Studio to bind third party libraries. And now Objective Sharpie is no different: it helps us deliver faster on new APIs and ensure that they are accurate and error-free by producing a correct binding definition up front.

While there’s always more work to do, and the full Objective C language isn’t covered, most of the common parts are. It should today be a very valuable tool for getting a binding going in the right direction… with much less typing and much more copy and paste.

If you find something missing or incorrect, please let us know!

It's all about monkeys

Yesterday evening, May 7, two belgian user groups,  MADN and DotNetHub invited me to give a 2 hour introduction session on creating multi-platforms mobile applications in c# with Xamarin 2.0.

Microsoft Belgium was hosting the session, and the room was packed !

I really enjoyed that evening, and just wanted to thank you all: attendees for their presence and interactions, MADN and DNH for the invite and the bottle of wine, Microsoft Belgium for the place, food and drinks, and Xamarin for the give away licences, monkeys and t-shirts.


Web Player runtime update alert

Unity 4.0 added the new release channels function to the Unity Web Player plugin; this function gives us more fine-grained control over runtime updates. Since then, we have started updating all plugins to 4.x so that release channels should be supported on all installed machines. However, we have not yet updated the Unity Runtime in the stable channel yet. Currently, all games published with Unity 3.x will still be run on a 3.x runtime.

We are planning to change this upon Unity 4.2′s release: the stable release channel will be updated to 4.2. This means that any released 3.x and 4.x Unity Web Player content will be played back with the 4.2 runtime. If you have any web player content out there, you will need to make sure it runs well in 4.2.

If you have any live Web Player content authored with Unity 3.x or 4.x, please test it against the current 4.2 beta runtimes – and please tell us if you run into any problems.

We try hard to ensure that no regressions exist in new runtime versions, and we have a lot of test coverage – but, when we miss something, we’d prefer that you find it, and that we correct it, before we ship!

To test your content against the 4.2 runtime:

  1. Go to http://unity3d.com/webplayer/setup/
  2. While holding the alt/option key, right-click on the Unity Web Player Content. (In older versions of the Web Player Plugin, the release channel menu would appear when right-clicking without holding down the alt/option key. This will change in 4.2.)
  3. From the popup menu which appears, select Release Channel -> Beta.

When you have changed the release channel in the Web Player to the Beta channel, all 3.x and 4.x content will be played back with the current beta release. Currently, that is Unity 4.2b2.

If you do find issues with your live Web Player content, please file a bug, and make sure to mention it’s a web player regression in the bug report. It is also a good idea to subscribe to our new web player update announcement mailing list, where you can discuss web player regressions and where we will announce future updates.

 In the past, we have received questions about which runtime will be used for each channel. To clarify the Web Player channel feature, here’s exactly how it works:

 

The Unity Web Player will always use the available release channel with the oldest runtime version which meets two criteria:

  • The runtime version is not older then the Unity version the content was built with.
  • The runtime version is not older then the channel selected in the Release Channel popup menu

 

By default, the Unity Web Player uses the Stable channel.

For example, assume the Stable channel is at 3.5.7, Release is at 4.1, and Beta is at 4.2. If the channel selected in the Release Channel popup menu is Stable, then:

  • 3.2 content would play with the Stable channel (3.5.7)
  • 3.5 content would play with the Stable channel (3.5.7)
  • 4.1 content would play with the Release channel (4.1)
  • 4.2 content would play with the Beta channel (4.2)

If the same setup is used, but the channel selected in the Release Channel popup menu is Release, then:

  • 3.2 content would play with the Release channel (4.1)
  • 3.5 content would play with the Release channel (4.1)
  • 4.1 content would play with the Release channel (4.1)
  • 4.2 content would play with the Beta channel (4.2)

It’s all about being productive

Stuff like this makes me sad:

Also, the github issue where TJ requests that everything gets rewritten in plain JavaScript: https://github.com/rethinkdb/rethinkdb/issues/766

 

We’ve been here before
Language discussions aren’t new (nor is vim vs. emacs). In the GNOME community we’ve seen a ton of them. Just recently there was a huge one at the DX Hackfest.

GNOME/Mono developers have certainly received their dose of crap thrown at them. But so have GNOME developers that preferred Vala, Python, JavaScript, or even just GObject/C. Whatever you seem to be using, it’s never the right thing for someone.

Have all these years of shedding words over it solved anything? Frankly: no. We are still seeing a large combination of languages being used and all of those projects have good reasons to do so.

I get TJ’s point though: by using CoffeeScript, the rethinkdb people are making it harder for the wider JS community to contribute to their project. But…

 

It really doesn’t matter
Most open-source projects (or modules) don’t have a ton of contributors. It’s usually a modest team of core maintainers/developers that do the bulk of the work. And that’s fine: the success of a project should not be measured by the number of contributors, but by the quality of the software it produces.

This smallish team of core developers will have their own good reasons for picking up a certain language. They’ll use the language that they feel most productive with for the task at hand. And that’s a good thing, they are mostly the people that move the project forward.

The biggest barrier to contributing on a project is not the language, there are plenty of projects written in unproductive languages that get a ton of contributions. Any good programmer can pick up a new language up quickly (and TJ is more than just a good programmer, he’s a fantastic one, much respect). The bigger hurdle is the specific domain knowledge involved.

Let’s all agree to disagree and have some respect for each other’s opinions, they are all valid anyway.

 

PS: I’ll be heavily moderating comments that try to turn this into a flame-war. I’m writing this to find some more respect and understanding.

May 7

Using custom Fonts in Xamarin.iOS

Apple introduced a great feature when it released the iOS 3.2 SDK way back in 2009: support for adding custom fonts to apps. Since then, developers have made their apps stand out by using different fonts.

Although adding fonts should be a very simple process, developers often express confusion over how to do it for Xamarin.iOS apps. The process has a few “gotcha’s” that might catch you off guard if you skipped your morning coffee or you are trying to get a release out late at night.

CustomIOSFonts

In this blog post, I describe how to add a custom font to a label. This should give you an understanding of the process and help you if you’re stuck.

First, find yourself a font with a suitable license. I use dafont.com, a great resource for finding awesome-looking fonts. You can quickly find free fonts that you can use in your application at no cost; however, if you find a premium font you like, you may be able to license it. In this example, I am going to use a free font titled HollywoodHills.ttf. You can download a copy yourself if you wish to follow along.

FontSample

When searching for suitable fonts, it’s worth remembering that iOS only supports TTF and OTF. This shouldn’t be a problem as most fonts available online come in these two formats.

Add the font

You should add the font to your project by either dragging and dropping it to a folder or right clicking and selecting ‘Add existing file.’ In this example, I have added the font to the Resources folder. You can, of course, add the font to any folder—including the root directory if you so choose.

Once you’ve added the font, you should then right click it and select the ‘Properties’ menu option. You will need to change the build property ‘Copy to output directory’ to ‘Always copy.’ If you forget to do this, you will get a null exception error when trying to reference the font at runtime. This will cause your App to crash.

fontProperties

Highlighted property for clarity

Info.plist

The next step is to tell iOS where your custom font is stored. iOS will load these fonts at startup, so it pays to use custom fonts sparingly—it can slow the startup time of your App.

To tell iOS you are using custom fonts, you should open the Info.plist file and select ‘Source’ at the bottom of the view. This will change the UI to be more inline with Xcode’s property editor.

Once you’ve done this, you should then double click on ‘Add new entry’ and select the ‘Fonts provided by application’ option. It is here that you input the location of the font so that iOS knows where to look when loading the fonts at startup. Because I have put the font in Resources, I can simply type ‘HollywoodHills.ttf’ as the value. If I had put the font in Resources/Fonts, then I would set the value to ‘Fonts/HollywoodHills.ttf’.

Using the custom font

Now comes the interesting part: using the font. Let’s create two labels, one with our custom font and the other with the default. I’ve included code below that will make and place these labels for you. You can copy and paste the following code into your application’s ViewDidLoad method. Try running the app to see how it looks. If you configured your project as I described above, it should work with no issues.

//Get size of screen
var height = UIScreen.MainScreen.Bounds.Height;
var width = UIScreen.MainScreen.Bounds.Width;
//Labels
var lab1 = new UILabel(new RectangleF(0,0, width, height /2));
lab1.Text = "This is some sample text";
lab1.Font = UIFont.FromName("HollywoodHills", 20f);
this.Add(lab1);
var lab2 = new UILabel(new RectangleF(0,height /2, width, height /2));
lab2.Text = "This is some more sample text";
this.Add(lab2);

When you run your App, you will now see that the top label uses the custom font you downloaded from Dafont. It’s as easy as that. If you are having problems, you should double-check that you have selected the ‘Always copy’ build property for the font and that the path is correct in the Info.plist.

I hope you enjoy using custom fonts in Apps as much as I have.

2013 Unity Awards Open Nominations is umm… Open

It’s that time of year again! With Unite 2013 fast approaching in Vancouver, it’s time to start thinking about the 2013 Unity Awards as well. The ceremony will take place at the Vancouver Convention Centre this year on August 29. If you’re interested in nominating a project (game or otherwise) for the Unity Awards, please read the submission guidelines and then follow instructions to complete the submission process. Thanks and look forward to seeing you at the show!

The Unity Awards: What are they?

Each year, we hold awards for our global developer community in several different categories in order to recognize the most impressive games and other projects being made using Unity. The categories this year include:

  • Best 3D Visual Experience – Submissions for this category will be judged based on artistic merit including thematic and stylistic cohesion, creativity, and/or technical skill.
  • Best 2D Visual Experience – Submissions for this category will be judged based on artistic merit including thematic and stylistic cohesion, creativity, and/or technical skill.
  • Best Gameplay – Intuitive control, innovation, creativity, complexity, and fun are what make games enjoyable and entertaining–we’re looking for games that excel in one or all of these areas.
  • Best VizSim Project – Unity projects come in all shapes and sizes; this year we’re looking for projects that have some real world grounded applications for visualization and simulation.
  • Best Non-game Project – Unity-authored products that fall outside of games including projects such as art, advertisement, interactive books and comics, digital toys, interactive physical installations, and informational programs will want to submit for this award.
  • Best Student Project – This award is for projects worked on by students currently being completed as part of the curriculum of an educational institution. Projects will be judged based on creativity, technical merit, and overall artistic cohesion among graphics, sound, and presentation.
  • Technical Achievement – Any project that provides an excellent example of technical excellence in Unity including but not limited to graphics, scripting, UI, and/or sound.
  • Community Choice – This category will be voted on at a later date on Unity3d.com by the community of game developers.
  • Golden Cube (best overall) – This award is for the best overall project made with Unity in the last year. Everything from technical achievement and visual styling to sound production and level of fun will be taken into account to choose an overall winner.

Qualifications

Pretty much anyone making games with Unity can submit their projects for consideration in the Unity Awards. There are some simple rules for eligibility that all entrants will need to follow.

  • Only Unity-authored projects are eligible for nomination
  • Projects must have been released from July 1, 2012 to June 30, 2013 to be eligible with the exception of student project submissions which must have been part of the coursework in the 2012-2013 school year.
  • Any projects nominated for previous years of the Unity Awards are ineligible for the 2013 Unity Awards with the exception of projects that were previously student work and have since turned into finished commercial projects.

One thing to note about these rules is that it’s OK to submit a game for consideration even if you aren’t totally sure if it will be ready by the June 30th cut-off. We will be checking to make sure any games being considered for a finalist slot meet all of the criteria first.

What Happens After Submitting a Project for Awards Consideration?

The Awards committee at Unity Technologies will look at each submission using the judging criteria for each category. Six nominees from each category are chosen as finalists and are invited to participate in the Unity Awards ceremony taking place at Unite in Vancouver.

How are Unity Awards Winners Chosen?

Once the finalists have been chosen, all of Unity Technologies employees will be invited to cast their votes on what they consider the best of each category. This is true with the exception of the Community Choice Award, which is chosen by our developer community via a poll on Unity3d.com, which will be posted in July.

Where Do We Submit Projects for Awards Consideration?

Nomination submissions are now open. They will close on June 30 at 12:00am PDT. Simply follow directions and fill out the form located at the following the link:  http://unityawards2013.unityproposals.com/

Make sure to spread the word to those you know that have released projects between July 1, 2012 and June 30, 2013!

Monologue

Monologue is a window into the world, work, and lives of the community members and developers that make up the Mono Project, which is a free cross-platform development environment used primarily on Linux.

If you would rather follow Monologue using a newsreader, we provide the following feed:

RSS 2.0 Feed

Monologue is powered by Mono and the Monologue software.

Bloggers