Full Stack Universal Windows Platform

Don't just dream it. Hack it.

Windows Phone Features aus Unity3D nutzen

Entwickelt man ein Spiel mit Unity 3D für das Windows Phone kommt irgendwann der Zeitpunkt an welchem man ein Feature des Systems nutzen möchte und dieses nicht direkt in der Unity API zur Verfügung steht. Kein Problem. Unity3D bietet ein Plugin Konzept mit welchem man fehlende Funktionalität selbst implementieren und direkt aus der Spielelogik ansprechen kann.

Teilen macht Spaß

Social Sharing ist für Mobile Games fast schon Pflicht. Unity bietet zwar eine eigene API dafür an, Stand heute fehlt leider noch die Windows Integration. Deshalb ran ans Werk.

Als Beispiel soll der Windows Phone Sharing Task dienen.

public static void ShareStatus(string status)
{
ShareStatusTask task = new ShareStatusTask();
task.Status = status;
task.Show();
}

Die Funktion ruft den Share Task auf und übergibt einen vorgeschlagenen Status Text. Der Spieler kann den vorgeschlagenen Text sogleich an seine Netzwerke posten.

Projektstruktur

Der Unity3D Editor benötigt die Assemblies für die Plugin Integration im CLR 2.0 Format, Windows Phone allerdings benötigt die DLLs im CLR 4.0 Format. Wir benötigen also zwei Projekte mit den unterschiedlichen Framework Varianten aber gleichem Klassen Layout.

Zuerst legen wir das eigentliche Windows Phone Projekt an. Hierfür nimmt man das Windows Phone Class Library Projekt und wählt als Target OS Windows Phone 8.0 aus. In diesem Projekt legt man nun die Klasse an die die Funktion ShareStatus enthalten soll. Schliesslich sieht die Klassenstruktur folgendermaßen aus:

namespace UnityWP8
{
public class Tasks
{
public static void ShareStatus(string status)
{
ShareStatusTask task = new ShareStatusTask();
task.Status = status;
task.Show();
}
}
}

Unter den Eigenschaften des Projektes schaut man sich nun den Assemblynamen an und merkt sich diesen. Dieser wird für das zweite Unity eigene Assembly benötigt.

Das Shim Assembly

Jetzt wird ein zweites Projekt erstellt und zwar dieses Mal eine C# Klassenbibliothek und das ist nun wichtig, mit der Einstellung .NET Framework 3.5

In diesem Assembly erstellen wir die komplett gleiche Klassenstruktur wie vorher, jedoch ohne Implementierung:

namespace UnityWP8
{
public class Tasks
{
public static void ShareStatus(string status)
{
}
}
}

Wichtig! Der Assembly Output Name sollte gleich sein mit dem Assembly Namen des Windows Phone Projektes

Dieses Assembly dient dem Unity Editor als Metadaten Hilfe. 

Die Assemblies in Unity benutzen

Unity verfügt über einen Plugin Mechanismus der Top Down funktioniert. Im Root Verzeichnis werden die DLLs für alle Plattformen angeboten und dann gibt es noch Plattform Unterverzeichnisse die beim Build Prozess für die jeweilige Plattform hinzugezogen werden. Deshalb müssen nun beide Assemblies in das jeweils richtige Verzeichnis. Unter dem Assets Verzeichnis von Unity Projektes legt man ein Plugin Verzeichnis an (falls noch nicht vorhanden) und kopiert dann die entsprechenden Assemblies dort hinein.

Assets/
Plugins/
UnityWP8.dll <== .NET 3.5
WP8/
UnityWP8.dll <== WP8

Aufruf in Unity

Aus Unity heraus nutzt man nun die neue Funktionalität im Editor wie andere APIs auch:

using UnityEngine;
using System.Collections;

public class MenuItemShare : MonoBehaviour
{
void OnMouseDown()
{
UnityWP8.Tasks.ShareStatus (“Share this text…”);
}
}

Erweiterbar, klar

Im Grunde ist es einfach Windows Phone spezifische Funktionalität einzubinden. Hat man öfters die Notwendigkeit würde ich empfehlen das Erstellen des Shim Assemblies zu automatisieren, das spart Zeit und arbeit.