h1. eDriven Framework

h1. Event-driven / asynchronous framework for "Unity3d":http://unity3d.com/.

h2. Author: "Danko Kozar":http://dankokozar.com

<img src="http://dankokozar.com/images/edriven-800.png"></img>

h2. Concept

 * eDriven framework is the result of 10 years of programming experience, self-education and research.
 * This framework turns Unity into an asynchronous system.
 * It's inspired by RIA (Rich Internet Applications) frameworks, such as Apache Flex and other Actionscript and Javascript frameworks.
 * The idea behind building a framework was to bring the event-driven (publish-subscribe type of) programming paradigm to Unity.
 * There have been a number of libraries for Unity, but I decided to go with my own. That's because I wanted to build additional libraries upon my event-dispatching system and wanted the total control.
 * .NET framework events were not appropriate.
 * There are two parallel event-dispatching systems inside eDriven: 
    1) Signals
	2) Events
 * Signals are inspired by "Robert Penner's Signals":https://github.com/robertpenner/as3-signals and are used for framework internals. Signals are faster than events because there's no instantiation involved. Also, your class isn't required to inherit some base (dispatcher) class.
 * Events are more common and are inspired by "DOM Level 3 Events":http://www.w3.org/TR/DOM-Level-3-Events/. They support event bubbling, which is the important feature for GUI. The class that needs to dispatch events must inherit from EventDispatcher class.

h2. Event syntax

Publish:

<pre><code>MouseEvent me = new MouseEvent(MouseEvent.CLICK);
button.DispatchEvent(me);
</code></pre>

Subscribe:

<pre><code>button.AddEventListener(MouseEvent.CLICK, ClickHandler);

private void ClickHandler(Event e) // eDriven.Core.Events.Event
{
	Button button = e.Target as Button;
	Debug.Log("Clicked button with label: " + button.Text);
	
	// or
	MouseEvent me = (MouseEvent)e; // we got to know the type of the Event
	Point position = me.GlobalPosition;
	Debug.Log("Clicked at position: " + position);
}
</code></pre>

h2. Signal syntax

Publish:

<pre><code>Signal ClickSignal = new Signal();
ClickSignal.Emit("foo", "bar", 3);
</code></pre>

Subscribe:

<pre><code>ClickSignal.Connect(ClickSlot);

private void ClickSlot(params object[] parameters)
{
	// do something with parameters (we got to know the number of parameters and each one's type)
	string first = (string)parameters[0]; // "foo"
	string second = (string)parameters[1]; // "bar"
	int third = (int)parameters[2]; // 3
}
</code></pre>

h2. Core classes and utilities

eDriven framework contains a number of classes:

 * SystemManager (emits system signals)
 * SystemEventDispatcher (dispatches system events)
 * MouseEventDispatcher (dispatches mouse events)
 * KeyboardMapper (easy mapping for keyboard gestures)
 * CallbackQueue (implements queuing of async operations)
 * TaskQueue (sequences async operations)
 * PowerMapper (maps strings to stuff)
 * AudioPlayerMapper (maps strings to AudioPlayers)
 * Cache (caches stuff)
 * ObjectPool (prevents instantiation and garbage collection problems)
 * Timer (handy source of timed events)
 * HttpConnector (loads stuff from the web and triggers responders when finished)
 * JavascriptConnector (talks with a host web page)

... and many others. They all serve the purpose of the framework: making the asynchronous, event-driven programming possible with Unity. 

h2. Resources

* "eDriven Programming Manual":http://edriven.dankokozar.com/manual/eDriven_Manual_2-0.pdf (note: eDriven.Gui and eDriven.Animation also included)
* "eDriven API":http://edriven.dankokozar.com/api/2-0/ (note: eDriven.Gui and eDriven.Animation also included)
* "AssetStore":http://u3d.as/content/adjungo/e-driven/308
* "Additional downloads":http://code.google.com/p/edriven/downloads/list
* "Videos":http://www.youtube.com/playlist?list=PL7EE340828F962941
* "eDriven.Gui site":http://edrivengui.com/
* "Demo site":http://edrivenunity.com/ (requires Unity web player)
* "eDriven Forum":http://forum.edrivengui.com/
* "Unity Forum Q&A thread":http://forum.unity3d.com/threads/148424-eDriven-Q-amp-A
* "Author's homepage":http://dankokozar.com
* "I’m @DankoKozar on Twitter":https://twitter.com/DankoKozar.
