edriven icon indicating copy to clipboard operation
edriven copied to clipboard

Unity3d event-driven framework

h1. eDriven Framework

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

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

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:

MouseEvent me = new MouseEvent(MouseEvent.CLICK);
button.DispatchEvent(me);

Subscribe:

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);
}

h2. Signal syntax

Publish:

Signal ClickSignal = new Signal();
ClickSignal.Emit("foo", "bar", 3);

Subscribe:

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
}

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":https://github.com/dkozar/public/blob/master/documents/eDriven_Manual_2-0.pdf (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
  • "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.