• Announcements

    • Lars

      Allgemeine Forenregeln   03/13/2017

      Forenregeln Nimm dir bitte einen Moment um die nachfolgenden Regeln durchzulesen. Wenn du diese Regeln akzeptierst und die Registration fortsetzen willst, klick einfach auf den "Mit der Registrierung fortfahren"-Button. Um diese Registration abzubrechen, klick bitte einfach auf den "Zurück" Button deines Browsers. Wir garantieren nicht für die Richtigkeit, Vollständigkeit und Brauchbarkeit der Nachrichten und sind auch nicht dafür verantwortlich. Die Beiträge drücken die Meinung des Autors des Beitrags aus, nicht zwangsläufig das, wofür die Forensoftware steht. Jeder Nutzer, der denkt, dass ein veröffentlichter Beitrag unzulässig bzw. störend ist, ist aufgefordert uns unverzüglich per E-Mail zu kontaktieren. Wir haben das Recht störende Beiträge zu löschen und bemühen uns, das in einem realistischem Zeitraum zu erledigen (sofern wir beschlossen haben, dass die Löschung notwendig ist). Du akzeptierst, durchgehend während der Nutzung dieses Services, dass du dieses Forum nicht dazu missbrauchen wirst, Inhalte zu veröffentlichen, welche bewusst falsch und/oder verleumderisch, ungenau, beleidigend, vulgär, hasserfüllt, belästigend, obszön, sexuell belästigend, bedrohlich, die Privatsphäre einer Person verletzend oder in irgend einer Art und Weise das Gesetz verletzen. Des Weiteren akzeptierst du, dass du keine urheberrechtlich geschützte Inhalte ohne Erlaubnis des Besitzers in diesem Forum veröffentlichst. Mit dem Klick auf den "Mit der Registrierung fortfahren"-Button, akzeptierst du zudem unsere Datenschutzerklärung und stimmst der Speicherung deiner IP-Adresse und personenbezogenen Daten zu, die dafür benötigt werden, um dich im Falle einer rechtswidrigen Tat zurückverfolgen zu können bzw. permanent oder temporär aus dem Forum ausschließen zu können. Es besteht keine Pflicht zur Abgabe der Einwilligung, dies erfolgt alles auf freiwilliger Basis.   Zusatzinformationen Der Forenbetreiber hat das Recht, Nutzer ohne Angabe von Gründen permanent aus dem Forum auszuschließen. Des Weiteren hat er das Recht, Beiträge, Dateianhänge, Umfrage, Blogeinträge, Galleriebilder oder Signaturen ohne Angabe von Gründen zu entfernen. Mit der Registrierung verzichtest du auf alle Rechte an den von dir erstellten Inhalten, bzw. treten diese an das Unity-Insider.de und Unity-Community.de ab. Dies bedeutet im Klartext, dass das Unity-Insider.de und Unity-Community.de frei über deine Texte verfügen kann, sofern diese nicht wiederum die Rechte anderer verletzen. Es besteht weiterhin kein Anspruch von registrierten Nutzern bzw. ehemaligen registrierten Nutzern darauf, dass erstellte Inhalte und/oder die Mitgliedschaft (User) wieder gelöscht werden (Erhaltung der Konsistenz dieses Forums).   Einwilligungserklärung Wenn du mit der Speicherung deiner personenbezogenen Daten sowie den vorstehenden Regeln und Bestimmungen einverstanden bist, kannst du mit einem Klick auf den Mit der Registrierung fortfahren-Button unten fortfahren. Ansonsten drücke bitte Zurück. Stand: 07.03.2011
Sign in to follow this  
Followers 0
coco07

Methode nur auf anderen Clients ausführen?

2 posts in this topic

Hallo Community,

 

ich schreibe gerade einen kleinen 2D-Shooter. Das Bewegen mit Hilfe der RigidBody2D Komponente und dem dazugehörigen NetworkTransform funktioniert inklusive der Animation-Synchronisierung auf allen Clients. Beim Schießen komme ich derzeit nicht weiter. Wenn ich die Kugel auf dem Server spawne, habe ich auf meinem eigenen Client eine Verzögerung. Die Kugel kommt also nicht mehr direkt aus der Waffe, sondern hinkt um die Zeit des Pings hinterher.

