Jump to content
Unity Insider Forum

WLAN-Empfang messen


abcd

Recommended Posts

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

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

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

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

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

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

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

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...