abcd Geschrieben 18. Mai 2015 Melden Share Geschrieben 18. Mai 2015 Hallo, ist es irgendwie möglich, die Wlan-Signalstärke irgendwie auszulesen? VG Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 18. Mai 2015 Melden Share Geschrieben 18. Mai 2015 Nur auf Umwegen, dürfte aber per PINVOKE machbar sein: http://stackoverflow.com/questions/19283320/c-wifi-signal-strength Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
abcd Geschrieben 18. Mai 2015 Autor Melden Share Geschrieben 18. Mai 2015 Danke dir für die schnelle Antwort, ich hatte allerdings vergessen zu erwähnen, dass ich das für Android-Geräte brauche ^^ Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 18. Mai 2015 Melden Share Geschrieben 18. Mai 2015 Dann das hier: http://stackoverflow.com/questions/11389492/get-wifi-signal-strength-of-connected-network Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
abcd Geschrieben 22. Mai 2015 Autor Melden Share Geschrieben 22. Mai 2015 Danke Mark. Ich kenne mich leider nicht so gut in der Android-App-Entwicklung aus, kannst du mir vielleicht ein paar tipps geben? Ich habe es geschafft das Unity Projekt zu einem Google Android Projekt zu exportieren und die Signalstärke mittels Log.d() auszugeben, allerdings macht er das nur 1x mal, nämlich wenn die onResume()-Methode aufgerufen wird. Wie kann ich mir die info regelmäßig, z.b. alle 5 Sekunden oder so ausgeben geben? Ich würde damit gerne messen, ab wann mein Spiel anfängt zu ruckeln, da ich gemerkt habe, dass es ruckelt, sobald ich weiter vom Router weg bin. Hast du eine Idee, wie ich das genau anstellen kann? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 22. Mai 2015 Melden Share Geschrieben 22. Mai 2015 Ich kenne mich mit der Android/Unity Entwicklung nicht aus (das Zusammenspiel) aber ich würde schauen dass du eine Methode von der Java Seite öffentlich genug machst damit du sie innerhalb von unity bei Bedarf aufrufen kannst. Das solltest du dir auch schon selbst so gedacht haben, nur dir fehlt vermutlich das Wissen wie genau das funktioniert. Eventuell hilft dir das hier ja weiter: http://docs.unity3d.com/ScriptReference/AndroidJavaClass.html http://docs.unity3d.com/ScriptReference/AndroidJavaObject.CallStatic.html http://docs.unity3d.com/ScriptReference/AndroidJavaProxy.html Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
abcd Geschrieben 22. Mai 2015 Autor Melden Share Geschrieben 22. Mai 2015 Ich danke dir, das hat mir erstmal geholfen Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
abcd Geschrieben 24. Mai 2015 Autor Melden Share Geschrieben 24. Mai 2015 Ich habe jetzt ein Java plugin geschrieben, welches einfach nur den RSSI-Wert als String zurückgibt. public class WifiSignal { static WifiManager wifi; static Context context = UnityPlayer.currentActivity.getBaseContext(); public static String run() { WifiInfo wifiInfo; if (wifi == null) wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); wifi.startScan(); wifiInfo = wifi.getConnectionInfo(); return "Wifi Signal: " + String.valueOf(wifiInfo.getRssi()) + " dBm"; } } Mit dem C#-Skript lasse ich mir das einfach alle 5 Sekunden aktualisieren. using UnityEngine; using System.Collections; public class WifiSignal : MonoBehaviour { AndroidJavaClass ajc; private string signal = ""; float time; void Start () { #if !UNITY_EDITOR ajc = new AndroidJavaClass ("de.ngocducnguyen.unityplugin.WifiSignal"); StartWifiSignalStrengthMeasurement(); #endif } void OnGUI () { GUI.Label (new Rect (0, Screen.height - Screen.height * 0.05f, Screen.width, Screen.height * 0.05f), signal); } private void StartWifiSignalStrengthMeasurement () { InvokeRepeating ("GetWifiSignalStrength", 0, 5); } private void GetWifiSignalStrength () { signal = ajc.CallStatic<string> ("run"); } } Leider gibt es alle 5 Sekunden einen Lag, nämlich immer dann, wenn der RSSI-Wert aktualisiert wird. Gibt es einfach effizientere Methode, das zu machen? Es handelt sich hierbei um ein Multiplayerspiel, bei dem zwei Spieler ein Objekt bewegen und ich würde gerne wissen, wie gut das WLAN-Signal sein muss, damit es ruckelfrei läuft. Bringt mich der RSSI-Wert da überhaupt weiter? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 25. Mai 2015 Melden Share Geschrieben 25. Mai 2015 Ganz spontan würde ich sagen dass du den Wert Asynchron abfragen könntest in einem separatem Thread. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
abcd Geschrieben 26. Mai 2015 Autor Melden Share Geschrieben 26. Mai 2015 Meinst du eine Coroutine? Damit hatte ich das schon versucht, gleiches Problem. Falls du etwas anderes meinst, kannst du mir ein Stichwort nennen oder einen Link dafür schicken?^^ Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 26. Mai 2015 Melden Share Geschrieben 26. Mai 2015 Nein ich meine Threads, keine Coroutine. Du startest einen echten Thread der alle X Sekunden etwas macht. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
abcd Geschrieben 26. Mai 2015 Autor Melden Share Geschrieben 26. Mai 2015 Kannst du mir da vielleicht helfen? Ich arbeite erst seit 2 Monaten mit Unity und C# und habe für das Projekt nur noch 1 Monat Zeit. Ich mache das jetzt mit Ping, allerdings ist es da ja genau das gleiche Problem. Meine Klasse, die den anderen Spieler 10x anpingt und min, max und durchschnitt anzeigt sieht wie folgt aus: using UnityEngine; using System.Collections; public class PingPlayer:MonoBehaviour { Ping ping; int x; int min; int max; int avg; int sum; void Start () { x = 0; min = 0; max = 0; avg = 0; sum = 0; InvokeRepeating ("PingPlayer2", 0, 2); } void OnGUI () { GUI.Label (new Rect (0, Screen.height - Screen.height * 0.1f, Screen.width, Screen.height * 0.1f), "min: " + min + "ms avg: " + avg + "ms max: " + max + "ms sum:"); } // Berechnet min, max, avg void PingPlayer2 () { ping = new Ping (Network.connections [0].ipAddress); while (!ping.isDone) { //wait until ping.isDone == true } Debug.Log ("ping: " + ping.time + "ms"); sum += ping.time; if (x == 0) { min = ping.time; max = ping.time; } else { if (ping.time < min) min = ping.time; if (ping.time > max) max = ping.time; } avg = sum / (x + 1); if (x == 9) CancelInvoke (); x++; } } Wie mache ich daraus einen Thread? Ich hatte dieses hier auch schon probiert und einige andere Tutorials, aber ich bekam da immer folgende Fehlermeldung und habe erstmal wieder alles rückgängig gemacht: .ctor can only be called from the main thread Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 26. Mai 2015 Melden Share Geschrieben 26. Mai 2015 Die Unity eigenen Methoden und Klassen kann man fast nur auf dem Hauptthread verwenden. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
abcd Geschrieben 26. Mai 2015 Autor Melden Share Geschrieben 26. Mai 2015 D.h. Ping etc kann ich auch nicht in einem eigenen Thread ausführen? Ok danke, dann muss ich mir dafür noch mal was anderes einfallen lassen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 26. Mai 2015 Melden Share Geschrieben 26. Mai 2015 Blockiert der Ping denn? Würde mich wundern. Was genau blockiert denn nun noch? Die WLAN Stärke? Das müsste eigentlich fixer sein als das was es aktuell macht. Evtl blockiert der Part in Java, da müsste man mal ansetzen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
abcd Geschrieben 26. Mai 2015 Autor Melden Share Geschrieben 26. Mai 2015 Die WLAN-Stärke habe ich wieder auskommentiert, da ich diese wahrscheinlich nicht mehr verwenden werde. Ich verwende nur noch das Skript da oben, in dem alle 2 Sekunden der andere Spieler angepingt wird, Ca alle 2 Sekunden ruckelt es Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 27. Mai 2015 Melden Share Geschrieben 27. Mai 2015 Ich vermute mal dass es diese Stelle hier ist welche Blockiert: while (!ping.isDone) { //wait until ping.isDone == true } Hier würde ich einfach in den while scope ein yield new WaitForNextFrame(); eintragen oder ähnliches, dann sollte das Ruckeln auch verschwinden. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
abcd Geschrieben 27. Mai 2015 Autor Melden Share Geschrieben 27. Mai 2015 Vielleicht hältst du mich jetzt für blöd, aber ich kriege es nicht hin ^^ IEnumerator PingPlayer2 () { Debug.Log ("PingPlayer2"); //ping = new Ping (Network.connections [0].ipAddress); ping = new Ping ("217.160.126.222"); while (!ping.isDone) { Debug.Log (ping.isDone); yield return new WaitForEndOfFrame (); } Debug.Log ("ping: " + ping.time + "ms"); sum += ping.time; if (x == 0) { min = ping.time; max = ping.time; } else { if (ping.time < min) min = ping.time; if (ping.time > max) max = ping.time; } avg = sum / (x + 1); if (x == 9) CancelInvoke (); x++; } Die Funktion lässt sich in der Start()-Funktion weder mit InvokeRepeating ("PingPlayer2", 0, 2); noch mit PingPlayer2 (); aufrufen. Was mache ich denn jetzt schon wieder falsch? ^^ Ich musste den Rückgabewert von PingPlayer2() zu IEnumerator ändern, da bei void immer die Fehlermeldung Assets/Scripts/PingPlayer.cs(32,22): error CS1624: The body of `PingPlayer.PingPlayer2()' cannot be an iterator block because `void' is not an iterator interface type kommt Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
abcd Geschrieben 27. Mai 2015 Autor Melden Share Geschrieben 27. Mai 2015 Ich habe leine Ahnung wie Network.getAveragePing() den Ping berechnet, aber ich denke ich verwende die Funktion einfach. Dort ruckelt es nicht. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.