<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Silent Kraken &#187; GameDev</title>
	<atom:link href="http://www.blog.silentkraken.com/tag/gamedev/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.blog.silentkraken.com</link>
	<description>Game development tips and tricks</description>
	<lastBuildDate>Sat, 28 Jan 2012 20:14:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Manager systems for Unity3d, a new approach</title>
		<link>http://www.blog.silentkraken.com/2010/06/22/unity3d-manager-systems/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.blog.silentkraken.com/2010/06/22/unity3d-manager-systems/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 21:35:24 +0000</pubDate>
		<dc:creator>Daniel Rodríguez</dc:creator>
				<category><![CDATA[Game development]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[GameDev]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Unity3d]]></category>

		<guid isPermaLink="false">http://www.blog.silentkraken.com/?p=173</guid>
		<description><![CDATA[Tutorial on how to create manager systems for Unity3d <a href="http://www.blog.silentkraken.com/2010/06/22/unity3d-manager-systems/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.blog.silentkraken.com%2F2010%2F06%2F22%2Funity3d-manager-systems%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.blog.silentkraken.com%2F2010%2F06%2F22%2Funity3d-manager-systems%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>As I said on a previous post, it is very common for Unity3d developers to come up with the idea of a game object in their scenes that will hold components that will act as <a href="http://en.wikipedia.org/wiki/Singleton_pattern">singletons</a>, right?</p>
<p>Normally we want this game object to be there from the beginning, make some initialization (such as finding entities in the scene) and then be ready to handle our requests. Also, we would like this game object to be persistent so we would like to call <em><a href="http://unity3d.com/support/documentation/ScriptReference/Object.DontDestroyOnLoad.html">DontDestoyOnLoad(this);</a></em> on it. This approach works very well if you have a single scene in your project as everything is running on the same context, but if you have multiple scenes, say, multiple levels in your game, things can get complicated. Suppose you have a component attached which purpose is to find the most used entities in your game (such as the player) and cache them, allowing other components to access them with a static variable. The problem with multiple scenes arises if you change scene and don&#8217;t update the references to your cached game objects.</p>
<p>I&#8217;ve using a slightly different approach that threats the whole system as a FSM (<a href="http://en.wikipedia.org/wiki/Finite-state_machine">Finite State Machine</a>). Let me exaplain:</p>
<p>The first idea is to create a static class that will hold a reference to any manager we have in the game, for example:</p>
<pre class="brush: csharp; title: ; notranslate">
[RequireComponent(typeof(GameManager))]
[RequireComponent(typeof(ScreenManager))]
[RequireComponent(typeof(AudioManager))]
[RequireComponent(typeof(MissionManager))]
public class Managers : MonoBehaviour
{
    private static GameManager gameManager;
    public static GameManager Game
    {
        get { return gameManager; }
    }

    private static ScreenManager screenManager;
    public static ScreenManager Screen
    {
        get { return screenManager; }
    }

    private static AudioManager audioManager;
    public static AudioManager Audio
    {
        get { return audioManager; }
    }

    private static MissionManager missionManager;
    public static MissionManager Mission
    {
        get { return missionManager; }
    }

	// Use this for initialization
	void Awake ()
    {
        //Find the references
        gameManager = GetComponent&amp;amp;lt;GameManager&amp;amp;gt;();
        screenManager = GetComponent&amp;amp;lt;ScreenManager&amp;amp;gt;();
        audioManager = GetComponent&amp;amp;lt;AudioManager&amp;amp;gt;();
        missionManager = GetComponent&amp;amp;lt;MissionManager&amp;amp;gt;();

        //Make this game object persistant
        DontDestroyOnLoad(gameObject);
	}
}
</pre>
<p>As you can see, we have a bunch of things that will let us access those Managers easily, as easy as:</p>
<pre class="brush: csharp; title: ; notranslate">Managers.Audio.Play(transform.position, clip); </pre>
<p>Obviously, those components (like the AudioManager) must be attached to this game object in order for this to work. The idea behind this managers is that they will be &#8220;always ready&#8221;, like a system service, and that they don&#8217;t have any dependencies with any particular scene. For example, the AudioManager is able to play sounds in any scene and situation.</p>
<p>There are other types of managers, those that rely on a particular scene or state in order to work. There is also the problem of the global game state. Introducing your awesome GameManager class:</p>
<pre class="brush: csharp; title: ; notranslate">
public class GameManager : MonoBehaviour
{
    private GameState currentState;
    public GameState State
    {
        get { return currentState; }
    }

	//Changes the current game state
	public void SetState(System.Type newStateType)
    {
        if (currentState != null)
        {
            currentState.OnDeactivate();
        }

        currentState = GetComponentInChildren(newStateType) as GameState;
        if (currentState != null)
        {
            currentState.OnActivate();
        }
	}

    void Update()
    {
        if (currentState != null)
        {
            currentState.OnUpdate();
        }
    }

    void Start()
    {
        SetState(typeof(GameplayState));
    }
}
</pre>
<p>And it&#8217;s loyal companion, the GameState abstract class:</p>
<pre class="brush: csharp; title: ; notranslate">
public abstract class GameState : MonoBehaviour
{
    public abstract void OnActivate();
    public abstract void OnDeactivate();
    public abstract void OnUpdate();
}
</pre>
<p>Those classes make up a simple FSM system for the different game states in your game (paused, playing, menu screen, etc.). You should inherit the GameState class to provide your custom states. A state is also a component attached to a game object that is responsible for activating/deactivating each game manager that is dependent on that particular state. For organization, I suggest you attach your states to game objects with the name of the state that are childs of the manager game object, like this:</p>
<div id="attachment_189" class="wp-caption aligncenter" style="width: 331px"><a href="http://www.blog.silentkraken.com/wp-content/uploads/2010/05/ManagersExample1.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="size-full wp-image-189" title="Manager object distribution" src="http://www.blog.silentkraken.com/wp-content/uploads/2010/05/ManagersExample1.jpg" alt="Manager object distribution" width="321" height="93" /></a><p class="wp-caption-text">Manager object distribution</p></div>
<p>This way, you can have sub-managers attached to this child objects and everything is perfectly organized.</p>
<p>Hope you find this useful. I will post more information about this soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blog.silentkraken.com/2010/06/22/unity3d-manager-systems/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Game mechanics design by Will Wright</title>
		<link>http://www.blog.silentkraken.com/2010/04/15/game-mechanics-design-by-will-wright/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.blog.silentkraken.com/2010/04/15/game-mechanics-design-by-will-wright/#comments</comments>
		<pubDate>Thu, 15 Apr 2010 22:34:40 +0000</pubDate>
		<dc:creator>Daniel Rodríguez</dc:creator>
				<category><![CDATA[Game design]]></category>
		<category><![CDATA[Game development]]></category>
		<category><![CDATA[GameDesign]]></category>
		<category><![CDATA[GameDev]]></category>
		<category><![CDATA[GameMechanics]]></category>
		<category><![CDATA[Video]]></category>

		<guid isPermaLink="false">http://www.blog.silentkraken.com/?p=168</guid>
		<description><![CDATA[Some time ago I found this amazing video on game mechanics design by Will Wright, creator of The Sims franchise, SimCity and Spore, talks about game design principles. I like this because it really gave a lot of perspective in my game &#8230; <a href="http://www.blog.silentkraken.com/2010/04/15/game-mechanics-design-by-will-wright/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.blog.silentkraken.com%2F2010%2F04%2F15%2Fgame-mechanics-design-by-will-wright%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.blog.silentkraken.com%2F2010%2F04%2F15%2Fgame-mechanics-design-by-will-wright%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Some time ago I found this amazing video on game mechanics design by <a href="http://en.wikipedia.org/wiki/Will_Wright_(game_designer)">Will Wright</a>, creator of The Sims franchise, SimCity and Spore, talks about game design principles. I like this because it really gave a lot of perspective in my game design experience. I like the way he connects the concepts and the way he uses metaphors to explain them. In particular, the definition of the possibility space for the player helped me as I started involving myself with game design.</p>
<p><object width="640" height="505"><param name="movie" value="http://www.youtube.com/v/CdgQyq3hEPo&#038;hl=en_US&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/CdgQyq3hEPo&#038;hl=en_US&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="505"></embed></object></p>
<p>I think it&#8217;s worth sharing, and by the way, I really think this video is much much better that the <a href="http://www.ted.com/talks/will_wright_makes_toys_that_make_worlds.html">TED talk he gave</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blog.silentkraken.com/2010/04/15/game-mechanics-design-by-will-wright/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Simple AudioManager code for your Unity3d project</title>
		<link>http://www.blog.silentkraken.com/2010/04/06/audiomanager/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.blog.silentkraken.com/2010/04/06/audiomanager/#comments</comments>
		<pubDate>Wed, 07 Apr 2010 05:47:31 +0000</pubDate>
		<dc:creator>Daniel Rodríguez</dc:creator>
				<category><![CDATA[Game development]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Audio]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[GameDev]]></category>
		<category><![CDATA[Release]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Unity3d]]></category>

		<guid isPermaLink="false">http://www.blog.silentkraken.com/?p=161</guid>
		<description><![CDATA[This is a simple component class that I created to help you play sounds in Unity3d. <a href="http://www.blog.silentkraken.com/2010/04/06/audiomanager/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.blog.silentkraken.com%2F2010%2F04%2F06%2Faudiomanager%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.blog.silentkraken.com%2F2010%2F04%2F06%2Faudiomanager%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>You know, sometimes very simple code has to be written again and again by lots of different people to solve the same basic problem. I think playing audio is one of such cases in Unity3d.</p>
<p>You have the audio components: <a href="http://unity3d.com/support/documentation/Components/class-AudioSource.html">AudioSource </a>(attached to your sound emitter) and <a href="http://unity3d.com/support/documentation/Components/class-AudioListener.html">AudioListener </a>(attached to the main camera). Now, the problem is that audio clips are represented by the <a href="http://unity3d.com/support/documentation/Components/class-AudioClip.html">AudioClip </a>class, and each AudioSource can have a single AudioClip playing at the moment. That is sometimes ok, but other times, you want your game object to be able to play a number of different sounds, maybe at the same time (Think of a character playing footsteps sounds and maybe saying something at the same time).</p>
<p>Since it is very natural to have one manager object in your scene acting as a <a href="http://en.wikipedia.org/wiki/Singleton_pattern">singleton</a>, I&#8217;ve written a component that can be attached to such manager. The work of this component is to play almost any sound you want to play in your game. The code is very simple and self explationary.</p>
<pre class="brush: csharp; title: ; notranslate">
// /////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Audio Manager.
//
// This code is release under the MIT licence. It is provided as-is and without any warranty.
//
// Developed by Daniel Rodríguez (Seth Illgard) in April 2010
// http://www.silentkraken.com
//
// /////////////////////////////////////////////////////////////////////////////////////////////////////////

using UnityEngine;
using System.Collections;

public class AudioManager : MonoBehaviour
{
    public AudioSource Play(AudioClip clip, Transform emitter)
    {
        return Play(clip, emitter, 1f, 1f);
    }

    public AudioSource Play(AudioClip clip, Transform emitter, float volume)
    {
        return Play(clip, emitter, volume, 1f);
    }

    /// &lt;summary&gt;
    /// Plays a sound by creating an empty game object with an AudioSource
    /// and attaching it to the given transform (so it moves with the transform). Destroys it after it finished playing.
    /// &lt;/summary&gt;
    /// &lt;param name=&quot;clip&quot;&gt;&lt;/param&gt;
    /// &lt;param name=&quot;emitter&quot;&gt;&lt;/param&gt;
    /// &lt;param name=&quot;volume&quot;&gt;&lt;/param&gt;
    /// &lt;param name=&quot;pitch&quot;&gt;&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    public AudioSource Play(AudioClip clip, Transform emitter, float volume, float pitch)
    {
        //Create an empty game object
        GameObject go = new GameObject (&quot;Audio: &quot; +  clip.name);
        go.transform.position = emitter.position;
        go.transform.parent = emitter;

        //Create the source
        AudioSource source = go.AddComponent&lt;AudioSource&gt;();
        source.clip = clip;
        source.volume = volume;
        source.pitch = pitch;
        source.Play ();
        Destroy (go, clip.length);
        return source;
    }

    public AudioSource Play(AudioClip clip, Vector3 point)
    {
        return Play(clip, point, 1f, 1f);
    }

    public AudioSource Play(AudioClip clip, Vector3 point, float volume)
    {
        return Play(clip, point, volume, 1f);
    }

    /// &lt;summary&gt;
    /// Plays a sound at the given point in space by creating an empty game object with an AudioSource
    /// in that place and destroys it after it finished playing.
    /// &lt;/summary&gt;
    /// &lt;param name=&quot;clip&quot;&gt;&lt;/param&gt;
    /// &lt;param name=&quot;point&quot;&gt;&lt;/param&gt;
    /// &lt;param name=&quot;volume&quot;&gt;&lt;/param&gt;
    /// &lt;param name=&quot;pitch&quot;&gt;&lt;/param&gt;
    /// &lt;returns&gt;&lt;/returns&gt;
    public AudioSource Play(AudioClip clip, Vector3 point, float volume, float pitch)
    {
        //Create an empty game object
        GameObject go = new GameObject(&quot;Audio: &quot; + clip.name);
        go.transform.position = point;

        //Create the source
        AudioSource source = go.AddComponent&lt;AudioSource&gt;();
        source.clip = clip;
        source.volume = volume;
        source.pitch = pitch;
        source.Play();
        Destroy(go, clip.length);
        return source;
    }
}
</pre>
<p>As you can see, this class is basically 6 overloads for the Play function. Basically we have two types: the type that takes a transform (emitter) as parameter and the type that takes a Vector3. The only difference is that if you provide a point (Vector3), the sound will be played there, but if you provide an emitter, the sound will be played where the emitter is, but will also follow the emitter as it moves (e.g. the engine of a passing car).<br />
Hope you find it useful!<br />
By the way, I&#8217;m planning on creating on tutorial on how to create Manager systems. By that I don&#8217;t mean simple components like this but rather the best way I have found to create such a Singleton object with those components, and how to integrate that with your game when you have multiple game states and game scenes (with potentially different managers). More on that soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blog.silentkraken.com/2010/04/06/audiomanager/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Are you going to become a Game developer?</title>
		<link>http://www.blog.silentkraken.com/2010/03/31/are-you-going-to-become-a-game-developer/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.blog.silentkraken.com/2010/03/31/are-you-going-to-become-a-game-developer/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 15:57:28 +0000</pubDate>
		<dc:creator>Daniel Rodríguez</dc:creator>
				<category><![CDATA[Game development]]></category>
		<category><![CDATA[GameDev]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://www.blog.silentkraken.com/?p=156</guid>
		<description><![CDATA[This is an post I made some time ago on my personal blog, and I wanted to share it here: Are you a going to become a game developer??? I want t be a game developer. As simple that statement &#8230; <a href="http://www.blog.silentkraken.com/2010/03/31/are-you-going-to-become-a-game-developer/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.blog.silentkraken.com%2F2010%2F03%2F31%2Fare-you-going-to-become-a-game-developer%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.blog.silentkraken.com%2F2010%2F03%2F31%2Fare-you-going-to-become-a-game-developer%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>This is an post I made some time ago on my <a href="http://sethillgard.blogspot.com/">personal blog</a>, and I wanted to share it here:</p>
<p>Are you a going to become a game developer???<br />
I want t be a game developer.</p>
<p>As simple that statement is, there are a lot of issues involved:</p>
<ul>
<li>Am I an artist? A coder? A game designer?</li>
<li>What kind of games do I want to develop? Casual games? Hardcore games? Mobile games?</li>
<li>How much experience do I have? A year? A released AAA title? Several flash games on the net?</li>
<li>Do I have a demo reel? Can I show some of my work in a released title?</li>
<li>These 4 simple questions should be answered to truly fulfill the minimum expectations of a gamedev studio:</li>
</ul>
<p><strong>Am I an artist? A coder? A game designer?</strong></p>
<p>You need to be one of these, like it or not. Conceptual artists are ok if you are very talented. Sound designers, well, we can count them as artists. These 3 are the main branches of the development of a game: Art, Technology and Game design, and you need to be talented in one of these 3. If you just like to play video games, well, go play somewhere else.</p>
<p><strong>What kind of games do I want to develop? Casual games? Hardcore games? Mobile games?</strong></p>
<p>Casual games? Ok, go grab <a href="http://unity3d.com/">Unity3d </a>, Flash, or even <a href="http://dxstudio.com/">DXStudio </a>.<br />
Hardcore games? Learn every single dark corner of C++ and 3D libraries, or become the god of texturing or rig animation. You will need to SPECIALIZE! That&#8217;s it, become a superhero of whaterver you want to be. Be the best out there.</p>
<p><strong>How much experience do I have? A year? A released AAA title? Several flash games on the net?</strong></p>
<p>Experience is a huge deal. Every studio out there is asking for talented people with 2 years of experience in the industry. How are you supposed to do that? Make casual games! Start small and grow up. Find some friends and start modding other games (Valve&#8217;s games are great for this). If you are a coder, write some 3d or AI libraries (whatever you like), show the world what you can do.</p>
<p><strong>Do I have a demo reel? Can I show some of my work in a released title?</strong></p>
<p>You&#8217;ll need one of these. The idea is to FINISH SOMETHING! If you are building 35 games at the same time on not a simple one is finished, nobody will want to hire you. If you are an artist, pack you stuff together and build a sample video (demo reel). If you are a coder, make a COMPLETE game. Even simple games like a tetris remake counts, but make sure it is complete. Studios will want to hire people that are capable of finishing things. If you don&#8217;t believe me , just go and check out the <a href="http://en.wikipedia.org/wiki/Duke_Nukem_Forever">Duke Nukem Forever story</a> and you will understand why this point its so important.</p>
<p>Hope this tips help someone.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blog.silentkraken.com/2010/03/31/are-you-going-to-become-a-game-developer/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Introduction to Game Development tips by Walter Rotenberry</title>
		<link>http://www.blog.silentkraken.com/2010/02/15/introduction-to-game-development-tips-by-walter-rotenberry/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.blog.silentkraken.com/2010/02/15/introduction-to-game-development-tips-by-walter-rotenberry/#comments</comments>
		<pubDate>Mon, 15 Feb 2010 22:20:17 +0000</pubDate>
		<dc:creator>Daniel Rodríguez</dc:creator>
				<category><![CDATA[Game development]]></category>
		<category><![CDATA[GameDev]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://www.blog.silentkraken.com/?p=128</guid>
		<description><![CDATA[Last month Walter Rottenberry came to Guadalajara to teach us about the very basics of game development. As usual, let me share my notes: AI: Tips from Steve Rabin in &#8220;Game Programming Gems 2&#8243; Use event driven behavior rather than &#8230; <a href="http://www.blog.silentkraken.com/2010/02/15/introduction-to-game-development-tips-by-walter-rotenberry/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.blog.silentkraken.com%2F2010%2F02%2F15%2Fintroduction-to-game-development-tips-by-walter-rotenberry%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.blog.silentkraken.com%2F2010%2F02%2F15%2Fintroduction-to-game-development-tips-by-walter-rotenberry%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Last month Walter Rottenberry came to Guadalajara to teach us about the very basics of game development. As usual, let me share my notes:</p>
<p>AI:</p>
<ul>
<li>Tips from Steve Rabin in &#8220;Game Programming Gems 2&#8243;</li>
<li>Use event driven behavior rather than polling</li>
<li>Reduce redundant calculations</li>
<li>Centralize cooperation with managers</li>
<li>Run the AI less often</li>
<li>Distribute the processing over several frames</li>
<li>Employ AI LODs</li>
<li>Solve only part of the problem</li>
<li>Do the hard work offline</li>
<li>Use emergent behavior to avoid scripting</li>
<li>Amortize costs with continuous bookkeeping</li>
<li>Rethink the problem</li>
</ul>
<p>Game Theory:</p>
<ul>
<li>Prisoner dilemma</li>
<li>Types of challenges</li>
<li>Implicit vs explicit</li>
<li>Perfect vs imperfect information</li>
<li>Intrinsic vs extrinsic knowledge</li>
<li>Pattern recognition</li>
</ul>
<p><strong> Level design:</strong></p>
<p>Level designer responsibilities:</p>
<ul>
<li>Create terrain</li>
<li>Create the rooms</li>
<li>Add props</li>
<li>Add triggers</li>
<li>Look great</li>
<li>Make it work</li>
</ul>
<p><strong> Technical limitations:</strong></p>
<ul>
<li>The platform</li>
<li>Affects how the level should be built (not the level itself)</li>
</ul>
<p>Main factors:</p>
<ul>
<li>Memory</li>
<li>Processing power and frame rate</li>
<li>Level performance</li>
<li>Polycount</li>
<li>Lighting</li>
<li>AI</li>
<li>Media format</li>
<li>Target and minimum specifications</li>
</ul>
<p>GPUs take care of the eye candy in the game<br />
Special effects consume a lot of processing power instead of RAM<br />
Performance:</p>
<ul>
<li>Fast moving games require faster frame rate</li>
<li>Level designer should be aware of strain on GPU and not frustrate for that</li>
</ul>
<p>Polycount:</p>
<ul>
<li>What really matters is  the number of polygons seen on the screen at any given moment</li>
<li>Contributors
<ul>
<li>Too many characters in a single space</li>
<li>Special effects (smoke, falling leaves, fire, a black hole, etc)</li>
<li>Emmitters need to be watched closely</li>
</ul>
</li>
<li>Use LODs (Level of detail)
<ul>
<li>Characters: 3 LODs</li>
<li>Objects: 2-3 LODs</li>
<li>Environments: distances vary depending on level and game</li>
</ul>
</li>
</ul>
<p>Lighting:</p>
<ul>
<li>Lights and shadows both pulls on the GPU</li>
<li>Dynamic lights are cool but expensive</li>
<li>Traditionally had static lights</li>
<li>Lights and shadows can be baked into textures</li>
</ul>
<p>Game metrics:</p>
<ul>
<li>Happens after the player metrics are known</li>
<li>Properties of the main character are the biggest factor</li>
<li>Examples:
<ul>
<li>Height and width</li>
<li>Walk and run speed</li>
<li>Jump distance</li>
<li>Jump height</li>
<li>Interaction distance (how far the player needs to be from an interactuable object to interact with it)</li>
</ul>
</li>
<li>Character metrics
<ul>
<li>The visual size is different from the collision size</li>
<li>Use collision volumes</li>
<li>Make doors and corridors slightly bigger than realistic proportions</li>
</ul>
</li>
<li>Warning: Beware the game designer who gives you a ballpark figure for vital game data</li>
<li>Get hard data before creating the level</li>
<li>Level designer should decide the movement speed and jump metrics</li>
</ul>
<p>Tips:</p>
<ul>
<li>FaceFX for facial animation</li>
<li>Use cell diagrams (also called bubble diagrams) for gameplay</li>
</ul>
<p>Thank you Walter. This was very useful.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blog.silentkraken.com/2010/02/15/introduction-to-game-development-tips-by-walter-rotenberry/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>TransformUtilities</title>
		<link>http://www.blog.silentkraken.com/2010/02/06/transformutilities/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.blog.silentkraken.com/2010/02/06/transformutilities/#comments</comments>
		<pubDate>Sun, 07 Feb 2010 03:36:02 +0000</pubDate>
		<dc:creator>Daniel Rodríguez</dc:creator>
				<category><![CDATA[Game development]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[GameDev]]></category>
		<category><![CDATA[Release]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[Unity3d]]></category>

		<guid isPermaLink="false">http://www.blog.silentkraken.com/?p=121</guid>
		<description><![CDATA[Release of the TransformUtilities tools for Unity3d. <a href="http://www.blog.silentkraken.com/2010/02/06/transformutilities/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.blog.silentkraken.com%2F2010%2F02%2F06%2Ftransformutilities%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.blog.silentkraken.com%2F2010%2F02%2F06%2Ftransformutilities%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<div id="attachment_149" class="wp-caption alignright" style="width: 269px"><a href="http://www.blog.silentkraken.com/wp-content/uploads/2010/02/TransformUtilitiesWindow.jpg#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed"><img class="size-full wp-image-149 " title="TransformUtilitiesWindow" src="http://www.blog.silentkraken.com/wp-content/uploads/2010/02/TransformUtilitiesWindow.jpg" alt="" width="259" height="213" /></a><p class="wp-caption-text">This is how the tool looks like</p></div>
<p>Hello. I&#8217;ve been working on a set of four tools to aid in the Unity3d development. After using Unity for a while I encountered the classic problem of needing to copy the position of an object over and over. This led me to create the &#8220;Copy&#8221; tool. I&#8217;ve found a <a href="http://www.unifycommunity.com/wiki/index.php?title=CopyTransform">similar script</a> on the Unify community, but I wanted to extend the tool. It is now possible to copy position, rotation and scale of any axis you want. Also, the values apply to all objects selected in the scene.</p>
<p>After that, and inspired by the tools I found on the Gamebryo Lightspeed editor, I created the Randomize and Add Noise tools. Those tools work almost the same, the randomize the position, rotation of scale of any object selected (or all objects selected). The difference is that while Randomize sets the absolute values for position, rotation or scale, Add noise adds a delta to the current value of the transform. This is useful for example to randomize the Y rotation of all the trees in your level, or to make a bunch of boxes look more natural by not being perfectly aligned.</p>
<p>Finally, after been learning Autodesk 3ds Max, I created the Align tool inspired by a tool in that software. It basically takes a source transform, just like the Copy tool, then uses it&#8217;s collider and the collider of the object (or objects) selected to align it. You can align for example, the minimum point of your selection with the maximum point of your source (what you are aligning to) to place an object over another. It let&#8217;s you align using the minimum point, maximum point, the center of the object or the pivot point on both the selection and the source. You can align on all 3 axis.</p>
<p>To use these tool, all you need to do is download the script file, and add it into a folder named Editor in your project&#8217;s Asset folder. Once compiled by Unity you find the new functionality in Window -&gt; TransformUtilities, or simply press Ctrl+t (Cmd+t for Mac users)</p>
<p>Developed by Daniel Rodríguez (Seth Illgard) in January 2010</p>
<p><strong><a href="http://files.silentkraken.com/tools/unity3d/TransformUtilities/TransformUtilitiesWindow.cs">Download TransformUtilities!</a></strong></p>
<p>Hope you find them useful, and please let me know how can I improve theses tools.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blog.silentkraken.com/2010/02/06/transformutilities/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Coroutines in Unity3d (C# version)</title>
		<link>http://www.blog.silentkraken.com/2010/01/23/coroutines-in-unity3d-c-version/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.blog.silentkraken.com/2010/01/23/coroutines-in-unity3d-c-version/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 00:04:15 +0000</pubDate>
		<dc:creator>Daniel Rodríguez</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Coroutines]]></category>
		<category><![CDATA[GameDev]]></category>
		<category><![CDATA[Unity3d]]></category>

		<guid isPermaLink="false">http://www.blog.silentkraken.com/?p=106</guid>
		<description><![CDATA[Coroutines in C# work the same way that they do in Javascript (UnityScript), the only difference is that they require more typing (they have a slightly more complicated syntax). You should see the blog post on Javascript coroutines first. Here, &#8230; <a href="http://www.blog.silentkraken.com/2010/01/23/coroutines-in-unity3d-c-version/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.blog.silentkraken.com%2F2010%2F01%2F23%2Fcoroutines-in-unity3d-c-version%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.blog.silentkraken.com%2F2010%2F01%2F23%2Fcoroutines-in-unity3d-c-version%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Coroutines in C# work the same way that they do in Javascript (UnityScript), the only difference is that they require more typing (they have a slightly more complicated syntax). You should see the <a href="http://www.blog.silentkraken.com/2010/01/22/coroutines-in-unity3d/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">blog post on Javascript coroutines first</a>.</p>
<p>Here, I present the differences:</p>
<p><strong>Coroutines must have the <code>IEnumerator </code>return type:</strong></p>
<pre class="brush: csharp; title: ; notranslate">
IEnumerator MyCoroutine()
{
	//This is a coroutine
}
</pre>
<p><strong>To invoke a coroutine you must do it using the <code>StartCoroutine</code> method:</strong></p>
<pre class="brush: csharp; title: ; notranslate">
public class MyScript : MonoBehaviour
{
    void Start()
    {
		StartCoroutine(MyCoroutine());
    }

    IEnumerator MyCoroutine()
    {
        //This is a coroutine
    }
}
</pre>
<p><strong>The <code>yield</code> statement becomes <code>yield return</code> in C# :</strong></p>
<pre class="brush: csharp; title: ; notranslate">
IEnumerator MyCoroutine()
{
    DoSomething();
    yield return 0;	//Wait one frame, the 0 here is only because we need to return an IEnumerable
    DoSomethingElse();
}
</pre>
<p>Remember that we need to return an <code>IEnumerable</code>, so the Javascript <code>yield;</code> becomes <code>yield return 0;</code> in C#</p>
<p>Also, since C# requires you to use the <code>new</code> operator to create objects, if you want to use <code>WaitForSeconds </code> you have to use it like this:</p>
<pre class="brush: csharp; title: ; notranslate">
IEnumerator MyCoroutine()
{
    DoSomething();
    yield return new WaitForSeconds(2.0f);	//Wait 2 seconds
    DoSomethingElse();
}
</pre>
<p>Happy coroutining <img src='http://www.blog.silentkraken.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.blog.silentkraken.com/2010/01/23/coroutines-in-unity3d-c-version/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Game development facts and tips</title>
		<link>http://www.blog.silentkraken.com/2009/11/19/game-development-facts-and-tips/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.blog.silentkraken.com/2009/11/19/game-development-facts-and-tips/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 02:16:20 +0000</pubDate>
		<dc:creator>Daniel Rodríguez</dc:creator>
				<category><![CDATA[Game development]]></category>
		<category><![CDATA[GameDev]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://www.blog.silentkraken.com/?p=78</guid>
		<description><![CDATA[Last month I had the pleasure of finding a new friend in the gamedev community: Ian Masters, a senior game programmer at Sidhe Interactive, creators of the Speed Racer game for Nintendo Wii and Sony PlayStation 2. While he was in &#8230; <a href="http://www.blog.silentkraken.com/2009/11/19/game-development-facts-and-tips/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.blog.silentkraken.com%2F2009%2F11%2F19%2Fgame-development-facts-and-tips%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.blog.silentkraken.com%2F2009%2F11%2F19%2Fgame-development-facts-and-tips%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Last month I had the pleasure of finding a new friend in the gamedev community: <a href="http://www.linkedin.com/in/mysticcoder">Ian Masters</a>, a senior game programmer at <strong><a href="http://www.sidhe.co.nz/">Sidhe Interactive</a>, creators of the Speed Racer game for Nintendo Wii and Sony PlayStation 2.</strong></p>
<p>While he was in town I managed to compile a list of game development facts and tips. Here they are:</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Programming:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Everybody creates their own internal technology to build games. They modify engines and create frameworks for internal use.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">The technical director is the responsable of selecting technology like the game engine.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Developing a game engine from scratch could take years and it&#8217;s not recommended.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">The most used languages in game development are : C++, Lua and Python.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">It&#8217;s common to have a prototyping team.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Use source control (SVN, mercurial, etc.)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Have all your projects into a solution, prefer that to link against static libraries (including third party code).</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Have your engine&#8217;s source code in your source control system so you can modify it and the changes will propagate.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">QA:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Unit testing is very important (specially for math libraries and core functions).</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Regression testing is important too.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">QA team is different from playtesting. QA test QA, playtesters test fun.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">No QA guys in multidisciplinary teams.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Art:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Conceptual art should be delivered as soon as possible before programming start (at least a month ahead).</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Work on iterations.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Artists hate naming conventions.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">It&#8217;s not easy to convince the artists to follow naming conventions (normally you need a producer to talk to them).</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Having a lead artist who follows naming conventions is crucial.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Try to integrate audio as soon as possible. Audio is not a luxury.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Post effects are often decided between the post effects coder and the art director.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Camera effects are often decided between the camera scripters and the designers.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Have metrics with the export tools (poly counts, texture sizes, bone count, etc)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Should present a visual target.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Design:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">They can&#8217;t account for everything.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Design document should be as detailed as possible.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Design document should be a live document.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">They define tunable properties.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Normally use XML files for tunable properties (exported from spreadsheets for extra awesomeness).</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">There are co-designers (scripters).</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Production:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Producer&#8217;s work is to assure work is being done and cycles are running smoothly.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Wikis are awesome.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">You can manage a whole project documentation using exclusively a wiki.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Procedures, knowledge and project management all fit into a wiki.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Multidisciplinary teams are a great way to work.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Have a list of features that need to be tested on the prototype.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Recommendations:</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Scrum is the way to go.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Use Scrum properly.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Scrum meetings in the mornings.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Put scrum plans on the wiki.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Create tickets on Trac or a similar tool.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Keep things visible and transparent.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Read a lot. Be proactive and an active learner and problem solver.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Try to work as close as possible with artists, programmers and designers.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">You need a published title to get into the industry. To get that title you need to be in the industry. Indie titles are a good way to break into it.</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Prototype as soon as possible.</div>
<p>Programming:</p>
<ul>
<li>Everybody creates their own internal technology to build games. They modify engines and create frameworks for internal use.</li>
<li>The technical director is the responsable of selecting technology like the game engine.</li>
<li>Developing a game engine from scratch could take years and it&#8217;s not recommended.</li>
<li>The most used languages in game development are : C++, Lua and Python.</li>
<li>It&#8217;s common to have a prototyping team.</li>
<li>Use source control (SVN, mercurial, etc.)</li>
<li>Have all your projects into a solution, prefer that to link against static libraries (including third party code).</li>
<li>Have your engine&#8217;s source code in your source control system so you can modify it and the changes will propagate.</li>
</ul>
<p>QA:</p>
<ul>
<li>Unit testing is very important (specially for math libraries and core functions).</li>
<li>Regression testing is important too.</li>
<li>QA team is different from playtesting. QA test QA, playtesters test fun.</li>
<li>No QA guys in multidisciplinary teams.</li>
</ul>
<p>Art:</p>
<ul>
<li>Conceptual art should be delivered as soon as possible before programming start (at least a month ahead).</li>
<li>Work on iterations.</li>
<li>Artists hate naming conventions.</li>
<li>It&#8217;s not easy to convince the artists to follow naming conventions (normally you need a producer to talk to them).</li>
<li>Having a lead artist who follows naming conventions is crucial.</li>
<li>Try to integrate audio as soon as possible. Audio is not a luxury.</li>
<li>Post effects are often decided between the post effects coder and the art director.</li>
<li>Camera effects are often decided between the camera scripters and the designers.</li>
<li>Have metrics with the export tools (poly counts, texture sizes, bone count, etc)</li>
<li>Should present a visual target.</li>
</ul>
<p>Design:</p>
<ul>
<li>They can&#8217;t account for everything.</li>
<li>Design document should be as detailed as possible.</li>
<li>Design document should be a live document.</li>
<li>They define tunable properties.</li>
<li>Normally use XML files for tunable properties (exported from spreadsheets for extra awesomeness).</li>
<li>There are co-designers (scripters).</li>
</ul>
<p>Production:</p>
<ul>
<li>Producer&#8217;s work is to assure work is being done and cycles are running smoothly.</li>
<li>Wikis are awesome.</li>
<li>You can manage a whole project documentation using exclusively a wiki.</li>
<li>Procedures, knowledge and project management all fit into a wiki.</li>
<li>Multidisciplinary teams are a great way to work.</li>
<li>Have a list of features that need to be tested on the prototype.</li>
</ul>
<p>Recommendations:</p>
<ul>
<li>Scrum is the way to go.</li>
<li>Use Scrum properly.</li>
<li>Scrum meetings in the mornings.</li>
<li>Put scrum plans on the wiki.</li>
<li>Create tickets on Trac or a similar tool.</li>
<li>Keep things visible and transparent.</li>
<li>Read a lot. Be proactive and an active learner and problem solver.</li>
<li>Try to work as close as possible with artists, programmers and designers.</li>
<li>You need a published title to get into the industry. To get that title you need to be in the industry. Indie titles are a good way to break into it.</li>
<li>Prototype as soon as possible.</li>
</ul>
<p>Hope that helps, and a big &#8220;Thank you&#8221; to Ian for his time with us. I learned a lot.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blog.silentkraken.com/2009/11/19/game-development-facts-and-tips/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Introduction to Game Development and Unity3d</title>
		<link>http://www.blog.silentkraken.com/2009/11/19/introduction-to-game-development-and-unity3d/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.blog.silentkraken.com/2009/11/19/introduction-to-game-development-and-unity3d/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 01:41:39 +0000</pubDate>
		<dc:creator>Daniel Rodríguez</dc:creator>
				<category><![CDATA[Game development]]></category>
		<category><![CDATA[GameDev]]></category>
		<category><![CDATA[Unity3d]]></category>

		<guid isPermaLink="false">http://www.blog.silentkraken.com/?p=71</guid>
		<description><![CDATA[Today I was invited to the UVM University to give a workshop on game development using Unity3d. For that purpose I created a small presentation that you can find in pdf format here: Introduction to game development and Unity3d. It is a &#8230; <a href="http://www.blog.silentkraken.com/2009/11/19/introduction-to-game-development-and-unity3d/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.blog.silentkraken.com%2F2009%2F11%2F19%2Fintroduction-to-game-development-and-unity3d%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.blog.silentkraken.com%2F2009%2F11%2F19%2Fintroduction-to-game-development-and-unity3d%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Today I was invited to the <a href="http://www.uvmnet.edu/">UVM University</a> to give a workshop on game development using Unity3d. For that purpose I created a small presentation that you can find in pdf format here: <a rel="attachment wp-att-72" href="http://www.blog.silentkraken.com/2009/11/19/introduction-to-game-development-and-unity3d/introduction-to-game-development-and-unity3d/#utm_source=feed&amp;utm_medium=feed&amp;utm_campaign=feed">Introduction to game development and Unity3d</a>.</p>
<p>It is a very basic introduction, but I hope you like it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blog.silentkraken.com/2009/11/19/introduction-to-game-development-and-unity3d/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mixins in game development</title>
		<link>http://www.blog.silentkraken.com/2009/10/02/mixins-in-game-development/#utm_source=feed&#038;utm_medium=feed&#038;utm_campaign=feed</link>
		<comments>http://www.blog.silentkraken.com/2009/10/02/mixins-in-game-development/#comments</comments>
		<pubDate>Fri, 02 Oct 2009 21:30:24 +0000</pubDate>
		<dc:creator>Daniel Rodríguez</dc:creator>
				<category><![CDATA[Game development]]></category>
		<category><![CDATA[GameDev]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.blog.silentkraken.com/?p=32</guid>
		<description><![CDATA[Programmers tend to think in the Object Oriented Programming paradigm all the time. We create complex class hiercharies that describe every single entity on the game. Thats what we learn at school, we are programmed (deeply into our firmware) to &#8230; <a href="http://www.blog.silentkraken.com/2009/10/02/mixins-in-game-development/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.blog.silentkraken.com%2F2009%2F10%2F02%2Fmixins-in-game-development%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.blog.silentkraken.com%2F2009%2F10%2F02%2Fmixins-in-game-development%2F&amp;style=normal&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Programmers tend to think in the Object Oriented Programming paradigm all the time. We create complex class hiercharies that describe every single entity on the game. Thats what we learn at school, we are programmed (deeply into our firmware) to do that, but there is a whole world of different pradigms and approaches we can use, and the scripting languages are bringing the dynamic style into the game.</p>
<p>Functional programming can be great for game scripting, Lua has beeen a very popular game scripting language for a very long time, and a bunch of game engines uses it (including CryEngine 2.0 and Gamebryo LightSpeed). The ability to attach properties and functions into an object at runtime, for example, is incredibly useful to create high level game logic and even artificial intelligence.</p>
<p>We can talk about dynamic languajes and their benefts here, but I want t focus on <a href="http://en.wikipedia.org/wiki/Mixin">Mixins</a> as the modern approach to game entity description:</p>
<p><a href="http://en.wikipedia.org/wiki/Mixin">Mixins </a>are chunks of functionability that can be applied to game objects. You can think of them as little pieces (building blocks) that you use to create a complex game entity. The most basic mixin every game entity is the entity&#8217;s transform which defines its position, rotation and scale. Each game engine implements entity&#8217;s transform in a different way, but the concept is the same.</p>
<p>Mixin complexity can vary from a simple mixin that lets you name an object (holds a string identifier), to very complex mixins like the one that provides characters the ability to use pathfinding to navigate the scene.</p>
<p>Each engine handles mixin <a href="http://en.wikipedia.org/wiki/Object_composition#Aggregation">agreggation </a>in it&#8217;s own way, some engines even let you use<a href="http://en.wikipedia.org/wiki/Multiple_inheritance"> multiple inheritance</a> with mixins. Please note the difference between mixin inheritance and mixin agreggation:</p>
<ul>
<li>Inheritance:</li>
<li>Mixins can be inherited</li>
<li>You can have mixin class hierarchies just the same way you can with normal classes</li>
</ul>
<ul>
<li>Aggregation:</li>
<li>Game objects agreggate a number of mixins to aquire their functionability</li>
<li>Mixins are agreggated (added to game objects) to create entity model descriptions</li>
</ul>
<p>For example: A mixin called BoomerangTarget provides the ability to be the target of the player&#8217;s boomerang. BoomerangTarget is a child of another mixin called Target which provides the generic ability of being a target of a player&#8217;s weapon. At the same time, an Enemy agreggates the following  mixins: Actor, BoomerangTarget, SwordTarget. Actor lets the enemy play animations, BoomerangTarget is the mixin desvribed above and SwordTarget provides the ability to be hit by a sword. SwordTarget mixin is also a child of Target, thus, both BoomerangTarget and SwordTarget share the basic functionability defined in the Target mixin.</p>
<p>A lot of game engines are using Mixins these days. Mixins have become the standard way to represent game object functionability.</p>
<p>Seth out.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.blog.silentkraken.com/2009/10/02/mixins-in-game-development/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

