Jump to content
Unity Insider Forum

[UNET] Network and XML


Recommended Posts

Grüße,

mein Server ist Host & Client gleichzeitig, kann ich eine xml Datei über den Server auslesen und verändern, ohne das der Client etwas davon mitbekommt, der Client soll lediglich einen Button drücken der dann den Server 2 Strings schickt und diese soll der Server dann in die xml Datei eintragen und vergleichen.

Wie würdet ihr das am besten machen?

Ich würde ja einen NetworkBehavior Script erstellen und dort eine Command Methode welche 2 strings als Attribute hat, ist das so ok?

Den Command lasse ich dann per Button ausführen.

 

Mfg Mustaf

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das sind 2 völlig unterschiedliche Dinge. Das Attribut [Server] über einer Methode sagt nur, dass diese Methode nur auf einem Server aufgerufen werden kann, falls diese doch auf einem Client aufgerufen wird gibts eine Fehlermeldung. Das hat Praktisch kaum einen Nutzen, dient jedoch zur schnelleren Fehlerfindung und einem saubereren Codestil wenn man das Konsequent durchzieht. Allerdings hat das nichts mit einem Command zu tun.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke, habe da noch 2 Fragen.

Warum wird bei den Erklärungen von Unity selbst, die TakeDamage Methode nicht mit einem [Command] Feld beschrieben sondern lediglich in der Methode eine

if (!isServer) { return; } - Abfrage

Wenn ich eine Heal() Methode habe sollte ich diese besser genauso schreibe mit dieser Abfrage oder als Command (man soll diese ja auch über Objekte aufrufen können)?

 

2 Frage.

[System.Serializable]
public class Inventory {

    public List<int> items = new List<int>();
}

Ich habe diese Klasse (da ist eigentlich noch etwas mehr drin, habe Sie jetzt nur ganz simple gehalten um es nicht all zu kompliziert zu machen.

Mein Player Script welcher ein Network Behaviour ist soll dann eine Variable bekommen.

public Inventory inv;

Diese soll SyncVar bekommen, geht aber nicht. Wie kann ich dort auch eine Synchronisation nutzen oder brauch ich das gar nicht und man kann z.b. per CheatEngine die Liste gar nicht ändern?

 

Mfg Mustaf

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, und? Das heißt ja nicht, dass der Client 24/7 mit dem Server redet um die Variable abzugleichen. Was das Attribut macht ist, dass der Server, wenn die Variable sich bei ihm ändert, beim nächsten Netzwerk-Update dem jeweiligen Client bescheid sagt, dass sich was geändert hat.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Klar gibt es Maßnahmen gegen bestimmte Sachen. Du kannst zum Beispiel bestimmte Dinge vom Server testen lassen. Da gilt dann, dass der Server dem Client niemals vertraut, sondern immer alles wichtige noch einmal selber nachprüft. Du kannst dich auch gegen Low-Level Memory Acceess ein bisschen schützen, indem du dich nicht auf einzelne Variablen verlässt. Aber potentiell musst du dir bewusst machen, dass dein Client auf einem Rechner läuft, der unter totaler Kontrolle des Nutzers liegt. Eine absolute Sicherheit gibt es nicht, und alles kann gehackt werden. Wer etwas anderes behauptet, ist blöd (ja, Telekom Österreich, ich rede mit dir! :D ).

Bei Schutz gegen Hacker gilt: Mach dir ein Angreifermodell, das beschreibt, mit welchem Aufwand du rechnest, den der Angreifer maximal betreiben wird, um sich einen Vorteil zu verschaffen. Dann schütze dich dagegen. Du solltest also nicht damit rechnen, dass dir die NSA oder der CCC auf den Fersen ist, sondern einfach nur edgy Script Kiddies. Und wenn dein Schutz ausreichend ist, dass die nach einer Stunde immer noch nichts geschafft haben und ihnen langweilig wird, dann reicht das.

Und bei Frage 1 verstehe ich nicht, worum es geht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für die Info. Gibt es da ein paar Anleitungen wo man so ungefähr mal sieht wie man die Variablen (Beispiel: Lebenspunkte, Angriffschaden) so schützt das Sie nicht so einfach verändert werden können?

Zu Frage 1: https://unity3d.com/de/learn/tutorials/topics/multiplayer-networking/networking-player-health

if (!isServer)
        {
            return;
        }

Wird das benutzt, statt einen Command daraus zu machen? (In der TakeDamage Methode)

 

PS: Welche Methode muss ich nehmen wenn ich ein Command aktivieren möchte bevor der Client disconnected (z.b. wenn er Alt+F4 gedrückt hat oder das Programm sich einfach schließt)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...