<?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>AngryAnt.com</title>
	<atom:link href="http://eej.dk/angryant/feed/" rel="self" type="application/rss+xml" />
	<link>http://eej.dk/angryant</link>
	<description>Game and -AI development</description>
	<lastBuildDate>Fri, 19 Mar 2010 16:38:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>FAFF cleanup: Sketch</title>
		<link>http://eej.dk/angryant/general/tipsandtricks/faff-cleanup-sketch/</link>
		<comments>http://eej.dk/angryant/general/tipsandtricks/faff-cleanup-sketch/#comments</comments>
		<pubDate>Fri, 19 Mar 2010 16:22:33 +0000</pubDate>
		<dc:creator>AngryAnt</dc:creator>
				<category><![CDATA[Tips and tricks]]></category>

		<guid isPermaLink="false">http://eej.dk/angryant/?p=399</guid>
		<description><![CDATA[As some of you might have read, at Unity we have a thing called 	FAFF &#8211; very much the same as Google and other IT businesses are doing. It generally lets you step out of the bit stream for a day and just, during work hours, go with whatever crazy idea(s) you&#8217;ve been throwing around.
Some [...]]]></description>
			<content:encoded><![CDATA[<p>As some of you might have read, at Unity we have a thing called 	<a href="http://blogs.unity3d.com/2009/11/18/fridays-are-for-fun/">FAFF</a> &#8211; very much the same as Google and other IT businesses are doing. It generally lets you step out of the bit stream for a day and just, during work hours, go with whatever crazy idea(s) you&#8217;ve been throwing around.</p>
<p>Some of these ideas are pushed into the product later and others are just filed under &#8220;something to play with when bored&#8221; and &#8220;now I can stop wondering about that&#8221;. Sketch was a micro FAFF project I just remembered I had filed under &#8220;this was fun&#8221; and then forgot all about. Since then I&#8217;ve continued work on other projects and started new ones &#8211; in all likelihood I&#8217;ll not return to this project.</p>
<p>So I figured I&#8217;d push it to github and let you guys take it for a spin. If nothing else, it&#8217;s a nice demo of what you can do with Unity editor scripting.</p>
<p>The idea of Sketch is to have simple tools inside the Unity editor to modify meshes in your assets. My goal with the project was never to turn Unity into a mesh authoring environment, but rather to give people an extra tool for rapid prototyping.</p>
<p>So what&#8217;s in there now? The simplest I could think of: Triangle selection and movement.</p>
<ol>Workflow:</p>
<li>Go to the GameObject->Create Other menu and click Sketch Cube.</li>
<li>With the cube selected, click a triangle and with the handle that appears, drag it around to modify the mesh.</li>
<li>GOTO 1.</li>
</ol>
<p>Alternatively, you could drag in your own mesh from the Assets folder (make sure that it generates a mesh collider in its import settings) and attach the Sketch script to it.</p>
<ul>NOTICE: Sketch modifies the imported asset. This means that:</p>
<li>If you modify a some of the basic geometry meshes (such as GameObject->Create Other->Cube), the changes will apply to all cubes until editor relaunch.</li>
<li>If the geometry you&#8217;re modifying is based on an imported 3D asset, reimporting it will mean you loose your changes.</li>
</ul>
<p>Structure-wise, Sketch consists of two components: A MonoBehaviour (Sketch/Sketch.cs) and a custom inspector (Sketch/Editor/SketchEditor.cs). The purpose of the MonoBehaviour is merely to do some bookkeeping and provide utility functions (it will even destroy itself at runtime) while the custom inspector holds the logic for doing the modifications.</p>
<p><center><a href="http://eej.dk/angryant/wp-content/uploads/2010/03/Sketch.png"><img src="http://eej.dk/angryant/wp-content/uploads/2010/03/Sketch-300x202.png" alt="Sketch" title="Sketch" width="300" height="202" class="alignnone size-medium wp-image-403" /></a></center></p>
<p>Woah. That&#8217;s a lot of talk. Here&#8217;s the repository &#8211; go nuts: <a href="http://github.com/AngryAnt/Sketch">http://github.com/AngryAnt/Sketch</a></p>
]]></content:encoded>
			<wfw:commentRss>http://eej.dk/angryant/general/tipsandtricks/faff-cleanup-sketch/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Building a menu of delegates and enums</title>
		<link>http://eej.dk/angryant/general/tipsandtricks/building-a-menu-of-delegates-and-enums/</link>
		<comments>http://eej.dk/angryant/general/tipsandtricks/building-a-menu-of-delegates-and-enums/#comments</comments>
		<pubDate>Mon, 15 Mar 2010 10:51:03 +0000</pubDate>
		<dc:creator>AngryAnt</dc:creator>
				<category><![CDATA[Tips and tricks]]></category>

		<guid isPermaLink="false">http://eej.dk/angryant/?p=389</guid>
		<description><![CDATA[I like delegates. I also like enums. Furthermore, I happen to be part of a small group of people who actually enjoy the immediate mode GUI system in Unity. And I want you to like it too  
So &#8211; menus. After having observed quite a few very funky approaches, in the IRC channel, to [...]]]></description>
			<content:encoded><![CDATA[<p>I like delegates. I also like enums. Furthermore, I happen to be part of a small group of people who actually enjoy the immediate mode GUI system in Unity. And I want you to like it too <img src='http://eej.dk/angryant/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>So &#8211; menus. After having observed quite a few very funky approaches, in the <a href="http://www.unifycommunity.com/wiki/index.php?title=IRC">IRC</a> channel, to building main menu functionality and giving advice in there, I decided to sow together those ideas into a short example.</p>
<p>The main idea here is to be able to build and manage a menu system quickly and easily. This line adds a new submenu to the system &#8211; designated MyMenuState and implemented in the OnMyMenuGUI method:</p>
<pre class="textmate-source idle"><span class="source source_csharp">m_Menus [MenuState.MyMenuState] = OnMyMenuGUI;</span></pre>
<p>Notice that since we&#8217;re using delegates, the GUI method needn&#8217;t be implemented in the same script and could even  live on an entirely different GameObject. Why is this so clever (besides enums and delegates being cool)? Because managing and switching between menus set up like this is insanely easy. This is the central GUI method for the menu system:</p>
<pre class="textmate-source idle"><span class="source source_csharp"><span class="meta meta_definition meta_definition_method meta_definition_method_csharp"><span class="storage storage_modifier storage_modifier_csharp">public </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">OnGUI</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
{
    m_Menus [m_CurrentState] ();
}</span></pre>
<p>And this is GUI code inside a menu GUI method for switching to a different submenu:</p>
<pre class="textmate-source idle"><span class="source source_csharp">m_CurrentState = <span class="support support_class support_class_unity">GUILayout</span>.Button ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Credits</span>") ? MenuState.Credits : m_CurrentState;</span></pre>
<p>So there. Enough talk. Have some example code:</p>
<pre class="textmate-source idle"><span class="source source_csharp"><span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">UnityEngine</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">System.Collections</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">System.Collections.Generic</span>;</span>

<span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">class</span> Menu : <span class="support support_class support_class_unity">MonoBehaviour</span>
{
    <span class="storage storage_type storage_type_csharp">delegate</span> <span class="storage storage_type storage_type_csharp">void</span> OnGUIImplementation();
<span class="meta meta_definition meta_definition_property meta_definition_property_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public </span><span class="storage storage_type storage_type_csharp">enum</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">MenuState</span> </span>{Main,<span class="support support_class support_class_unity">Settings</span>,Credits};
    <span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">struct</span> <span class="support support_class support_class_unity">Settings</span>
    {
        <span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">bool</span> m_ThisSetting, m_ThatSetting, m_TheOtherSetting;
    };
    <span class="storage storage_modifier storage_modifier_csharp">static</span> <span class="support support_class support_class_unity">Vector2</span> m_StandardMenuSize = <span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">Vector2</span> (<span class="constant constant_numeric constant_numeric_csharp">200.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">300.0f</span>);
    <span class="storage storage_modifier storage_modifier_csharp">static</span> <span class="storage storage_type storage_type_csharp">string</span> m_LogoURL = "<span class="string string_quoted string_quoted_double string_quoted_double_csharp">http://download.unity3d.com/images/top-menu/mm_unity_icon.png</span>";
    <span class="storage storage_modifier storage_modifier_csharp">static</span> <span class="support support_class support_class_unity">Texture2D</span> m_Logo = <span class="constant constant_language constant_language_csharp">null</span>;

    <span class="storage storage_modifier storage_modifier_csharp">private</span> MenuState m_CurrentState = MenuState.Main;
    <span class="storage storage_modifier storage_modifier_csharp">private</span> Dictionary&lt;MenuState, OnGUIImplementation&gt; m_Menus;
    <span class="storage storage_modifier storage_modifier_csharp">private</span> <span class="support support_class support_class_unity">Settings</span> m_Settings;

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">Awake</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        m_Menus = <span class="keyword keyword_control keyword_control_csharp">new</span> Dictionary&lt;MenuState, OnGUIImplementation&gt; ();
        m_Menus [MenuState.Main] = OnMainMenuGUI;
        m_Menus [MenuState.<span class="support support_class support_class_unity">Settings</span>] = OnSettingsGUI;
        m_Menus [MenuState.Credits] = OnCreditsGUI;
        StartCoroutine (GetLogo ());
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_type storage_type_csharp">IEnumerator</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">GetLogo</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        <span class="support support_class support_class_unity">WWW</span> www = <span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">WWW</span> (m_LogoURL);

        <span class="keyword keyword_other keyword_other_csharp">yield</span> <span class="keyword keyword_control keyword_control_csharp">return</span> www;

        <span class="keyword keyword_control keyword_control_csharp">if</span> (www.error == <span class="constant constant_language constant_language_csharp">null</span>)
        {
            m_Logo = www.texture;
        }
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">OnGUI</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        m_Menus [m_CurrentState] ();
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">static </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">BeginStandardMenu</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(<span class="storage storage_type storage_type_csharp">string</span> title</span>)</span>
    {
        <span class="support support_class support_class_unity">GUILayout</span>.BeginArea (<span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">Rect</span> ((<span class="support support_class support_class_unity">Screen</span>.width - m_StandardMenuSize.x) * <span class="constant constant_numeric constant_numeric_csharp">0.5f</span>, (<span class="support support_class support_class_unity">Screen</span>.height - m_StandardMenuSize.y) * <span class="constant constant_numeric constant_numeric_csharp">0.5f</span>, m_StandardMenuSize.x, m_StandardMenuSize.y));
            <span class="support support_class support_class_unity">GUILayout</span>.BeginVertical (<span class="support support_class support_class_unity">GUI</span>.skin.GetStyle ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Box</span>"));
                <span class="support support_class support_class_unity">GUILayout</span>.Label (title, <span class="support support_class support_class_unity">GUI</span>.skin.GetStyle ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Box</span>"));
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">static </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">EndStandardMenu</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        <span class="support support_class support_class_unity">Color</span> color;

                <span class="support support_class support_class_unity">GUILayout</span>.BeginHorizontal ();
                    <span class="support support_class support_class_unity">GUILayout</span>.FlexibleSpace ();
                        color = <span class="support support_class support_class_unity">GUI</span>.color;
                        <span class="support support_class support_class_unity">GUI</span>.color = <span class="support support_class support_class_unity">Color</span>.grey;
                        <span class="support support_class support_class_unity">GUILayout</span>.Label ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">My game version 2.4X</span>");
                        <span class="support support_class support_class_unity">GUI</span>.color = color;
                    <span class="support support_class support_class_unity">GUILayout</span>.FlexibleSpace ();
                <span class="support support_class support_class_unity">GUILayout</span>.EndHorizontal ();
            <span class="support support_class support_class_unity">GUILayout</span>.EndVertical ();
        <span class="support support_class support_class_unity">GUILayout</span>.EndArea ();
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">OnMainMenuGUI</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        BeginStandardMenu ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Main menu</span>");
            <span class="keyword keyword_control keyword_control_csharp">if</span> (m_Logo != <span class="constant constant_language constant_language_csharp">null</span>)
            {
                <span class="support support_class support_class_unity">GUILayout</span>.BeginHorizontal ();
                    <span class="support support_class support_class_unity">GUILayout</span>.FlexibleSpace ();
                        <span class="support support_class support_class_unity">GUILayout</span>.Label (m_Logo);
                    <span class="support support_class support_class_unity">GUILayout</span>.FlexibleSpace ();
                <span class="support support_class support_class_unity">GUILayout</span>.EndHorizontal ();
            }
            <span class="keyword keyword_control keyword_control_csharp">if</span> (<span class="support support_class support_class_unity">GUILayout</span>.Button ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">New game</span>"))
            {
                <span class="support support_class support_class_unity">Application</span>.LoadLevel ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Level one</span>");
            }
            m_CurrentState = <span class="support support_class support_class_unity">GUILayout</span>.Button ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Settings</span>") ? MenuState.<span class="support support_class support_class_unity">Settings</span> : m_CurrentState;
            m_CurrentState = <span class="support support_class support_class_unity">GUILayout</span>.Button ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Credits</span>") ? MenuState.Credits : m_CurrentState;
            <span class="support support_class support_class_unity">GUILayout</span>.FlexibleSpace ();
        EndStandardMenu ();
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">OnSettingsGUI</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        BeginStandardMenu ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Settings</span>");
            m_Settings.m_ThisSetting = <span class="support support_class support_class_unity">GUILayout</span>.Toggle (m_Settings.m_ThisSetting, "<span class="string string_quoted string_quoted_double string_quoted_double_csharp">This setting</span>");
            m_Settings.m_ThatSetting = <span class="support support_class support_class_unity">GUILayout</span>.Toggle (m_Settings.m_ThatSetting, "<span class="string string_quoted string_quoted_double string_quoted_double_csharp">That setting</span>");
            m_Settings.m_TheOtherSetting = <span class="support support_class support_class_unity">GUILayout</span>.Toggle (m_Settings.m_TheOtherSetting, "<span class="string string_quoted string_quoted_double string_quoted_double_csharp">The other setting</span>", <span class="support support_class support_class_unity">GUI</span>.skin.GetStyle ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Button</span>"));
            <span class="support support_class support_class_unity">GUILayout</span>.FlexibleSpace ();
            m_CurrentState = <span class="support support_class support_class_unity">GUILayout</span>.Button ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Main menu</span>") ? MenuState.Main : m_CurrentState;
        EndStandardMenu ();
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">OnCreditsGUI</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        BeginStandardMenu ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Credits</span>");
            <span class="support support_class support_class_unity">GUILayout</span>.Label ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">This game was created by some of the most awesomestest people on the planet. Having failed in their mission to Pluto, they started making games, which - as you can see - resulted in much joy and success!</span>");
                <span class="support support_class support_class_unity">GUILayout</span>.<span class="support support_class support_class_unity">Space</span> (<span class="constant constant_numeric constant_numeric_csharp">20.0f</span>);
                <span class="support support_class support_class_unity">GUILayout</span>.BeginHorizontal ();
                    <span class="support support_class support_class_unity">GUILayout</span>.FlexibleSpace ();
                        <span class="support support_class support_class_unity">GUILayout</span>.Label ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">The awesomestest people inc.</span>");
                <span class="support support_class support_class_unity">GUILayout</span>.EndHorizontal ();

            <span class="support support_class support_class_unity">GUILayout</span>.FlexibleSpace ();
            m_CurrentState = <span class="support support_class support_class_unity">GUILayout</span>.Button ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Main menu</span>") ? MenuState.Main : m_CurrentState;
        EndStandardMenu ();
    }
}
</span></pre>
<hr />
Example project: <a href="http://eej.dk/angryant/wp-content/uploads/2010/03/Menu.zip">Menu.zip</a> &#8211; built with Unity 2.6.1</p>
]]></content:encoded>
			<wfw:commentRss>http://eej.dk/angryant/general/tipsandtricks/building-a-menu-of-delegates-and-enums/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Pick me! Pick me!</title>
		<link>http://eej.dk/angryant/general/tipsandtricks/pick-me-pick-me/</link>
		<comments>http://eej.dk/angryant/general/tipsandtricks/pick-me-pick-me/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 09:58:30 +0000</pubDate>
		<dc:creator>AngryAnt</dc:creator>
				<category><![CDATA[Tips and tricks]]></category>

		<guid isPermaLink="false">http://eej.dk/angryant/?p=376</guid>
		<description><![CDATA[Say you&#8217;re developing an RTS or maybe a connect-the-dots sort of game. What would be the easiest way to go about handling object selection? This is my suggested solution.
In the given example, I&#8217;m taking advantage of the object-mouse event handling that MonoBehaviours on GameObject with colliders on them give for free. You might be in [...]]]></description>
			<content:encoded><![CDATA[<p>Say you&#8217;re developing an RTS or maybe a connect-the-dots sort of game. What would be the easiest way to go about handling object selection? This is my suggested solution.</p>
<p>In the given example, I&#8217;m taking advantage of the object-mouse event handling that MonoBehaviours on GameObject with colliders on them give for free. You might be in a scenario where raycasting or otherwise resolving selection requests makes more sense, but the basic logic still applies. This example is merely intended to get your from start to goal as fast as possible.</p>
<p>First off, we need a selection manager class (cleverly named SelectionManager in my example). This is where we store selection state and via static accessors, we can get and modify the current selection. Seeing as this class is both public and all accessors are static, you can put its source anywhere. In my example I&#8217;ve simply put it right after the MonoBehaviour used for testing it.</p>
<p>SelectionManager</p>
<pre class="textmate-source idle"><span class="source source_csharp"><span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">UnityEngine</span>;</span>

<span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">class</span> SelectionManager
{
    <span class="storage storage_modifier storage_modifier_csharp">private</span> <span class="storage storage_modifier storage_modifier_csharp">static</span> <span class="support support_class support_class_unity">GameObject</span> s_ActiveSelection;

    <span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_modifier storage_modifier_csharp">static</span> <span class="support support_class support_class_unity">GameObject</span> ActiveSelection
    {
        <span class="keyword keyword_other keyword_other_csharp">get</span>
        {
            <span class="keyword keyword_control keyword_control_csharp">return</span> s_ActiveSelection;
        }
        <span class="keyword keyword_other keyword_other_csharp">set</span>
        {
            s_ActiveSelection = <span class="keyword keyword_other keyword_other_csharp">value</span>;
        }
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public static </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">Select</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(<span class="support support_class support_class_unity">GameObject</span> gameObject, <span class="storage storage_type storage_type_csharp">bool</span> selectionValue</span>)</span>
    {
        <span class="keyword keyword_control keyword_control_csharp">if</span> (selectionValue)
        {
            Select (gameObject);
        }
        <span class="keyword keyword_control keyword_control_csharp">else</span>
        {
            Deselect (gameObject);
        }
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public static </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">Select</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(<span class="support support_class support_class_unity">GameObject</span> gameObject</span>)</span>
    {
        ActiveSelection = gameObject;
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public static </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">Deselect</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(<span class="support support_class support_class_unity">GameObject</span> gameObject</span>)</span>
    {
        <span class="keyword keyword_control keyword_control_csharp">if</span> (ActiveSelection == gameObject)
        {
            ActiveSelection = <span class="constant constant_language constant_language_csharp">null</span>;
        }
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public static </span><span class="storage storage_type storage_type_csharp">bool</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">IsSelected</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(<span class="support support_class support_class_unity">GameObject</span> gameObject</span>)</span>
    {
        <span class="keyword keyword_control keyword_control_csharp">return</span> ActiveSelection == gameObject;
    }
}</span></pre>
<p>And the promised MonoBehaviour using the SelectionManager class:</p>
<pre class="textmate-source idle"><span class="source source_csharp"><span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">UnityEngine</span>;</span>

<span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">class</span> SelectableObject : <span class="support support_class support_class_unity">MonoBehaviour</span>
{
    <span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="support support_class support_class_unity">Rect</span> m_SelectionWindowRect = <span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">Rect</span> (<span class="constant constant_numeric constant_numeric_csharp">10.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">300.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">100.0f</span>);

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">OnMouseDown</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        SelectionManager.Select (gameObject, !SelectionManager.IsSelected (gameObject));
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">OnDisable</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        SelectionManager.Deselect (gameObject);
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">Update</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        renderer.material.color = SelectionManager.IsSelected (gameObject) ? <span class="support support_class support_class_unity">Color</span>.green : <span class="support support_class support_class_unity">Color</span>.white;
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">OnGUI</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        <span class="keyword keyword_control keyword_control_csharp">if</span> (SelectionManager.IsSelected (gameObject))
        {
            m_SelectionWindowRect = <span class="support support_class support_class_unity">GUI</span>.Window (GetInstanceID (), m_SelectionWindowRect, SelectionWindow, gameObject.name);
        }
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">SelectionWindow</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(<span class="storage storage_type storage_type_csharp">int</span> id</span>)</span>
    {
        <span class="support support_class support_class_unity">GUILayout</span>.Box ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">I am the selection and my name is </span>" + gameObject.name);
        <span class="support support_class support_class_unity">GUI</span>.DragWindow ();
    }
}</span></pre>
<hr />
<p>And that is all there is to it. By popular demand, I&#8217;m now starting to provide pre-built projects with these tips and tricks posts. Download, unzip, open and play. Requires Unity 2.6.1:<br />
<a href='http://eej.dk/angryant/wp-content/uploads/2010/03/SelectableObject.zip'>SelectableObject</a></p>
]]></content:encoded>
			<wfw:commentRss>http://eej.dk/angryant/general/tipsandtricks/pick-me-pick-me/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Optimising coroutine yielding in C#</title>
		<link>http://eej.dk/angryant/general/tipsandtricks/optimising-coroutine-yielding-in-c/</link>
		<comments>http://eej.dk/angryant/general/tipsandtricks/optimising-coroutine-yielding-in-c/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 09:20:00 +0000</pubDate>
		<dc:creator>AngryAnt</dc:creator>
				<category><![CDATA[Tips and tricks]]></category>

		<guid isPermaLink="false">http://eej.dk/angryant/?p=365</guid>
		<description><![CDATA[When needing to yield a coroutine for a single frame in C#, most people &#8211; including myself usually go about it this way:
private IEnumerator DoFadeAlphaIn ()
{
    while (m_Alpha &#60; 1.0f)
    {
        m_Alpha += Time.deltaTime;
        yield [...]]]></description>
			<content:encoded><![CDATA[<p>When needing to yield a coroutine for a single frame in C#, most people &#8211; including myself usually go about it this way:</p>
<pre class="textmate-source idle"><span class="source source_csharp"><span class="meta meta_definition meta_definition_method meta_definition_method_csharp"><span class="storage storage_modifier storage_modifier_csharp">private </span><span class="storage storage_type storage_type_csharp">IEnumerator</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">DoFadeAlphaIn</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
{
    <span class="keyword keyword_control keyword_control_csharp">while</span> (m_Alpha &lt; <span class="constant constant_numeric constant_numeric_csharp">1.0f</span>)
    {
        m_Alpha += <span class="support support_class support_class_unity">Time</span>.deltaTime;
        <span class="keyword keyword_other keyword_other_csharp">yield</span> <span class="keyword keyword_control keyword_control_csharp">return</span> <span class="constant constant_numeric constant_numeric_csharp">0</span>;
    }
    m_Alpha = <span class="constant constant_numeric constant_numeric_csharp">1.0f</span>;
}</span></pre>
<p>However, as Rodrigo recently brought to my attention, this approach ofcourse performs unneeded memory allocation, given that the zero needs boxing and unboxing before its passed to the coroutine system. Using null in stead saves you that work and allocation.</p>
<p>This might not seem like a lot at first glance, but if you make this a habit every time you need to yield for a frame, I guarantee you that you&#8217;ll see results in larger scenarios.</p>
<p>The more optimal way of yielding for a single frame in C#. Minor difference, but allocation saved &#8211; which is always awesome:</p>
<pre class="textmate-source idle"><span class="source source_csharp"><span class="meta meta_definition meta_definition_method meta_definition_method_csharp"><span class="storage storage_modifier storage_modifier_csharp">private </span><span class="storage storage_type storage_type_csharp">IEnumerator</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">DoFadeAlphaIn</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
{
    <span class="keyword keyword_control keyword_control_csharp">while</span> (m_Alpha &lt; <span class="constant constant_numeric constant_numeric_csharp">1.0f</span>)
    {
        m_Alpha += <span class="support support_class support_class_unity">Time</span>.deltaTime;
        <span class="keyword keyword_other keyword_other_csharp">yield</span> <span class="keyword keyword_control keyword_control_csharp">return</span> <span class="constant constant_language constant_language_csharp">null</span>;
    }
    m_Alpha = <span class="constant constant_numeric constant_numeric_csharp">1.0f</span>;
}</span></pre>
<p>An interesting test could be to, on a larger co-routine heavy project, do a project-wide find and replace on &#8220;yield return 0;&#8221; and &#8220;yield return null;&#8221; back and forth and measuring the performance difference with the profiler (for non-pro users, maybe the performance gain is even measurable using external monitoring tools).</p>
]]></content:encoded>
			<wfw:commentRss>http://eej.dk/angryant/general/tipsandtricks/optimising-coroutine-yielding-in-c/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Downloading the hydra</title>
		<link>http://eej.dk/angryant/general/tipsandtricks/downloading-the-hydra/</link>
		<comments>http://eej.dk/angryant/general/tipsandtricks/downloading-the-hydra/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 09:13:46 +0000</pubDate>
		<dc:creator>AngryAnt</dc:creator>
				<category><![CDATA[Tips and tricks]]></category>

		<guid isPermaLink="false">http://eej.dk/angryant/?p=348</guid>
		<description><![CDATA[So I&#8217;ve seen some people asking how you would go about downloading executable code from an external location, reading it into memory and executing it in ones running application.
Now some readers might go &#34;eh? why the heck would someone want to do that?&#34;. Well first off, its cool&#8482;, but seeing as that is rarely an [...]]]></description>
			<content:encoded><![CDATA[<p>So I&#8217;ve seen some people asking how you would go about downloading executable code from an external location, reading it into memory and executing it in ones running application.</p>
<p>Now some readers might go &quot;eh? why the heck would someone want to do that?&quot;. Well first off, <b>its cool</b>&trade;, but seeing as that is rarely an argument which convinces decision makers, here&#8217;s a few others:</p>
<ul>
<li>Patching. The ability to modify the behaviour of your downloaded executable after distribution, without requiring re-download.</li>
<li>Highly dynamic online content. Say you&#8217;re building a virtual world or something. You might want to have the ability to add more complex behaviours to downloaded content &#8211; more than what a data-driven approach allows for.</li>
<li>Or how about expanding the capabilities of user generated content?</li>
</ul>
<p>There. Those are my alibis and I&#8217;m sticking to them.</p>
<p>Now this example is quick and simple so as to not bloat the post too much. Regardless of your use, you&#8217;ll likely be wanting to add in for instance some cache functionality for real-world use.</p>
<p>Right. So this example contains three pieces of eight, uh, code:</p>
<ul>
<li>The loader utility &#8211; responsible for downloading and making available the remote code.</li>
<li>The assembly &#8211; you know, the one we&#8217;re downloading.</li>
<li>An example handler. For easy re-use, I&#8217;ve designed this example to allow for easy re-use of the loader utility by externalising handling of the assemblies via messages. This example handler shows some techniques for accessing the data of loaded assemblies.</li>
</ul>
<p>Using the example:</p>
<ol>
<li>Download and save /Assets/WWWAssemblyLoader.cs, /Assets/NewBehaviourScript.cs and /MyAssembly.cs.</li>
<li>Download and install the mono runtime (or the .net equivalent on Windnows &#8211; not tested, but should work just fine).</li>
<li>Build the assembly from the terminal &#8211; using the build command supplied at the end of this post.</li>
<li>Upload the assembly to some host (save the URL for later).</li>
<li>Open up your Unity project.</li>
<li>Add the WWWAssemblyLoader and NewBehaviourScript scripts to a GameObject and set the URL property of the first to that of your uploaded assembly.</li>
<li>Press play.</li>
<li>Profit!</li>
</ol>
<p>And now the codes!</p>
<p><b>/Assets/WWWAssemblyLoader.cs</b></p>
<pre class="textmate-source idle"><span class="source source_csharp"><span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">UnityEngine</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">System.Collections</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">System.Reflection</span>;</span>

<span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">class</span> WWWAssemblyLoader : <span class="support support_class support_class_unity">MonoBehaviour</span>
{
    <span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">string</span> m_AssemblyURL;
    <span class="storage storage_modifier storage_modifier_csharp">private</span> <span class="storage storage_type storage_type_csharp">string</span> m_ErrorString = "";
    <span class="storage storage_modifier storage_modifier_csharp">private</span> <span class="support support_class support_class_unity">WWW</span> m_WWW;
    <span class="storage storage_modifier storage_modifier_csharp">private</span> <span class="storage storage_type storage_type_csharp">bool</span> m_Complete = <span class="constant constant_language constant_language_csharp">true</span>;

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">Start</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        <span class="keyword keyword_control keyword_control_csharp">if</span> (m_AssemblyURL != "")
        {
            ReloadAssembly (m_AssemblyURL);
        }
    }

    <span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">string</span> AssemblyURL
    {
        <span class="keyword keyword_other keyword_other_csharp">get</span>
        {
            <span class="keyword keyword_control keyword_control_csharp">return</span> m_AssemblyURL;
        }
        <span class="keyword keyword_other keyword_other_csharp">set</span>
        {
            <span class="keyword keyword_control keyword_control_csharp">if</span> (m_AssemblyURL != <span class="keyword keyword_other keyword_other_csharp">value</span>)
            {
                ReloadAssembly (<span class="keyword keyword_other keyword_other_csharp">value</span>);
            }
        }
    }

    <span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">float</span> Progress
    {
        <span class="keyword keyword_other keyword_other_csharp">get</span>
        {
            <span class="keyword keyword_control keyword_control_csharp">return</span> m_Complete ? <span class="constant constant_numeric constant_numeric_csharp">1.0f</span> : m_WWW.progress;
        }
    }

    <span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">string</span> Error
    {
        <span class="keyword keyword_other keyword_other_csharp">get</span>
        {
            <span class="keyword keyword_control keyword_control_csharp">return</span> m_ErrorString;
        }
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">ReloadAssembly</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(<span class="storage storage_type storage_type_csharp">string</span> url</span>)</span>
    {
        m_Complete = <span class="constant constant_language constant_language_csharp">false</span>;
        m_ErrorString = "";
        m_AssemblyURL = url;
        m_WWW = <span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">WWW</span> (m_AssemblyURL);
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">Update</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        <span class="keyword keyword_control keyword_control_csharp">if</span> (!m_Complete)
        {
            <span class="keyword keyword_control keyword_control_csharp">if</span> (m_WWW.error != <span class="constant constant_language constant_language_csharp">null</span>)
            {
                m_ErrorString = m_WWW.error;
                m_Complete = <span class="constant constant_language constant_language_csharp">true</span>;
                SendMessage ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">OnAssemblyLoadFailed</span>", m_AssemblyURL);
            }
            <span class="keyword keyword_control keyword_control_csharp">else</span> <span class="keyword keyword_control keyword_control_csharp">if</span> (m_WWW.isDone)
            {
                Assembly assembly = LoadAssembly ();
                m_Complete = <span class="constant constant_language constant_language_csharp">true</span>;
                <span class="keyword keyword_control keyword_control_csharp">if</span> (assembly != <span class="constant constant_language constant_language_csharp">null</span>)
                {
                    <span class="support support_class support_class_unity">Debug</span>.Log ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Done</span>");
                    SendMessage ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">OnAssemblyLoaded</span>", <span class="keyword keyword_control keyword_control_csharp">new</span> WWWAssembly (m_AssemblyURL, assembly));
                }
                <span class="keyword keyword_control keyword_control_csharp">else</span>
                {
                    <span class="support support_class support_class_unity">Debug</span>.Log ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Failed</span>");
                    SendMessage ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">OnAssemblyLoadFailed</span>", m_AssemblyURL);
                }
            }
        }
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">private </span><span class="storage storage_type storage_type_csharp">Assembly</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">LoadAssembly</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        <span class="keyword keyword_control keyword_control_csharp">try</span>
        {
            <span class="keyword keyword_control keyword_control_csharp">return</span> Assembly.Load (m_WWW.bytes);
        }
        <span class="keyword keyword_control keyword_control_csharp">catch</span> (System.Exception e)
        {
            m_ErrorString = e.ToString ();
            <span class="keyword keyword_control keyword_control_csharp">return</span> <span class="constant constant_language constant_language_csharp">null</span>;
        }
    }
}

<span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">class</span> WWWAssembly
{
    <span class="storage storage_modifier storage_modifier_csharp">private</span> <span class="storage storage_type storage_type_csharp">string</span> m_URL;
    <span class="storage storage_modifier storage_modifier_csharp">private</span> Assembly m_Assembly;

    <span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">string</span> URL
    {
        <span class="keyword keyword_other keyword_other_csharp">get</span>
        {
            <span class="keyword keyword_control keyword_control_csharp">return</span> m_URL;
        }
    }

    <span class="storage storage_modifier storage_modifier_csharp">public</span> Assembly Assembly
    {
        <span class="keyword keyword_other keyword_other_csharp">get</span>
        {
            <span class="keyword keyword_control keyword_control_csharp">return</span> m_Assembly;
        }
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_type storage_type_csharp">public</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">WWWAssembly</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(<span class="storage storage_type storage_type_csharp">string</span> url, Assembly assembly</span>)</span>
    {
        m_URL = url;
        m_Assembly = assembly;
    }
}</span></pre>
<p><b>/Assets/NewBehaviourScript.cs</b></p>
<pre class="textmate-source idle"><span class="source source_csharp"><span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">UnityEngine</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">System.Collections</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">System.Reflection</span>;</span>

<span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">class</span> NewBehaviourScript : <span class="support support_class support_class_unity">MonoBehaviour</span>
{
    <span class="storage storage_modifier storage_modifier_csharp">private</span> <span class="storage storage_type storage_type_csharp">string</span> m_MessageString = "<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Waiting for assembly</span>";

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">OnAssemblyLoaded</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(WWWAssembly loadedAssembly</span>)</span>
    {
        m_MessageString = "<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Assembly </span>" + loadedAssembly.URL + "<span class="string string_quoted string_quoted_double string_quoted_double_csharp"><span class="constant constant_character constant_character_escape constant_character_escape_csharp">\n</span></span>";

        System.Type type = loadedAssembly.Assembly.GetType ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">MyClass</span>");

        FieldInfo field = type.GetField ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">myString</span>");
        m_MessageString += (field.GetValue (<span class="constant constant_language constant_language_csharp">null</span>) <span class="keyword keyword_operator keyword_operator_csharp">as</span> <span class="storage storage_type storage_type_csharp">string</span>) + "<span class="string string_quoted string_quoted_double string_quoted_double_csharp"><span class="constant constant_character constant_character_escape constant_character_escape_csharp">\n</span></span>";

        <span class="storage storage_type storage_type_csharp">object</span> instance = loadedAssembly.Assembly.CreateInstance ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">MyClass</span>");
        MethodInfo method = type.GetMethod ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">LogMyString</span>");
        m_MessageString += "<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Return value: </span>" + method.Invoke (instance, <span class="constant constant_language constant_language_csharp">null</span>).ToString ();
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">OnAssemblyLoadFailed</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(<span class="storage storage_type storage_type_csharp">string</span> url</span>)</span>
    {
        m_MessageString = "<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Failed to load assembly at </span>" + url;
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">OnGUI</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        <span class="support support_class support_class_unity">GUILayout</span>.BeginArea (<span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">Rect</span> (<span class="constant constant_numeric constant_numeric_csharp">0.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">0.0f</span>, <span class="support support_class support_class_unity">Screen</span>.width, <span class="support support_class support_class_unity">Screen</span>.height));
            <span class="support support_class support_class_unity">GUILayout</span>.FlexibleSpace ();
            <span class="support support_class support_class_unity">GUILayout</span>.BeginHorizontal ();
                <span class="support support_class support_class_unity">GUILayout</span>.FlexibleSpace ();
                <span class="support support_class support_class_unity">GUILayout</span>.Box (m_MessageString);
                <span class="support support_class support_class_unity">GUILayout</span>.FlexibleSpace ();
            <span class="support support_class support_class_unity">GUILayout</span>.EndHorizontal ();
            <span class="support support_class support_class_unity">GUILayout</span>.FlexibleSpace ();
        <span class="support support_class support_class_unity">GUILayout</span>.EndArea ();
    }
}
</span></pre>
<p><b>/MyAssembly.cs</b></p>
<pre class="textmate-source idle"><span class="source source_csharp"><span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">UnityEngine</span>;</span>

<span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">class</span> MyClass
{
    <span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_modifier storage_modifier_csharp">static</span> <span class="storage storage_type storage_type_csharp">string</span> myString = "<span class="string string_quoted string_quoted_double string_quoted_double_csharp">This is my string from my class in my assembly</span>";

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public </span><span class="storage storage_type storage_type_csharp">int</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">LogMyString</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        <span class="support support_class support_class_unity">Debug</span>.Log (myString);
        <span class="keyword keyword_control keyword_control_csharp">return</span> <span class="constant constant_numeric constant_numeric_csharp">2</span> + <span class="constant constant_numeric constant_numeric_csharp">2</span>;
    }
}</span></pre>
<p><b>The assembly compile terminal command</b><br />
<i>mcs -target:library -out:MyAssembly.dll -r:/Applications/Unity/Unity.app/Contents/Frameworks/UnityEngine.dll  MyAssembly.cs</i></p>
]]></content:encoded>
			<wfw:commentRss>http://eej.dk/angryant/general/tipsandtricks/downloading-the-hydra/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>New license of Path: GPL</title>
		<link>http://eej.dk/angryant/general/path/new-license-of-path-gpl/</link>
		<comments>http://eej.dk/angryant/general/path/new-license-of-path-gpl/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 16:52:24 +0000</pubDate>
		<dc:creator>AngryAnt</dc:creator>
				<category><![CDATA[Path]]></category>

		<guid isPermaLink="false">http://eej.dk/angryant/?p=342</guid>
		<description><![CDATA[Since I started at Unity, I haven&#8217;t really had the time to do much updating (read: none) of my private projects. In sheer size, Path is the largest of those, so a while ago I realised that maintaining that project is simply not feasible.
By adding the GPL license option to the existing two license options [...]]]></description>
			<content:encoded><![CDATA[<p>Since I started at Unity, I haven&#8217;t really had the time to do much updating (read: none) of my private projects. In sheer size, Path is the largest of those, so a while ago I realised that maintaining that project is simply not feasible.</p>
<p>By adding the GPL license option to the existing two license options (the show-my-logo license displayed on <a href="http://angryant.com/path/downloads/">download from angryant.com</a> and the option for a custom negotiated one), users are able to test and modify the source of Path directly &#8211; before deciding on one of the other licenses.</p>
<p>Also, although very messy (yes &#8211; very), the source could also serve as a good learning resource for Unity editor scripting.</p>
<p>The project repository is available on <a href="http://github.com/AngryAnt/Path-GPL">github</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://eej.dk/angryant/general/path/new-license-of-path-gpl/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>CopyInspector</title>
		<link>http://eej.dk/angryant/general/tipsandtricks/copyinspector/</link>
		<comments>http://eej.dk/angryant/general/tipsandtricks/copyinspector/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 13:13:39 +0000</pubDate>
		<dc:creator>AngryAnt</dc:creator>
				<category><![CDATA[Tips and tricks]]></category>

		<guid isPermaLink="false">http://eej.dk/angryant/?p=326</guid>
		<description><![CDATA[Yea I know. It&#8217;s been a while. I do have two very good excuses though: 2.6 and Unite &#8216;09. If you enjoyed those then zip it and read on. If not, I&#8217;m really out of ammo and sorry for the delay.
At Unite, I attended the talk by John Grden of infrared5 on the special (free) [...]]]></description>
			<content:encoded><![CDATA[<p>Yea I know. It&#8217;s been a while. I do have two very good excuses though: 2.6 and Unite &#8216;09. If you enjoyed those then zip it and read on. If not, I&#8217;m really out of ammo and sorry for the delay.</p>
<p>At Unite, I attended the talk by John Grden of infrared5 on the special (free) Unity for flash users day. During this session he complained about wanting to be able to copy his runtime transform changes inside the IDE (he was copying by way of paper notes it seemed). I decided to take up the challenge when he continued with &#8220;&#8230; but someone is probably going to show me how to do that after this&#8221; and after his talk I handed him a custom inspector editor script for solving that specific problem.</p>
<p>Later at the conference I had some time to kill and did a rewrite to expand the script to be general for any component type. I didn&#8217;t have the time to hand John that version, but I suppose I&#8217;ll just email him a link to this post.</p>
<ul>So anyway &#8211; lets talk implementation:</p>
<li>Add CopyInspector.cs to Assets/Editor.</li>
<li>Add CopyTransformInspector.cs to Assets/Editor.</li>
<li>For each other component to be made copy/paste-able:
<ul>
<li>Add CopyYourComponentTypeInspector.cs to Assets/Editor.</li>
<li>Rename it appropriately.</li>
<li>Rename the class to match the file name.</li>
<li>Change YourComponentType in &#8220;[CustomEditor (typeof (YourComponentType))]&#8221; to the type of component you wish to affect.</li>
</li>
</ul>
</li>
</ul>
<p>You&#8217;ll notice that CopyTransformInspector has some additional code to it. This is due to the fact that this inspector is rendered non-standard and the code provided just replicates that.</p>
<div id="attachment_339" class="wp-caption aligncenter" style="width: 270px"><img src="http://eej.dk/angryant/wp-content/uploads/2009/11/CopyTransformInspector.png" alt="The copy transform inspector" title="CopyTransformInspector" width="260" height="149" class="size-full wp-image-339" /><p class="wp-caption-text">The copy transform inspector</p></div>
<p>Not really sure why syntax highlighting is not kicking in&#8230; Will have a look at that later.</p>
<p>Codes!</p>
<p>CopyInspector.cs</p>
<pre class="textmate-source"><span class="source source_csharp"><span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">UnityEngine</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">UnityEditor</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">System.Collections</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">System.Collections.Generic</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">System.Reflection</span>;</span>

<span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">class</span> CopyInspector : <span class="support support_class support_class_unity">Editor</span>
{
    <span class="storage storage_modifier storage_modifier_csharp">static</span> System.Type m_OriginalType;
    <span class="storage storage_modifier storage_modifier_csharp">static</span> Dictionary &lt;PropertyInfo, <span class="storage storage_type storage_type_csharp">object</span>&gt; m_Values;

    <span class="storage storage_modifier storage_modifier_csharp">private</span> List &lt;PropertyInfo&gt; GetProperties (<span class="support support_class support_class_unity">Component</span> component)
    {
        List &lt;<span class="storage storage_type storage_type_csharp">string</span>&gt; ignoredProperties;
        List &lt;PropertyInfo&gt; properties;

        properties = <span class="keyword keyword_control keyword_control_csharp">new</span> List &lt;PropertyInfo&gt; ();
        ignoredProperties = <span class="keyword keyword_control keyword_control_csharp">new</span> List &lt;<span class="storage storage_type storage_type_csharp">string</span>&gt; ();
        <span class="keyword keyword_control keyword_control_csharp">foreach</span> (PropertyInfo propertyInfo <span class="storage storage_modifier storage_modifier_csharp">in</span> <span class="keyword keyword_operator keyword_operator_csharp">typeof</span> (<span class="support support_class support_class_unity">Component</span>).GetProperties ())
        {
            ignoredProperties.Add (propertyInfo.Name);
        }

        <span class="keyword keyword_control keyword_control_csharp">foreach</span> (PropertyInfo propertyInfo <span class="storage storage_modifier storage_modifier_csharp">in</span> component.GetType ().GetProperties ())
        {
            <span class="keyword keyword_control keyword_control_csharp">if</span> (ignoredProperties.Contains (propertyInfo.Name))
            {
                <span class="keyword keyword_control keyword_control_csharp">continue</span>;
            }
            properties.Add (propertyInfo);
        }

        <span class="keyword keyword_control keyword_control_csharp">return</span> properties;
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public override </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">OnInspectorGUI</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        DrawDefaultInspector ();
        OnCopyInspectorGUI ();
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">OnCopyInspectorGUI</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        <span class="storage storage_type storage_type_csharp">bool</span> enabled;
        List &lt;PropertyInfo&gt; properties;
        <span class="support support_class support_class_unity">Component</span> component;

        component = target <span class="keyword keyword_operator keyword_operator_csharp">as</span> <span class="support support_class support_class_unity">Component</span>;

        <span class="keyword keyword_control keyword_control_csharp">if</span> (component == <span class="constant constant_language constant_language_csharp">null</span>)
        {
            <span class="keyword keyword_control keyword_control_csharp">return</span>;
        }

        <span class="support support_class support_class_unity">GUILayout</span>.<span class="support support_class support_class_unity">Space</span> (<span class="constant constant_numeric constant_numeric_csharp">10.0f</span>);

        <span class="support support_class support_class_unity">Color</span> backgroundColor = <span class="support support_class support_class_unity">GUI</span>.backgroundColor;

        <span class="support support_class support_class_unity">GUI</span>.backgroundColor = <span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">Color</span> (<span class="constant constant_numeric constant_numeric_csharp">0.8f</span>, <span class="constant constant_numeric constant_numeric_csharp">0.8f</span>, <span class="constant constant_numeric constant_numeric_csharp">0.8f</span>);

        <span class="support support_class support_class_unity">GUILayout</span>.BeginVertical ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Toolbar</span>");

            <span class="support support_class support_class_unity">GUI</span>.backgroundColor = backgroundColor;

            <span class="support support_class support_class_unity">GUILayout</span>.BeginHorizontal ();

                <span class="support support_class support_class_unity">GUILayout</span>.<span class="support support_class support_class_unity">Space</span> (<span class="constant constant_numeric constant_numeric_csharp">10.0f</span>);

                <span class="support support_class support_class_unity">GUILayout</span>.Label ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Copied: </span>" + (m_OriginalType != <span class="constant constant_language constant_language_csharp">null</span> ? m_OriginalType.Name : "<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Nothing</span>"), "<span class="string string_quoted string_quoted_double string_quoted_double_csharp">MiniLabel</span>");

                <span class="support support_class support_class_unity">GUILayout</span>.FlexibleSpace ();

                <span class="keyword keyword_control keyword_control_csharp">if</span> (<span class="support support_class support_class_unity">GUILayout</span>.Button (<span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">GUIContent</span> ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Copy</span>", "<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Copy component values</span>"), "<span class="string string_quoted string_quoted_double string_quoted_double_csharp">MiniLabel</span>"))
                {
                    m_OriginalType = target.GetType ();

                    properties = GetProperties (component);

                    m_Values = <span class="keyword keyword_control keyword_control_csharp">new</span> Dictionary &lt;PropertyInfo, <span class="storage storage_type storage_type_csharp">object</span>&gt; ();
                    <span class="keyword keyword_control keyword_control_csharp">foreach</span> (PropertyInfo property <span class="storage storage_modifier storage_modifier_csharp">in</span> properties)
                    {
                        m_Values [property] = property.GetValue (component, <span class="constant constant_language constant_language_csharp">null</span>);
                    }
                }

                enabled = <span class="support support_class support_class_unity">GUI</span>.enabled;
                <span class="support support_class support_class_unity">GUI</span>.enabled = target.GetType () == m_OriginalType;

                <span class="support support_class support_class_unity">GUILayout</span>.<span class="support support_class support_class_unity">Space</span> (<span class="constant constant_numeric constant_numeric_csharp">10.0f</span>);

                <span class="keyword keyword_control keyword_control_csharp">if</span> (<span class="support support_class support_class_unity">GUILayout</span>.Button (<span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">GUIContent</span> ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Paste</span>", "<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Paste component values</span>"), "<span class="string string_quoted string_quoted_double string_quoted_double_csharp">MiniLabel</span>"))
                {
                    properties = GetProperties (component);
                    <span class="keyword keyword_control keyword_control_csharp">foreach</span> (PropertyInfo property <span class="storage storage_modifier storage_modifier_csharp">in</span> properties)
                    {
                        <span class="keyword keyword_control keyword_control_csharp">if</span> (!property.CanWrite)
                        {
                            <span class="keyword keyword_control keyword_control_csharp">continue</span>;
                        }

                        property.SetValue (component, m_Values [property], <span class="constant constant_language constant_language_csharp">null</span>);
                    }
                }

                <span class="support support_class support_class_unity">GUILayout</span>.<span class="support support_class support_class_unity">Space</span> (<span class="constant constant_numeric constant_numeric_csharp">10.0f</span>);

                <span class="support support_class support_class_unity">GUI</span>.enabled = enabled;

            <span class="support support_class support_class_unity">GUILayout</span>.EndHorizontal ();

        <span class="support support_class support_class_unity">GUILayout</span>.EndVertical ();

        <span class="support support_class support_class_unity">GUILayout</span>.<span class="support support_class support_class_unity">Space</span> (-<span class="constant constant_numeric constant_numeric_csharp">2.0f</span>);
    }
}</span></pre>
<p>CopyTransformInspector.cs</p>
<pre class="textmate-source"><span class="source source_csharp"><span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">UnityEngine</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">UnityEditor</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">System.Collections</span>;</span>

[<span class="support support_class support_class_unity">CustomEditor</span> (<span class="keyword keyword_operator keyword_operator_csharp">typeof</span> (<span class="support support_class support_class_unity">Transform</span>))]
<span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">class</span> CopyTransformInspector : CopyInspector
{
<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public override </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">OnInspectorGUI</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        <span class="support support_class support_class_unity">Transform</span> transform;
        <span class="support support_class support_class_unity">Vector3</span> localPosition, localScale;
        <span class="support support_class support_class_unity">Quaternion</span> localRotation;

        transform = target <span class="keyword keyword_operator keyword_operator_csharp">as</span> <span class="support support_class support_class_unity">Transform</span>;

        localPosition = <span class="support support_class support_class_unity">EditorGUILayout</span>.Vector3Field ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Position</span>", transform.localPosition);
        localRotation = <span class="support support_class support_class_unity">Quaternion</span>.Euler (<span class="support support_class support_class_unity">EditorGUILayout</span>.Vector3Field ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Rotation</span>", transform.localRotation.eulerAngles));
        localScale = <span class="support support_class support_class_unity">EditorGUILayout</span>.Vector3Field ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Scale</span>", transform.localScale);

        <span class="keyword keyword_control keyword_control_csharp">if</span> (<span class="support support_class support_class_unity">GUI</span>.changed)
        {
            transform.localPosition = localPosition;
            transform.localRotation = localRotation;
            transform.localScale = localScale;
        }

        OnCopyInspectorGUI ();
    }
}</span></pre>
<p>CopyYourComponentTypeInspector.cs</p>
<pre class="textmate-source"><span class="source source_csharp"><span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">UnityEngine</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">UnityEditor</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">System.Collections</span>;</span>

[<span class="support support_class support_class_unity">CustomEditor</span> (<span class="keyword keyword_operator keyword_operator_csharp">typeof</span> (YourComponentType))]
<span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">class</span> CopyYourComponentTypeInspector : CopyInspector{}</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://eej.dk/angryant/general/tipsandtricks/copyinspector/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Magnetic</title>
		<link>http://eej.dk/angryant/general/tipsandtricks/magnetic/</link>
		<comments>http://eej.dk/angryant/general/tipsandtricks/magnetic/#comments</comments>
		<pubDate>Sun, 04 Oct 2009 12:57:41 +0000</pubDate>
		<dc:creator>AngryAnt</dc:creator>
				<category><![CDATA[Tips and tricks]]></category>

		<guid isPermaLink="false">http://eej.dk/angryant/?p=317</guid>
		<description><![CDATA[You know how Little Big Planet, Kingdom Hearts and similar have various pickups move towards your character when you get up close? Yea I also find that&#8217;s a nice bit of polish.
One way of getting that up and running in Unity is via the code below. Setup:

Add all objects you want to get attracted to [...]]]></description>
			<content:encoded><![CDATA[<p>You know how Little Big Planet, Kingdom Hearts and similar have various pickups move towards your character when you get up close? Yea I also find that&#8217;s a nice bit of polish.</p>
<p>One way of getting that up and running in Unity is via the code below. Setup:</p>
<ol>
<li>Add all objects you want to get attracted to the player to a special layer.</li>
<li>Attach the script below to your player.</li>
<li>Set the layer mask on the component to include the layer from step one.</li>
<li>Tweak, play, repeat.</li>
</ol>
<p>&nbsp;<br />
<br />
Magnetic.cs:</p>
<pre class="textmate-source idle"><span class="source source_csharp"><span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">UnityEngine</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">System.Collections</span>;</span>

<span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">class</span> Magnetic : <span class="support support_class support_class_unity">MonoBehaviour</span>
{
    <span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="support support_class support_class_unity">LayerMask</span> m_MagneticLayers;
    <span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="support support_class support_class_unity">Vector3</span> m_Position;
    <span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">float</span> m_Radius;
    <span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">float</span> m_Force;

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">FixedUpdate</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        <span class="support support_class support_class_unity">Collider</span>[] colliders;
        <span class="support support_class support_class_unity">Rigidbody</span> rigidbody;

        colliders = <span class="support support_class support_class_unity">Physics</span>.OverlapSphere (transform.position + m_Position, m_Radius, m_MagneticLayers);
        <span class="keyword keyword_control keyword_control_csharp">foreach</span> (<span class="support support_class support_class_unity">Collider</span> collider <span class="storage storage_modifier storage_modifier_csharp">in</span> colliders)
        {
            rigidbody = (<span class="support support_class support_class_unity">Rigidbody</span>) collider.gameObject.GetComponent (<span class="keyword keyword_operator keyword_operator_csharp">typeof</span> (<span class="support support_class support_class_unity">Rigidbody</span>));
            <span class="keyword keyword_control keyword_control_csharp">if</span> (rigidbody == <span class="constant constant_language constant_language_csharp">null</span>)
            {
                <span class="keyword keyword_control keyword_control_csharp">continue</span>;
            }
            rigidbody.AddExplosionForce (m_Force * -<span class="constant constant_numeric constant_numeric_csharp">1</span>, transform.position + m_Position, m_Radius);
        }
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">OnDrawGizmosSelected</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        <span class="support support_class support_class_unity">Gizmos</span>.color = <span class="support support_class support_class_unity">Color</span>.red;
        <span class="support support_class support_class_unity">Gizmos</span>.DrawWireSphere (transform.position + m_Position, m_Radius);
    }
}</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://eej.dk/angryant/general/tipsandtricks/magnetic/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>GUI drag-drop</title>
		<link>http://eej.dk/angryant/general/tipsandtricks/gui-drag-drop/</link>
		<comments>http://eej.dk/angryant/general/tipsandtricks/gui-drag-drop/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 12:10:03 +0000</pubDate>
		<dc:creator>AngryAnt</dc:creator>
				<category><![CDATA[Tips and tricks]]></category>

		<guid isPermaLink="false">http://eej.dk/angryant/?p=301</guid>
		<description><![CDATA[A lot of people have been asking for tips on how to implement drag-drop functionality in Unity GUI scripting, so I decided to put together a reusable script for the purpose.
Basically the solution requires that your data class derives from GUIDraggableObject and at some point in its OnGUI method call Drag( Rect ) &#8211; just [...]]]></description>
			<content:encoded><![CDATA[<p>A lot of people have been asking for tips on how to implement drag-drop functionality in Unity GUI scripting, so I decided to put together a reusable script for the purpose.</p>
<p>Basically the solution requires that your data class derives from GUIDraggableObject and at some point in its OnGUI method call Drag( Rect ) &#8211; just like GUI.Window handles dragging.</p>
<p>Right. Codez. First off the GUIDraggableObject.cs file:<br />&nbsp;</p>
<pre class="textmate-source idle"><span class="source source_csharp"><span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">UnityEngine</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">System.Collections</span>;</span>

<span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">class</span> GUIDraggableObject
{
    <span class="storage storage_modifier storage_modifier_csharp">protected</span> <span class="support support_class support_class_unity">Vector2</span> m_Position;
    <span class="storage storage_modifier storage_modifier_csharp">private</span> <span class="support support_class support_class_unity">Vector2</span> m_DragStart;
    <span class="storage storage_modifier storage_modifier_csharp">private</span> <span class="storage storage_type storage_type_csharp">bool</span> m_Dragging;

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_type storage_type_csharp">public</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">GUIDraggableObject</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(<span class="support support_class support_class_unity">Vector2</span> position</span>)</span>
    {
        m_Position = position;
    }

    <span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">bool</span> Dragging
    {
        <span class="keyword keyword_other keyword_other_csharp">get</span>
        {
            <span class="keyword keyword_control keyword_control_csharp">return</span> m_Dragging;
        }
    }

    <span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="support support_class support_class_unity">Vector2</span> Position
    {
        <span class="keyword keyword_other keyword_other_csharp">get</span>
        {
            <span class="keyword keyword_control keyword_control_csharp">return</span> m_Position;
        }

        <span class="keyword keyword_other keyword_other_csharp">set</span>
        {
            m_Position = <span class="keyword keyword_other keyword_other_csharp">value</span>;
        }
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">Drag</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(<span class="support support_class support_class_unity">Rect</span> draggingRect</span>)</span>
    {
        <span class="keyword keyword_control keyword_control_csharp">if</span> (<span class="support support_class support_class_unity">Event</span>.current.type == <span class="support support_class support_class_unity">EventType</span>.MouseUp)
        {
            m_Dragging = <span class="constant constant_language constant_language_csharp">false</span>;
        }
        <span class="keyword keyword_control keyword_control_csharp">else</span> <span class="keyword keyword_control keyword_control_csharp">if</span> (<span class="support support_class support_class_unity">Event</span>.current.type == <span class="support support_class support_class_unity">EventType</span>.MouseDown &amp;&amp; draggingRect.Contains (<span class="support support_class support_class_unity">Event</span>.current.mousePosition))
        {
            m_Dragging = <span class="constant constant_language constant_language_csharp">true</span>;
            m_DragStart = <span class="support support_class support_class_unity">Event</span>.current.mousePosition - m_Position;
            <span class="support support_class support_class_unity">Event</span>.current.Use();
        }

        <span class="keyword keyword_control keyword_control_csharp">if</span> (m_Dragging)
        {
            m_Position = <span class="support support_class support_class_unity">Event</span>.current.mousePosition - m_DragStart;
        }
    }
}</span></pre>
<p>&nbsp;<br />
An example data class inheriting from GUIDraggableObject &#8211; DataObject.cs:<br />&nbsp;</p>
<pre class="textmate-source idle"><span class="source source_csharp"><span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">UnityEngine</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">System.Collections</span>;</span>

<span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">class</span> DataObject : GUIDraggableObject
<span class="comment comment_line comment_line_double-slash comment_line_double-slash_csharp">// This class just has the capability of being dragged in GUI - it could be any type of generic data class</span>
{
    <span class="storage storage_modifier storage_modifier_csharp">private</span> <span class="storage storage_type storage_type_csharp">string</span> m_Name;
    <span class="storage storage_modifier storage_modifier_csharp">private</span> <span class="storage storage_type storage_type_csharp">int</span> m_Value;

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_type storage_type_csharp">public</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">DataObject</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(<span class="storage storage_type storage_type_csharp">string</span> name, <span class="storage storage_type storage_type_csharp">int</span> <span class="keyword keyword_other keyword_other_csharp">value</span>, <span class="support support_class support_class_unity">Vector2</span> position</span>)</span> : <span class="constant constant_language constant_language_csharp">base</span> (position)
    {
        m_Name = name;
        m_Value = <span class="keyword keyword_other keyword_other_csharp">value</span>;
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">OnGUI</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        <span class="support support_class support_class_unity">Rect</span> drawRect = <span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">Rect</span> (m_Position.x, m_Position.y, <span class="constant constant_numeric constant_numeric_csharp">100.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">100.0f</span>), dragRect;

        <span class="support support_class support_class_unity">GUILayout</span>.BeginArea (drawRect, <span class="support support_class support_class_unity">GUI</span>.skin.GetStyle ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Box</span>"));
            <span class="support support_class support_class_unity">GUILayout</span>.Label (m_Name, <span class="support support_class support_class_unity">GUI</span>.skin.GetStyle ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Box</span>"), <span class="support support_class support_class_unity">GUILayout</span>.ExpandWidth (<span class="constant constant_language constant_language_csharp">true</span>));

            dragRect = <span class="support support_class support_class_unity">GUILayoutUtility</span>.GetLastRect ();
            dragRect = <span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">Rect</span> (dragRect.x + m_Position.x, dragRect.y + m_Position.y, dragRect.width, dragRect.height);

            <span class="keyword keyword_control keyword_control_csharp">if</span> (Dragging)
            {
                <span class="support support_class support_class_unity">GUILayout</span>.Label ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Wooo...</span>");
            }
            <span class="keyword keyword_control keyword_control_csharp">else</span> <span class="keyword keyword_control keyword_control_csharp">if</span> (<span class="support support_class support_class_unity">GUILayout</span>.Button ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Yes!</span>"))
            {
                <span class="support support_class support_class_unity">Debug</span>.Log ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Yes. It is </span>" + m_Value + "<span class="string string_quoted string_quoted_double string_quoted_double_csharp">!</span>");
            }
        <span class="support support_class support_class_unity">GUILayout</span>.EndArea ();

        Drag (dragRect);
    }
}</span></pre>
<p>&nbsp;<br />
And finally, this script demonstrates how you could have your data manager class use Unity GUI for data visualisation with drag-drop enabled &#8211; MyMonoBehaviour.cs:<br />&nbsp;</p>
<pre class="textmate-source idle"><span class="source source_csharp"><span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">UnityEngine</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">System.Collections</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">System.Collections.Generic</span>;</span>

<span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">class</span> MyMonoBehaviour : <span class="support support_class support_class_unity">MonoBehaviour</span>
{
    <span class="storage storage_modifier storage_modifier_csharp">private</span> List&lt; DataObject &gt; m_Data = <span class="keyword keyword_control keyword_control_csharp">new</span> List&lt; DataObject &gt; ();
    <span class="storage storage_modifier storage_modifier_csharp">private</span> <span class="support support_class support_class_unity">Rect</span> dropTargetRect = <span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">Rect</span> (<span class="constant constant_numeric constant_numeric_csharp">10.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">30.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">30.0f</span>);

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">Awake</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        m_Data.Add (<span class="keyword keyword_control keyword_control_csharp">new</span> DataObject ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">One</span>", <span class="constant constant_numeric constant_numeric_csharp">1</span>, <span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">Vector2</span> (<span class="constant constant_numeric constant_numeric_csharp">20.0f</span> * <span class="support support_class support_class_unity">Random</span>.Range (<span class="constant constant_numeric constant_numeric_csharp">1.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>), <span class="constant constant_numeric constant_numeric_csharp">20.0f</span> * <span class="support support_class support_class_unity">Random</span>.Range (<span class="constant constant_numeric constant_numeric_csharp">1.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>))));
        m_Data.Add (<span class="keyword keyword_control keyword_control_csharp">new</span> DataObject ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Two</span>", <span class="constant constant_numeric constant_numeric_csharp">2</span>, <span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">Vector2</span> (<span class="constant constant_numeric constant_numeric_csharp">20.0f</span> * <span class="support support_class support_class_unity">Random</span>.Range (<span class="constant constant_numeric constant_numeric_csharp">1.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>), <span class="constant constant_numeric constant_numeric_csharp">20.0f</span> * <span class="support support_class support_class_unity">Random</span>.Range (<span class="constant constant_numeric constant_numeric_csharp">1.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>))));
        m_Data.Add (<span class="keyword keyword_control keyword_control_csharp">new</span> DataObject ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Three</span>", <span class="constant constant_numeric constant_numeric_csharp">3</span>, <span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">Vector2</span> (<span class="constant constant_numeric constant_numeric_csharp">20.0f</span> * <span class="support support_class support_class_unity">Random</span>.Range (<span class="constant constant_numeric constant_numeric_csharp">1.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>), <span class="constant constant_numeric constant_numeric_csharp">20.0f</span> * <span class="support support_class support_class_unity">Random</span>.Range (<span class="constant constant_numeric constant_numeric_csharp">1.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>))));
        m_Data.Add (<span class="keyword keyword_control keyword_control_csharp">new</span> DataObject ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Four</span>", <span class="constant constant_numeric constant_numeric_csharp">4</span>, <span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">Vector2</span> (<span class="constant constant_numeric constant_numeric_csharp">20.0f</span> * <span class="support support_class support_class_unity">Random</span>.Range (<span class="constant constant_numeric constant_numeric_csharp">1.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>), <span class="constant constant_numeric constant_numeric_csharp">20.0f</span> * <span class="support support_class support_class_unity">Random</span>.Range (<span class="constant constant_numeric constant_numeric_csharp">1.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>))));
        m_Data.Add (<span class="keyword keyword_control keyword_control_csharp">new</span> DataObject ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Five</span>", <span class="constant constant_numeric constant_numeric_csharp">5</span>, <span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">Vector2</span> (<span class="constant constant_numeric constant_numeric_csharp">20.0f</span> * <span class="support support_class support_class_unity">Random</span>.Range (<span class="constant constant_numeric constant_numeric_csharp">1.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>), <span class="constant constant_numeric constant_numeric_csharp">20.0f</span> * <span class="support support_class support_class_unity">Random</span>.Range (<span class="constant constant_numeric constant_numeric_csharp">1.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>))));
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">OnGUI</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        DataObject toFront, dropDead;
        <span class="support support_class support_class_unity">Color</span> color;

        <span class="support support_class support_class_unity">GUI</span>.Box(dropTargetRect, "<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Die</span>");

        toFront = dropDead = <span class="constant constant_language constant_language_csharp">null</span>;
        <span class="keyword keyword_control keyword_control_csharp">foreach</span> (DataObject data <span class="storage storage_modifier storage_modifier_csharp">in</span> m_Data)
        {
            color = <span class="support support_class support_class_unity">GUI</span>.color;

            <span class="keyword keyword_control keyword_control_csharp">if</span> (data.Dragging)
            {
                <span class="support support_class support_class_unity">GUI</span>.color = dropTargetRect.Contains (<span class="support support_class support_class_unity">Event</span>.current.mousePosition) ? <span class="support support_class support_class_unity">Color</span>.red : color;
            }

            data.OnGUI ();

            <span class="support support_class support_class_unity">GUI</span>.color = color;

            <span class="keyword keyword_control keyword_control_csharp">if</span> (data.Dragging)
            {
                <span class="keyword keyword_control keyword_control_csharp">if</span> (m_Data.IndexOf (data) != m_Data.Count - <span class="constant constant_numeric constant_numeric_csharp">1</span>)
                {
                    toFront = data;
                }
            }
        }

        <span class="keyword keyword_control keyword_control_csharp">if</span> (toFront != <span class="constant constant_language constant_language_csharp">null</span>)
        <span class="comment comment_line comment_line_double-slash comment_line_double-slash_csharp">// Move an object to front if needed</span>
        {
            m_Data.Remove (toFront);
            m_Data.Add (toFront);
        }
    }
}
</span></pre>
<p>&nbsp;<br />
Ah yea and an example of how you could do the same in an editor window &#8211; MyEditorWindow.cs:<br />&nbsp;</p>
<pre class="textmate-source idle"><span class="source source_csharp"><span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">UnityEngine</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">UnityEditor</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">System.Collections</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">System.Collections.Generic</span>;</span>

<span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">class</span> MyEditorWindow : <span class="support support_class support_class_unity">EditorWindow</span>
{
    <span class="storage storage_modifier storage_modifier_csharp">private</span> List&lt; DataObject &gt; m_Data = <span class="keyword keyword_control keyword_control_csharp">new</span> List&lt; DataObject &gt; ();
    <span class="storage storage_modifier storage_modifier_csharp">private</span> <span class="storage storage_type storage_type_csharp">bool</span> doRepaint = <span class="constant constant_language constant_language_csharp">false</span>;
    <span class="storage storage_modifier storage_modifier_csharp">private</span> <span class="support support_class support_class_unity">Rect</span> dropTargetRect = <span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">Rect</span> (<span class="constant constant_numeric constant_numeric_csharp">10.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">30.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">30.0f</span>);

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_type storage_type_csharp">public</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">MyEditorWindow</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        m_Data.Add (<span class="keyword keyword_control keyword_control_csharp">new</span> DataObject ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">One</span>", <span class="constant constant_numeric constant_numeric_csharp">1</span>, <span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">Vector2</span> (<span class="constant constant_numeric constant_numeric_csharp">20.0f</span> * <span class="support support_class support_class_unity">Random</span>.Range (<span class="constant constant_numeric constant_numeric_csharp">1.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>), <span class="constant constant_numeric constant_numeric_csharp">20.0f</span> * <span class="support support_class support_class_unity">Random</span>.Range (<span class="constant constant_numeric constant_numeric_csharp">1.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>))));
        m_Data.Add (<span class="keyword keyword_control keyword_control_csharp">new</span> DataObject ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Two</span>", <span class="constant constant_numeric constant_numeric_csharp">2</span>, <span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">Vector2</span> (<span class="constant constant_numeric constant_numeric_csharp">20.0f</span> * <span class="support support_class support_class_unity">Random</span>.Range (<span class="constant constant_numeric constant_numeric_csharp">1.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>), <span class="constant constant_numeric constant_numeric_csharp">20.0f</span> * <span class="support support_class support_class_unity">Random</span>.Range (<span class="constant constant_numeric constant_numeric_csharp">1.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>))));
        m_Data.Add (<span class="keyword keyword_control keyword_control_csharp">new</span> DataObject ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Three</span>", <span class="constant constant_numeric constant_numeric_csharp">3</span>, <span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">Vector2</span> (<span class="constant constant_numeric constant_numeric_csharp">20.0f</span> * <span class="support support_class support_class_unity">Random</span>.Range (<span class="constant constant_numeric constant_numeric_csharp">1.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>), <span class="constant constant_numeric constant_numeric_csharp">20.0f</span> * <span class="support support_class support_class_unity">Random</span>.Range (<span class="constant constant_numeric constant_numeric_csharp">1.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>))));
        m_Data.Add (<span class="keyword keyword_control keyword_control_csharp">new</span> DataObject ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Four</span>", <span class="constant constant_numeric constant_numeric_csharp">4</span>, <span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">Vector2</span> (<span class="constant constant_numeric constant_numeric_csharp">20.0f</span> * <span class="support support_class support_class_unity">Random</span>.Range (<span class="constant constant_numeric constant_numeric_csharp">1.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>), <span class="constant constant_numeric constant_numeric_csharp">20.0f</span> * <span class="support support_class support_class_unity">Random</span>.Range (<span class="constant constant_numeric constant_numeric_csharp">1.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>))));
        m_Data.Add (<span class="keyword keyword_control keyword_control_csharp">new</span> DataObject ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Five</span>", <span class="constant constant_numeric constant_numeric_csharp">5</span>, <span class="keyword keyword_control keyword_control_csharp">new</span> <span class="support support_class support_class_unity">Vector2</span> (<span class="constant constant_numeric constant_numeric_csharp">20.0f</span> * <span class="support support_class support_class_unity">Random</span>.Range (<span class="constant constant_numeric constant_numeric_csharp">1.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>), <span class="constant constant_numeric constant_numeric_csharp">20.0f</span> * <span class="support support_class support_class_unity">Random</span>.Range (<span class="constant constant_numeric constant_numeric_csharp">1.0f</span>, <span class="constant constant_numeric constant_numeric_csharp">10.0f</span>))));
    }

    [<span class="support support_class support_class_unity">MenuItem</span> ("<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Window/MyEditorWindow</span>")]
<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public static </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">Launch</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        GetWindow (<span class="keyword keyword_operator keyword_operator_csharp">typeof</span> (MyEditorWindow)).Show ();
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">Update</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        <span class="keyword keyword_control keyword_control_csharp">if</span> (doRepaint)
        {
            Repaint ();
        }
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">public </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">OnGUI</span> <span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">(</span>)</span>
    {
        DataObject toFront, dropDead;
        <span class="storage storage_type storage_type_csharp">bool</span> previousState, flipRepaint;
        <span class="support support_class support_class_unity">Color</span> color;

        <span class="support support_class support_class_unity">GUI</span>.Box(dropTargetRect, "<span class="string string_quoted string_quoted_double string_quoted_double_csharp">Die</span>");

        toFront = dropDead = <span class="constant constant_language constant_language_csharp">null</span>;
        doRepaint = <span class="constant constant_language constant_language_csharp">false</span>;
        flipRepaint = <span class="constant constant_language constant_language_csharp">false</span>;
        <span class="keyword keyword_control keyword_control_csharp">foreach</span> (DataObject data <span class="storage storage_modifier storage_modifier_csharp">in</span> m_Data)
        {
            previousState = data.Dragging;

            color = <span class="support support_class support_class_unity">GUI</span>.color;

            <span class="keyword keyword_control keyword_control_csharp">if</span> (previousState)
            {
                <span class="support support_class support_class_unity">GUI</span>.color = dropTargetRect.Contains (<span class="support support_class support_class_unity">Event</span>.current.mousePosition) ? <span class="support support_class support_class_unity">Color</span>.red : color;
            }

            data.OnGUI ();

            <span class="support support_class support_class_unity">GUI</span>.color = color;

            <span class="keyword keyword_control keyword_control_csharp">if</span> (data.Dragging)
            {
                doRepaint = <span class="constant constant_language constant_language_csharp">true</span>;

                <span class="keyword keyword_control keyword_control_csharp">if</span> (m_Data.IndexOf (data) != m_Data.Count - <span class="constant constant_numeric constant_numeric_csharp">1</span>)
                {
                    toFront = data;
                }
            }
            <span class="keyword keyword_control keyword_control_csharp">else</span> <span class="keyword keyword_control keyword_control_csharp">if</span> (previousState)
            {
                flipRepaint = <span class="constant constant_language constant_language_csharp">true</span>;

                <span class="keyword keyword_control keyword_control_csharp">if</span> (dropTargetRect.Contains (<span class="support support_class support_class_unity">Event</span>.current.mousePosition))
                {
                    dropDead = data;
                }
            }
        }

        <span class="keyword keyword_control keyword_control_csharp">if</span> (toFront != <span class="constant constant_language constant_language_csharp">null</span>)
        <span class="comment comment_line comment_line_double-slash comment_line_double-slash_csharp">// Move an object to front if needed</span>
        {
            m_Data.Remove (toFront);
            m_Data.Add (toFront);
        }

        <span class="keyword keyword_control keyword_control_csharp">if</span> (dropDead != <span class="constant constant_language constant_language_csharp">null</span>)
        <span class="comment comment_line comment_line_double-slash comment_line_double-slash_csharp">// Destroy an object if needed</span>
        {
            m_Data.Remove (dropDead);
        }

        <span class="keyword keyword_control keyword_control_csharp">if</span> (flipRepaint)
        <span class="comment comment_line comment_line_double-slash comment_line_double-slash_csharp">// If some object just stopped being dragged, we should repaing for the state change</span>
        {
            Repaint ();
        }
    }
}</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://eej.dk/angryant/general/tipsandtricks/gui-drag-drop/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Logging an entire GameObject</title>
		<link>http://eej.dk/angryant/general/tipsandtricks/logging-an-entire-gameobject/</link>
		<comments>http://eej.dk/angryant/general/tipsandtricks/logging-an-entire-gameobject/#comments</comments>
		<pubDate>Thu, 17 Sep 2009 15:01:16 +0000</pubDate>
		<dc:creator>AngryAnt</dc:creator>
				<category><![CDATA[Tips and tricks]]></category>

		<guid isPermaLink="false">http://eej.dk/angryant/?p=291</guid>
		<description><![CDATA[More stuff from the shadowy corners of my hard-drive. Don&#8217;t remember the context, but someone needed to log every single piece of information available on a particular GameObject. I suppose this could be useful for end-user &#8220;This GameObject Just Went Completely FUBAR&#8221; &#8482; scenarios.
Anyway &#8211; it has reflection in it which by definition makes it [...]]]></description>
			<content:encoded><![CDATA[<p>More stuff from the shadowy corners of my hard-drive. Don&#8217;t remember the context, but someone needed to log every single piece of information available on a particular GameObject. I suppose this could be useful for end-user &#8220;This GameObject Just Went Completely FUBAR&#8221; &#8482; scenarios.</p>
<p>Anyway &#8211; it has reflection in it which by definition makes it cool.</p>
<p>Le codez:</p>
<pre class="textmate-source idle"><span class="source source_csharp"><span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">UnityEngine</span>;</span>
<span class="meta meta_keyword meta_keyword_using meta_keyword_using_csharp"><span class="keyword keyword_other keyword_other_using">using</span> <span class="entity entity_name entity_name_package entity_name_package_csharp">System.Reflection</span>;</span>

<span class="storage storage_modifier storage_modifier_csharp">public</span> <span class="storage storage_type storage_type_csharp">class</span> Utilities
{
    <span class="comment comment_block comment_block_csharp">/* ... */</span>

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">static </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">LogGameObject</span><span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">( <span class="support support_class support_class_unity">GameObject</span> gameObject, <span class="storage storage_type storage_type_csharp">bool</span> children </span>)</span>
    {
        <span class="support support_class support_class_unity">Component</span>[] components = gameObject.GetComponents( <span class="keyword keyword_operator keyword_operator_csharp">typeof</span>( <span class="support support_class support_class_unity">Component</span> ) );
        FieldInfo[] fields;
        PropertyInfo[] properties;

        <span class="support support_class support_class_unity">Debug</span>.Log( gameObject.name + "<span class="string string_quoted string_quoted_double string_quoted_double_csharp">:</span>" );

        <span class="keyword keyword_control keyword_control_csharp">foreach</span>( <span class="support support_class support_class_unity">Component</span> component <span class="storage storage_modifier storage_modifier_csharp">in</span> components )
        {
            <span class="support support_class support_class_unity">Debug</span>.Log( "<span class="string string_quoted string_quoted_double string_quoted_double_csharp"> - </span>" + component.GetType().Name + "<span class="string string_quoted string_quoted_double string_quoted_double_csharp">:</span>" );
            fields = component.GetType().GetFields();
            <span class="keyword keyword_control keyword_control_csharp">foreach</span>( FieldInfo field <span class="storage storage_modifier storage_modifier_csharp">in</span> fields )
            {
                <span class="support support_class support_class_unity">Debug</span>.Log( "<span class="string string_quoted string_quoted_double string_quoted_double_csharp"> .</span>" + field.Name + "<span class="string string_quoted string_quoted_double string_quoted_double_csharp"> = </span>" + field.GetValue( component ) );
            }

            properties = component.GetType().GetProperties();
            <span class="keyword keyword_control keyword_control_csharp">foreach</span>( PropertyInfo property <span class="storage storage_modifier storage_modifier_csharp">in</span> properties )
            {
                <span class="support support_class support_class_unity">Debug</span>.Log( "<span class="string string_quoted string_quoted_double string_quoted_double_csharp"> .</span>" + property.Name + "<span class="string string_quoted string_quoted_double string_quoted_double_csharp"> = </span>" + property.GetGetMethod().Invoke( component, <span class="constant constant_language constant_language_csharp">null</span> ) );
            }
        }

        <span class="keyword keyword_control keyword_control_csharp">if</span>( children )
        {
            <span class="keyword keyword_control keyword_control_csharp">foreach</span>( <span class="support support_class support_class_unity">Transform</span> transform <span class="storage storage_modifier storage_modifier_csharp">in</span> gameObject.transform )
            {
                <span class="support support_class support_class_unity">Debug</span>.Log( "<span class="string string_quoted string_quoted_double string_quoted_double_csharp">-&gt;</span>" );
                LogGameObject( transform.gameObject, children );
            }
        }
    }

<span class="meta meta_definition meta_definition_method meta_definition_method_csharp">    <span class="storage storage_modifier storage_modifier_csharp">static </span><span class="storage storage_type storage_type_csharp">void</span> <span class="entity entity_name entity_name_function entity_name_function_csharp">LogGameObject</span><span class="meta meta_definition meta_definition_param-list meta_definition_param-list_csharp">( <span class="support support_class support_class_unity">GameObject</span> gameObject </span>)</span>
    {
        LogGameObject( gameObject, <span class="constant constant_language constant_language_csharp">false</span> );
    }

    <span class="comment comment_block comment_block_csharp">/* ... */</span>
}</span></pre>
]]></content:encoded>
			<wfw:commentRss>http://eej.dk/angryant/general/tipsandtricks/logging-an-entire-gameobject/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
