<?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 &#187; Tips and tricks</title>
	<atom:link href="http://eej.dk/angryant/category/general/tipsandtricks/feed/" rel="self" type="application/rss+xml" />
	<link>http://eej.dk/angryant</link>
	<description>Game and -AI development</description>
	<lastBuildDate>Wed, 30 Nov 2011 22:41:06 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Assembling and assimilating</title>
		<link>http://eej.dk/angryant/general/tipsandtricks/assembling-and-assimilating/</link>
		<comments>http://eej.dk/angryant/general/tipsandtricks/assembling-and-assimilating/#comments</comments>
		<pubDate>Wed, 02 Feb 2011 08:10:43 +0000</pubDate>
		<dc:creator>AngryAnt</dc:creator>
				<category><![CDATA[Tips and tricks]]></category>

		<guid isPermaLink="false">http://eej.dk/angryant/?p=571</guid>
		<description><![CDATA[So this post has been delayed for quite a while&#8230; One question I got from many sources after my Advanced Editor Scripting talk with Adam Mechtley at Unite &#8217;10 was &#8220;so how did you do that assembly building thing?&#8221;. Well I did it before we had a port of MonoDevelop available, so my options were [...]]]></description>
			<content:encoded><![CDATA[<p>So this post has been delayed for quite a while&#8230; One question I got from many sources after my Advanced Editor Scripting talk with Adam Mechtley at Unite &#8217;10 was &#8220;so how did you do that assembly building thing?&#8221;.</p>
<p>Well I did it before we had a port of MonoDevelop available, so my options were limited. Now that we do have that port, you&#8217;ll be able to redo this exercise in there with some GUI drag-drop nicenessness. However, just because I can (and because it is healthy learning and lovely hacky) I will provide the command-line/perl script solution, which is still my approach.</p>
<p>First a quick &#8220;why&#8221;: As mentioned in my Unite talk, there are three reasons I wrap my projects in .net assemblies before distributing &#8211; and no it&#8217;s got nothing to do with keeping the source secure &#8211; assemblies are <b>easily</b> decompiled:</p>
<ul>
<li>Reduce deployment clutter. If I were to release Behave without being wrapped in assembly, it would span around 150 &#8211; 170 source files and textures in various folder configurations. Now I have two folders, three assemblies and about five script files.</li>
<li>Reduce funky bug reports. While .net assemblies are very easily disassembled, it does at least take some dedication to do so. More than it takes to randomly change something in a full source distribution when things don&#8217;t go your way. So assemblies help you get rid of a portion of those really long bug reports which end up with &#8220;oh, by the way, I changed this one thing in your distribution &#8211; you think that might have something to do with it?.</li>
<li>They can load in at runtime. This is really cool and quite useful if applicable to your scenario &#8211; for more information, check out this other tips and tricks post: <a href="http://angryant.com/general/tipsandtricks/downloading-the-hydra/" target="_parent">downloading the hydra</a>.</li>
</ul>
<p>In this post I am going to show you how to build your scripts into a .net assembly (.dll) and add it to your Unity project. And just to spice things up, lets take that in reverse: Once your assembly is built, copy that bastard into your Assets folder. Done.</p>
<p>Easy, right? Now, let&#8217;s take a look at the assembly building. And, before you start, yes this will run on all Unity supported platforms and no it does not require pro &#8211; run this on the base Unity license without issues.</p>
<h2>Setup</h2>
<p>So first off, if you are on windows, you&#8217;ll be needing a perl install. I usually got for ActivePerl. Not saying it is more awesomerer than anything else out there &#8211; just that I know it and it usually works just fine. If you are on OS X, you&#8217;re in luck, as perl comes preinstalled.</p>
<p>Now, let&#8217;s get perl hacking. This is in no way meant as a &#8220;my first perl script&#8221; guide. We&#8217;re just getting introduced to a means to an end &#8211; and it is not going to be pretty. So first off, create a new text file in your favorite text editor and save it as build.pl. Start the file off like so:</p>
<pre>#/usr/local/bin/perl

use strict;
use Getopt::Long;
use Term::ANSIColor;
use File::Basename;
use File::Spec;
chdir (File::Spec->rel2abs (dirname($0)));

our $compiler = "/Applications/Unity/Unity.app/Contents/Frameworks/Mono/bin/gmcs";
our $assemblyUnityEngine = "/Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEngine.dll";
our $assemblyUnityEditor = "/Applications/Unity/Unity.app/Contents/Frameworks/Managed/UnityEditor.dll";</pre>
<p>Now, that was a bit of a mouthful, but it should be pretty straight-forward. Lines three through eight include a lot of perl functionality we will be using later. And actually the last two ones are already used in line nine. Here we&#8217;re ensuring that the rest of the script is being executed in the context of the folder containing the file.</p>
<p>In the next few lines of interest, three variables are declared &#8211; pathes to the mono compiler shipped with Unity and the UnityEngine and UnityEditor assemblies. Notice that these are OS X pathes, for a windows setup (or if you installed Unity into a different folder than the default), you&#8217;ll need to correct these.</p>
<h2>Debug command-line parameter</h2>
<p>Next up, let&#8217;s add support for command-line parameters. &#8220;Why?&#8221; you ask &#8211; because they are going to be awesome for debugging our assembly later. The only command-line parameter we will be supporting for now is &#8220;&#8211;release&#8221;. This will basically let us toggle, when building the assembly, a bunch of logging and other stuff on or off. This is what it looks like:</p>
<pre>my $optionRelease = 0;

GetOptions (
	"release" => \$optionRelease
);</pre>
<p>We declare a variable named optionRelease, initialize it to zero and then call GetOptions, telling it to pass data on the use of the &#8220;release&#8221; parameter into our variable. Now, GetOptions has a bunch of functionality, but the way we use it here, it simply assigns one or zero to our variable &#8211; depending on whether the parameter is used or not.</p>
<p>Next up, we need to use this variable to affect the parameters we pass to the gmcs compiler. Like so:</p>
<pre>my $debugOptions = $optionRelease == 0 ? "-d:DEBUG" : "";</pre>
<p>The idea here is that gmcs takes a parameter -d:[name] which instructs it to, during pre-processing, run with the symbol [name] defined. Something we can work with in our code like this:</p>
<pre>#if DEBUG
	Debug.Log ("I'm only visible in debug builds!");
#endif</pre>
<h2>Building two assemblies</h2>
<p>Next up, a bit of info. Since Unity 3, we&#8217;ve enforced that scripts and assembly depending on UnityEditor, even if not using that, cannot be included in builds. This means that if you have some editor scripts, you would also like built to assembly, you will need to split these out into a different assembly than the one containing your runtime scripts.</p>
<p>Lets&#8217;s assume that is the case for this exercise, that the runtime scripts are located in Source/ and that the editor scripts are located in Source/Editor. So we will have to build two assemblies. That could mean code duplication, which should cause anyone pain, so let&#8217;s be nice and wrap some of the building up in a perl subroutine:</p>
<pre>sub BuildAssembly
{
	our $compiler;

	my $target = shift;
	my $out = shift;
	my $arguments = shift;
	my $source = shift;

	print ("Compiling $out\n");
	print color ("blue"), "$compiler -target:$target -out:$out $arguments $source\n";
	print color ("red");
	system ("$compiler -target:$target -out:$out $arguments $source") and die ("Compilation of $out failed.");
	print color ("reset");
}</pre>
<p>Let&#8217;s take this subroutine line by line. First off we pull in the global variable &#8220;compiler&#8221;. After this, we populate the variables target, out, arguments and source from subroutine parameters. With these at hand, the fun begins. First off, we print out the name of our build target (MyAwesome.dll) and the command we&#8217;re planning to execute &#8211; marked in fashionable blue.</p>
<p>Second we actually do the building &#8211; colouring any compiler output red (no news is good news &#8211; output is bad). If compilation fails, we kill the script &#8211; allowing the user to take action. If all went well, we remember to reset the colouring before returning from the subroutine.</p>
<p>So how about some use of this subroutine, eh?</p>
<pre>BuildAssembly ("library", "Awesomenessness.Runtime.dll", "Source/*.cs", "-d:RUNTIME $debugOptions -r:$assemblyUnityEngine");
BuildAssembly ("library", "Awesomenessness.Editor.dll", "Source/Editor/*.cs", "-d:EDITOR $debugOptions -r:Awesomenessness.Runtime.dll,$assemblyUnityEngine,$assemblyUnityEditor");</pre>
<p>As you see, we first build the runtime assembly from Source/*.cs, with the RUNTIME and optionally the DEBUG symbol defined. We also make sure to include the UnityEngine assembly in the building, so that you can reference stuff from the UnityEngine namespace.</p>
<p>In the second line, we build the editor assembly &#8211; containing all our editor code from Source/Editor/*.cs. This time we define the EDITOR and optionally the DEBUG symbol during building. This assembly references not only the UnityEngine assembly, but also the UnityEditor one and the runtime assembly which was just built in the line above.</p>
<h2>Distribution</h2>
<p>And that&#8217;s about it! As mentioned early in this post, all you need to do in order to include these assemblies in your project is to drag them into your assets folder, but if you&#8217;re very nice, you could just make that copy a part of the build script:</p>
<pre>system ("cp Awesomenessness.Runtime.dll Test\\ project/Assets/Awesomenessness");
system ("cp Awesomenessness.Editor.dll Test\\ project/Assets/Awesomenessness/Editor");</pre>
<p>Notice that this uses the OS X cp command-line tool. For windows, replace with equivalent.</p>
<h2>Limitation: Editor classes in assemblies</h2>
<p>While MonoBehaviours can live just fine in assemblies, editor scripts (ScriptableObject derived classes) come with a limitation (currently still active, as of Unity 3.1): You can not initialize these classes via UnityEditor API calls. That would be calls like ScriptableObject.CreateInstance and EditorWindow.GetWindow.</p>
<p>However &#8211; you can create instances of classes via &#8220;new&#8221; just fine and you can derive scripts located outside of the assembly and instantiate those via UnityEditor calls without incident. Say for example that MyEditorWindow derives from EditorWindow and is located in an assembly. Now I cannot instantiate it via GetWindow, but if I create a .cs file in my assets folder containing a class which does nothing but inherit from MyEditorWindow, then that class can be instantiated via GetWindow just fine and will have the exact same behaviour.</p>
<h2>Extra trick: Including resources in the assembly</h2>
<p>For extra points, you can include resources, such as textures, in your assembly. This has the bonus of limiting the clutter of your distribution even more.</p>
<p>Including the resource in your build is as simple as appending the &#8220;-resource:[path]&#8221; parameter to your gmcs build command. This will add the bytes into the assembly manifest &#8211; under the name of the original file. You can fetch these bytes at runtime, using that name. For example, here&#8217;s some utility methods for fetching textures:</p>
<pre>public static Stream GetResourceStream (string resourceName, Assembly assembly)
{
	if (assembly == null)
	{
		assembly = Assembly.GetExecutingAssembly ();
	}

	return assembly.GetManifestResourceStream (resourceName);
}

public static Stream GetResourceStream (string resourceName)
{
	return GetResourceStream (resourceName, null);
}

public static byte[] GetByteResource (string resourceName, Assembly assembly)
{
	Stream byteStream = GetResourceStream (resourceName, assembly);
	byte[] buffer = new byte[byteStream.Length];
	byteStream.Read (buffer, 0, (int)byteStream.Length);
	byteStream.Close ();

	return buffer;
}

public static byte[] GetByteResource (string resourceName)
{
	return GetByteResource (resourceName, null);
}

public static Texture2D GetTextureResource (string resourceName, Assembly assembly)
{
	Texture2D texture = new Texture2D (4, 4);
	texture.LoadImage (GetByteResource (resourceName, assembly));

	return texture;
}

public static Texture2D GetTextureResource (string resourceName)
{
	return GetTextureResource (resourceName, null);
}</pre>
<p>Given that you added &#8220;-resource:path/to/Logo.png&#8221; to your gmcs build command, you will with the above utility methods be able to fetch that into a texture like so:</p>
<pre>Texture2D logoTexture = GetTextureResource ("Logo.png");</pre>
<p>Well, I hope you guys found some of this useful! I&#8217;ll see if I can&#8217;t do a follow-up on how to do this in MonoDevelop.</p>
<div id="tweetbutton571" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Feej.dk%2Fangryant%2Fgeneral%2Ftipsandtricks%2Fassembling-and-assimilating%2F&amp;text=Assembling%20and%20assimilating&amp;related=AngryAnt&amp;lang=en&amp;count=none&amp;counturl=http%3A%2F%2Feej.dk%2Fangryant%2Fgeneral%2Ftipsandtricks%2Fassembling-and-assimilating%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://eej.dk/angryant/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div>]]></content:encoded>
			<wfw:commentRss>http://eej.dk/angryant/general/tipsandtricks/assembling-and-assimilating/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<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. [...]]]></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>
<div id="tweetbutton399" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Feej.dk%2Fangryant%2Fgeneral%2Ftipsandtricks%2Ffaff-cleanup-sketch%2F&amp;text=FAFF%20cleanup%3A%20Sketch&amp;related=AngryAnt&amp;lang=en&amp;count=none&amp;counturl=http%3A%2F%2Feej.dk%2Fangryant%2Fgeneral%2Ftipsandtricks%2Ffaff-cleanup-sketch%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://eej.dk/angryant/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div>]]></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 building [...]]]></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>
<div id="tweetbutton389" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Feej.dk%2Fangryant%2Fgeneral%2Ftipsandtricks%2Fbuilding-a-menu-of-delegates-and-enums%2F&amp;text=Building%20a%20menu%20of%20delegates%20and%20enums&amp;related=AngryAnt&amp;lang=en&amp;count=none&amp;counturl=http%3A%2F%2Feej.dk%2Fangryant%2Fgeneral%2Ftipsandtricks%2Fbuilding-a-menu-of-delegates-and-enums%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://eej.dk/angryant/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div>]]></content:encoded>
			<wfw:commentRss>http://eej.dk/angryant/general/tipsandtricks/building-a-menu-of-delegates-and-enums/feed/</wfw:commentRss>
		<slash:comments>8</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 [...]]]></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>
<div id="tweetbutton376" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Feej.dk%2Fangryant%2Fgeneral%2Ftipsandtricks%2Fpick-me-pick-me%2F&amp;text=Pick%20me%21%20Pick%20me%21&amp;related=AngryAnt&amp;lang=en&amp;count=none&amp;counturl=http%3A%2F%2Feej.dk%2Fangryant%2Fgeneral%2Ftipsandtricks%2Fpick-me-pick-me%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://eej.dk/angryant/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div>]]></content:encoded>
			<wfw:commentRss>http://eej.dk/angryant/general/tipsandtricks/pick-me-pick-me/feed/</wfw:commentRss>
		<slash:comments>3</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 return 0; } m_Alpha = 1.0f; } However, as Rodrigo recently brought to my attention, this approach ofcourse [...]]]></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>
<div id="tweetbutton365" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Feej.dk%2Fangryant%2Fgeneral%2Ftipsandtricks%2Foptimising-coroutine-yielding-in-c%2F&amp;text=Optimising%20coroutine%20yielding%20in%20C%23&amp;related=AngryAnt&amp;lang=en&amp;count=none&amp;counturl=http%3A%2F%2Feej.dk%2Fangryant%2Fgeneral%2Ftipsandtricks%2Foptimising-coroutine-yielding-in-c%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://eej.dk/angryant/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div>]]></content:encoded>
			<wfw:commentRss>http://eej.dk/angryant/general/tipsandtricks/optimising-coroutine-yielding-in-c/feed/</wfw:commentRss>
		<slash:comments>10</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 [...]]]></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>
<div id="tweetbutton348" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Feej.dk%2Fangryant%2Fgeneral%2Ftipsandtricks%2Fdownloading-the-hydra%2F&amp;text=Downloading%20the%20hydra&amp;related=AngryAnt&amp;lang=en&amp;count=none&amp;counturl=http%3A%2F%2Feej.dk%2Fangryant%2Fgeneral%2Ftipsandtricks%2Fdownloading-the-hydra%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://eej.dk/angryant/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div>]]></content:encoded>
			<wfw:commentRss>http://eej.dk/angryant/general/tipsandtricks/downloading-the-hydra/feed/</wfw:commentRss>
		<slash:comments>18</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 &#8217;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 [...]]]></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 &#8217;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>
<div id="tweetbutton326" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Feej.dk%2Fangryant%2Fgeneral%2Ftipsandtricks%2Fcopyinspector%2F&amp;text=CopyInspector&amp;related=AngryAnt&amp;lang=en&amp;count=none&amp;counturl=http%3A%2F%2Feej.dk%2Fangryant%2Fgeneral%2Ftipsandtricks%2Fcopyinspector%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://eej.dk/angryant/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div>]]></content:encoded>
			<wfw:commentRss>http://eej.dk/angryant/general/tipsandtricks/copyinspector/feed/</wfw:commentRss>
		<slash:comments>8</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 [...]]]></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>
<div id="tweetbutton317" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Feej.dk%2Fangryant%2Fgeneral%2Ftipsandtricks%2Fmagnetic%2F&amp;text=Magnetic&amp;related=AngryAnt&amp;lang=en&amp;count=none&amp;counturl=http%3A%2F%2Feej.dk%2Fangryant%2Fgeneral%2Ftipsandtricks%2Fmagnetic%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://eej.dk/angryant/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div>]]></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; [...]]]></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>
<div id="tweetbutton301" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Feej.dk%2Fangryant%2Fgeneral%2Ftipsandtricks%2Fgui-drag-drop%2F&amp;text=GUI%20drag-drop&amp;related=AngryAnt&amp;lang=en&amp;count=none&amp;counturl=http%3A%2F%2Feej.dk%2Fangryant%2Fgeneral%2Ftipsandtricks%2Fgui-drag-drop%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://eej.dk/angryant/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div>]]></content:encoded>
			<wfw:commentRss>http://eej.dk/angryant/general/tipsandtricks/gui-drag-drop/feed/</wfw:commentRss>
		<slash:comments>11</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 [...]]]></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>
<div id="tweetbutton291" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Feej.dk%2Fangryant%2Fgeneral%2Ftipsandtricks%2Flogging-an-entire-gameobject%2F&amp;text=Logging%20an%20entire%20GameObject&amp;related=AngryAnt&amp;lang=en&amp;count=none&amp;counturl=http%3A%2F%2Feej.dk%2Fangryant%2Fgeneral%2Ftipsandtricks%2Flogging-an-entire-gameobject%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://eej.dk/angryant/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;">Tweet</a></div>]]></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>

