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 testClass
in 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.
Antworten:
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/
quelle
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.
quelle
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.
quelle