public void CmdShoot(){
 GameObject bullet = (GameObject) GameObject.Instantiate (bulletPrefab, spawnPosition.position, spawnPosition.rotation);
 bullet.GetComponent<Rigidbody2D> ().velocity = bullet.transform.right * BULLET_SPEED;
 NetworkServer.Spawn (bullet);
}

 

Die Lösung ist wohl "Client Side Prediction"? Also habe ich einfach eine Kugel lokal auf meinem eigenen Client gespawnt und die SpriteRenderer Komponente der Kugel, welche auf dem Server gespawnt wird, deaktiviert. Jetzt sehe ich meine eigene Kugel ohne Verzögerung direkt aus der Waffe fliegen. Die im Netzwerk aktive Kugel ist zwar nicht mit der lokalen Kugel synchronisiert, aber das macht nichts. Ich habe also 2 Kugeln pro Schuss -> Eine nur für mich sichtbare(fürs Optische) und die richtige im Netzwerk aktive Kugel(für Kollisionen usw.).

 

Die Frage ist nun, wie ich die im Netzwerk aktive Kugel auch auf den anderen Clients sichtbar machen kann, da die SpriteRenderer Komponente ja deaktiviert ist. Wenn ich diese im Script der Kugel aktiviere, sehe ich natürlich meine lokale UND die im Netzwerk Aktive auf meinem eigenen Client. Optisch sieht das nicht wirklich berauschend aus. Gibt es dafür eine Lösung?

Ich habe bereits versucht eine lokale Liste zu erzeugen und jede im Netzwerk gespawnte Kugel hinein zu legen. Funktioniert aber leider nicht, da der "Command" nur auf dem Server aufgerufen wird...

 

Ich bin echt ratlos :(

 

edit: Mit Client-Authority ist das Problem behoben, in dem ich in der Start Methode des Kugel-Scripts einfach die Bedingung

if (!hasAuthority) {
GetComponent<SpriteRenderer> ().enabled = true;
}

hinzufüge...

Allerdings bekomme ich dann auf einem der beiden Clients eine Fehlermeldung: "HandleTransform no gameObject" in UnityEngine.Networking.NetworkIdentify: UnetStaticUpdate()

Außerdem ist das wieder unnötiger Traffic, da die Kugel mit dem Server synchronisiert wird?

 

MfG

Coco07

Share this post


Link to post
Share on other sites

Eine Möglichkeit wäre den Schuss lokal durchzuführen und dann Server-seitig zu prüfen. Also erstmal abfeuern und etwas treffen. Wenn etwas relevantes getroffen wurde, überprüft der Server ob alles seine Richtigkeit hat, also ob es auch für den Server und für den/die getroffenen Spieler plausibel ist (Prüfen ob der getroffene Spiele nicht schon 10 Meter weiter gerannt ist, und der Schütze nur aufgrund eines Lags getroffen hat).

In der Zwischenzeit kannst du ja lokal den Dingen soweit ihren Lauf lassen (Getroffener Spieler bekommt schaden, Animation, usw.). Falls der Server dann der Meinung ist, dass alles fair und richtig ist, kann er dann die restlichen Clients benachrichtigen. Falls nicht (sei es wegen Lags oder Hacks), wird der Ausgangs-Client kurz "zurückgespult". Also im Prinzip spielt dann jeder sein eigenes Spiel in Echtzeit abgekoppelt vom Rest.

Falls ich aber lokal vorbeiballer, und das Projektil aufgrund der Verzögerung dann aber "in Wirklichkeit" doch etwas trifft, wird das einfach ignoriert. Weil das ja nichts mit meinem selbst gezielten Schuss zu tun hat. Das wäre auch generell nicht richtig nachvollziehbar. Es zählt nur das was der Server als Fair und Richtig deklariert.

So ein ähnliches Verhalten kann man ja bei Netzwerkshootern beobachten.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0