Wie greife ich über eine Android-Aktivität auf eine Unity-Klasse zu?

7

Ich habe meine eigenen C # -Klassen in Unity erstellt. Wie kann ich über die Android-Aktivität, mit der das gestartet wird, auf sie zugreifen UnityPlayer?

Beispiel : Ich habe eine C # -Klasse testClassin Unity:

class testClass {
    public static string myString = "test string";
}

Über die Android-Aktivität in Java möchte ich auf ein Mitglied dieser Klasse zugreifen:

string str = testClass.myString;

Ist das möglich? Wenn das so ist, wie? Gibt es einen anderen Weg, dies zu tun? Am Ende möchte ich grundsätzlich zwischen meiner Android-Aktivität und dem UnityPlayer-Objekt kommunizieren.


Edit : Ich habe eine Lösung gefunden.

Ich habe mir überlegt, Android-Plugins für Unity zu erstellen, aber das war für mich nicht zufriedenstellend.

Am Ende habe ich in Unity mit C # eine Socket-Client-Server-Schnittstelle und in Java eine weitere für die Android-App erstellt: Unity überwacht Port X und sendet auf Port Y. Die Android-Aktivität überwacht Port Y und sendet auf Port X. Dies ist notwendig, da beide Schnittstellen auf demselben Host ausgeführt werden.

So habe ich mein Problem gelöst, aber ich bin offen für Vorschläge, wenn jemand eine bessere Art der Kommunikation zwischen dem Unityplayer und Ihrer App kennt.

Anomalie
quelle
2
Sie sollten das letzte Bit mit der Lösung posten, die Sie als Antwort gefunden haben. (Es ist völlig in Ordnung - sogar ermutigt -, Ihre eigenen Fragen zu beantworten.)
Anko

Antworten:

1

Der Grad des Zugriffs, den Sie erwarten, kann machbar sein oder nicht. Es gibt jedoch eine einfache Rückruffunktion zum Senden von Nachrichten von nativen Plugins an Unity: UnitySendMessage (). Dadurch wird die benannte Methode für das benannte Objekt aufgerufen. Mit anderen Worten, Sie müssen ein Objekt mit der gewünschten Methode in der Szene haben, und dann kann Ihr Plugin dies aufrufen. Normalerweise erstellen die meisten Plugins ein leeres Objekt mit DontDestroyOnLoad und einer Reihe von Rückrufen.

Suchen Sie beispielsweise nach der auf dieser Seite erläuterten Funktion http://docs.unity3d.com/Manual/PluginsForIOS.html

Beachten Sie, dass es auf dieser Seite um iOS und nicht um Android geht. In Android funktioniert dies jedoch genauso. Um UnitySendMessage () aus Java-Code aufzurufen, müssen Sie das Unity-JAR einschließen. Dieser Import wird auf dieser Seite erläutert. Scrollen Sie ganz nach unten zu "Erweitern der UnityPlayerActivity" http://docs.unity3d.com/Manual/PluginsForAndroid.html

und eine weitere Seite, auf der dieser Befehl erläutert wird: http://forum.unity3d.com/threads/android-plugin-call-c-from-java.78598/

jhocking
quelle
0

Wenn Sie nur auf den Wert einer Mitgliedsvariablen einer Unity-Klasse zugreifen oder eine Methode der Unity-Klasse aus Android-Aktivitäten aufrufen möchten, können Sie hierfür jederzeit JNI verwenden. Sie müssen auch eine C ++ - Schnittstelle zwischen ihnen erstellen (Keine Ahnung, ob dies ohne C ++ - Schnittstelle möglich ist, aber ich glaube, dass dies erforderlich ist).

Überprüfen Sie diesen Link für eine schnelle Lösung.

Anfänger
quelle
Ich habe tatsächlich ein bisschen mit ikvm gespielt, um zu sehen, was ich dort erreichen könnte. Es ist so ziemlich das gleiche Konzept, nur umgekehrt, es macht eine DLL aus einem Glas und kann auch Gläser aus .net-Assemblys machen. Tolles Tool und es funktioniert 100% in einer normalen .net-App, aber wenn es in Unity verwendet wird, löst es einige Java-Ausnahmen aus, die Sie daran hindern, Ihr Projekt zu exportieren, obwohl die Ausnahmen es nicht daran hindern, zu funktionieren. Wenn ich es umgehen könnte, wäre es perfekt. Ich kann die Ausnahmen auch nicht global behandeln, da sie in der verpackten jar / dll auftreten
Anomaly
Die Einheit hört nie auf, wenn es in einem der Skripte Ausnahmen gibt. Der Rest des Codes wird im selben Frame übersprungen und fortgesetzt. Ich nehme an, dass das Tool möglicherweise einige nicht unterstützte API-Aufrufe enthält. Ein roher JNI-Aufruf funktioniert jedoch garantiert, da er in vielen Android-Plugins verwendet wird. Versuchen Sie es mit einer einfachen Methode, um zuerst aufzurufen, ob dies Ihren Anforderungen entspricht oder nicht.
Noob
0

Soweit ich weiß, sind die C # -Klassen in Unity nicht direkt von außen zugänglich (dh in Ihrer Aktivität). Sie können die Funktion UnitySendMessage verwenden, sie ist jedoch eine relativ einfache Funktion mit einigen strengen Einschränkungen (z. B. können Sie nur 1 Parameter senden, und es handelt sich um eine Zeichenfolge). Wenn Sie etwas Komplexeres tun müssen, ist Ihre Methode zum Erstellen einer lokalen Socket-Verbindung sicherlich keine schlechte.

Die andere Möglichkeit besteht darin, eine Nachricht an die Unity-App zu senden, dass Daten verfügbar sind, und dann die C # -Code-Abfrage in den Android-Code einzugeben, um die Werte abzurufen. Wenn Sie beispielsweise einen In-App-Kauf erhalten, können Sie der C # -App das Android-Aktivitätssignal senden, dass ein neues In-App-Kaufereignis aufgetreten ist, und der C # -Code kann dann die Android-Aktivität abfragen, um die Ergebnisse zu erhalten des Kaufs. Im Allgemeinen habe ich meinen Code so eingerichtet.

Tom K.
quelle