Showing posts with label uLink. Show all posts
Showing posts with label uLink. Show all posts
Character synchronisieren

Monday, October 21, 2013

Character synchronisieren

Nachdem sich nun zwei Clients mit dem Server verbinden konnten war mein nächstes Ziel mit dem Stand meines Photon-Projektes gleichzuziehen. Je Client wird ein Character instanziiert und die eigenen Bewegungen sollen für den anderen Client sichtbar werden. 


Da ich das mit Photon schon geschafft hatte, konnte ich mir in etwa vorstellen wie es funktioniert und musste nur noch die uLink-Schreibweise herausfinden. Nach kurzer Recherche bin ich auf diese Übersicht gestoßen die wunderbar erklärt wie ich meine Bewegungsinformationen per Skript sende bzw. andere Bewegungen empfange:

private Vector3 correctPlayerPos; 

void uLink_OnSerializeNetworkView(uLink.BitStream stream, uLink.NetworkMessageInfo info) 
{ 
    if (stream.isWriting) 
    {
        // We own this player: send the others our data
        stream.Write(transform.position);
    }
    else 
    { 
 // Network player, receive data
        this.correctPlayerPos = stream.Read(); 
    }
}

Alleine diese Funktion im Skript wird nichts bewirken. Diese funktioniert nämlich wie der Name schon sagt nur mit einem NetworkView auf dem jeweiligen Objekt.
Unity3D hat eine eigene NetworkView-Komponente, die aber nicht genutzt werden kann, da im Skript eine uLink-Funktion aufgerufen wird. Also bekommt das Playerobjekt die uLink-NetworkView-Komponente.
Darauf findet man wieder eine Komponente mit dem Namen "observed". Hier muss das Skript drauf, dessen Daten im Netzwerk gesendet werden sollen. In meinem Beispiel heißt das Skript movealternativ.cs und beinhaltet außer der oben gezeigten Funktion die Keyboardsteuerung (was in diesem Post aber noch keine Rolle spielt) des Players.

                


Wenn mit dieser Voraussetzung das Spiel gestartet wird, kann man im Inspektor die Position eines Characters verändern, was dem anderen Client mitgeteilt und angezeigt wird.
uLink - Server und Client

Saturday, October 19, 2013

uLink - Server und Client

Nach Rücksprache mit meinem Dozenten habe ich mich für die Netzwerklösung "uLink"  von MuchDifferent entschieden.


Der Vorteil daran war, dass mein eigener Laptop oder Rechner einen Server darstellen kann, sodass ich keine auftauchenden Verzögerungen bei meiner Prüfung haben werde, da ich innerhalb eines Netzwerkes arbeiten kann. Zudem kann ich Server- und Clientbasiert programmieren was in manchen Situationen bestimmt hilfreich werden kann.
Außerdem gibt es für uLink eine für mich gut nachvollziehbare Dokumentation mit Tutorials und einiges an Material im Web zu finden.

Ich habe also damit angefangen, wie bei Photon auch, die ersten Dokumentationen zu lesen und mir ein Grundgerüst aufzubauen. Bald hat auch schon mein Server funktioniert, zu welchem sich meine Clients verbinden konnten. 
Um euch auch einmal einen kleinen Einblick in die Programmierung zu geben, seht ihr hier das GUI-System, mit welchem ich entweder einen Server darstellen oder mich zum Server verbinden kann:

void OnGUI()
{
    // Checking if you are connected to the server or not
    if (uLink.Network.peerType == uLink.NetworkPeerType.Disconnected)
    {
        // Show fields to insert ip address and port
        serverIP = GUI.TextField(new Rect(120, 10, 100, 20), serverIP);
        serverPort = int.Parse(GUI.TextField(new
        Rect(230, 10, 40, 20), serverPort.ToString()));
        if (GUI.Button(new Rect(10, 10, 100, 30), "Connect"))
        {
            //This code is run on the client
            uLink.Network.Connect(serverIP, serverPort);
            Debug.Log("Did send call to server");
        }
        if (GUI.Button(new Rect(10, 50, 100, 30), "Start Server"))
        {
            //This code is run on the server
            uLink.Network.InitializeServer(32, serverPort);
        }
    }
}

Falls das jemanden genauer interessiert, hier der Link zur Website mit MuchDifferent-eigenen Tutorials. Dort findet man unter anderem ein PDF welches den Einstieg ausführlich erklärt.
Das ganze sieht im Spiel dann so aus:

GUI - Server starten oder Client verbinden

In den ersten Schritten wird zudem gezeigt wie man definiert was passieren soll wenn sich ein Client beispielsweise vom Server trennt oder die Verbindung abbricht:

    void uLink_OnPlayerDisconnected(uLink.NetworkPlayer player)
    {
        uLink.Network.DestroyPlayerObjects(player);
        uLink.Network.RemoveRPCs(player);
    }

In diesem Fall werden alle "netzwerkverbundenen" Objekte, welche zum getrennten Client gehören und natürlich dessen hinterlassenen RPCs zerstört. RPCs sind Funktionen mit denen man grob gesagt zwischen Clients und Server kommunizieren kann. Die werden im Laufe meiner Arbeit mit Sicherheit noch des öfteren auftauchen!