Damit du dein eigenes online Mehrspielerspiel mit Hilfe der Unity Engine programmieren kannst, musst du zuerst einmal verstehen wie ein solches aufgebaut ist. Unity bringt bereits eine Erweiterung namens „Unity Networking“ mit sich, jedoch werden wir in unserem Beispiel die Alternative „Photon“ verwenden. Photon ist eine Unity Erweiterung von ExitGames und gilt als eine der Besten Lösungen um sein Spiel onlinefähig zu machen.
Erste Schritte
Öffne ein neues Unity Projekt und begebe dich in den Asset Store. Hier suchst du nach „Photon Unity Networking Free“ und importierst dieses Package in dein Projekt. Danach erstellst du dir unter der offiziellen Webseite von Photon ein kostenfreies Benutzerkonto und legst über den Button „Create a new App“ eine neue Anwendung an. Nachdem die Anwendung in deinem Dashboard erstellt wurde, kannst du die App ID kopieren und in Unity in das Photon Setup Wizard feld einbinden.
Serverlogik
Im Ordner „Demos“ findest du erstellte Beispiele von ExitGames. Hier lässt sich auch bereits ein 2D Jump and Run mit fertig erstellter online Verbindung testen. Sobald du deine App ID hinterlegt hast, kannst du die Anwendung in Unity starten und dein Spieler erscheint in der Spielwelt. Wenn du noch einen zweiten Spieler mit ins Spiel holen möchtest, dann empfiehlt sich das Spiel für dein Betriebssystem über „File“ > „Build“ zu exportieren und mehrmals zu starten.
Bevor wir jetzt innerhalb unseres Unity Projekts eine Verbindung zum Server und zur Lobby erstellen, werde ich dir die Logik von einem Online Multiplayer Spiel in Unity mit Photon genauer erklären. Wir haben auf der einen Seite unseren Spieler und der Spieler möchte sich mit dem Server verbinden. Dies passiert wenn er beispielsweise auf den Button “Multiplayer spielen” klickt. Dadurch wird eine Methode zur Serververbindung aufgerufen. Der Server ist der so genannte MASTER. Mit dem Master verbindet sich nicht nur Spieler 1 sondern auch alle anderen Spieler die unser Online Multiplayer Spiel spielen, vollkommen unabhängig davon ob diese dann gemeinsam in einem Raum zusammen Spielen.
Nachdem die Spieler dem Server beigetreten sind, landen diese in der Lobby. Die Lobby listet alle möglichen Räume auf, der Spieler erstellt einen neuen Raum, wählt einen bestehenden oder wird automatisch verbunden.
Serverlogik
In unserem Beispiel werden wir die simpelste der beschriebenen Szenarien programmieren: Der Spieler tritt automatisch einem Spiel bei, ist kein Spiel vorhanden wir eines erstellt.
Auf der Webseite von Photon gibt es einen Matchmaking Guide welcher die Lobby Thematik genauer beschreibt, lass dich davon aber nicht entmutigen, die meisten Befehle benötigen wir für unser erstes online multiplayer spiel sowieso nicht.
Verbindung zum Server
Im letzten Video haben wir gelernt welche drei Instanzen für den Spieler beim Betreten eines Spiels vorhanden sein müssen. In diesem Video kümmern wir uns um die Erste davon und zwar um das Beitreten des Servers. Dazu erstellst du in Unity ein neues Panel mit einem Button. Denn nach dem Spielstart soll der Spieler entscheiden ob er überhaupt den Online Multiplayer Modus spielen möchte. Mit dem Bestätigen des Buttons wird die Anfrage an den Server gesendet. Doch wie sendest du nun überhaupt diese Anfrage?
Verbindung zum Server
Erstelle dir zuerst ein neues C#-Skript mit dem Namen “NetworkManager” und ein leeres GameObject “NetworkManager”.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NetworkManager : MonoBehaviour {
// Methode um Serververbindung zu starten
public void Connect()
{
PhotonNetwork.ConnectUsingSettings ("v01");
}
void Update()
{
// Ausgabe des aktuellen Serverstatus
Debug.Log(PhotonNetwork.connectionStateDetailed.ToString ());
}
void OnConnectedToMaster()
{
PhotonNetwork.JoinLobby ();
}
void OnJoinedLobby()
{
// Lobby panel anzeigen
lobbyPanel.SetActive (true);
}
public void ButtonJoinRoom()
{
// Raum betreten
PhotonNetwork.JoinRandomRoom();
}
void OnPhotonRandomJoinFailed()
{
PhotonNetwork.CreateRoom ("myRoom");
}
void OnJoinedRoom()
{
lobbyPanel.SetActive (false);
}
void Spawn()
{
if (PhotonNetwork.player.ID == 1)
{
PhotonNetwork.Instantiate ("Player", Vector3.zero, Quaternion.identity, 0);
} else
{
PhotonNetwork.Instantiate ("Player", new Vector3(0,2,0), Quaternion.identity, 0);
}
}
}
Damit du nun auch siehst was der aktuelle Serverstatus ist, lassen wir uns diesen im Detail in unserer Unity-Konsole ausgeben. Wie du siehst die Ausgabe zeigt nun den Status an, jedoch können wir uns nicht Verbinden, da wir erst einen Button erstellen müssen und über diesen Button rufen wir die Connect() Methode des NetworkManager Skripts auf.
Network Manager
Mit dem Starten der Szene gelangen wir über den Button zur Connect() Methode und verbinden uns so mit dem Master Server. Unser Spiel bleibt nun aber stehen, eigentlich sollten wir nach dem Verbinden eine andere Ansicht bekommen, denn die Szene zeigt aktuell immer noch die beiden Buttons aus dem Hauptmenü an. Die Connect Befehle der Photon Engine haben jeweils eine Callback Funktion. Im Falle von Connect können wir über OnConnectedToMaster() auf die Rückmeldung warten und dann sofort reagieren.
Ab in die Lobby
Im letzten Kapitel konnten wir uns über einen Button direkt mit dem Server verbinden. In diesem treten wir nun einer Lobby bei. Die Lobby ist die zweite Instanz in der Server-Logik von Photon. Wir werden hier keine speziellen Einstellungen vornehmen. Auf dieser Webseite findest du aber verschiedene Beispiele, wofür du die Lobbyeinstellungen verwenden kannst. Unter anderem auch um Skillgruppen oder Gamemodes zu unterscheiden und festzulegen.
Nachdem wir also die Rückmeldung vom Master-Server bekommen haben, starten wir den Befehl zum Betreten der Lobby. Dieser wird mit PhotonNetwork.JoinLobby(); ausgeführt. Auch hier erhalten wir nach dem erfolgreichen Verbinden eine Rückmeldung und du kannst diese mit OnJoinedLobby() abfangen.
Dadurch sind wir nun erfolgreich der Lobby beigetreten.
Raum erstellen / Raum betreten
Mit Hilfe der Methode JoinRandomRoom() wird dein Spieler einem beliebigen Raum betreten. Das Problem dabei ist nur, was passiert wenn ich der erste Spieler in der Lobby bin der einem Raum betreten möchte und dadurch noch keine Räume vorhanden sind?
Genau diesen Fall müssen wir betrachten, mit Hilfe der Methode OnPhotonRandomJoinFailed() bekommen wir diesen Hinweis und können dadurch über CreateRoom() einen neuen Raum erstellen.
Spieler spawnen lassen
Nachdem wir nun vollständig mit dem Server und unserem Raum verbunden sind, werden wir im nächsten Schritt ein Objekt, das unseren Spieler darstellen soll erscheinen lassen. Bevor wir uns jetzt aber um den Spawn kümmern zeige ich dir wie du die Anzahl der Spieler in einem Raum ausgeben lassen kannst. In den Update Bereich schreiben wir eine neue Zeile Code:
Debug.Log(PhotonNetwork.otherPlayers.Length);
Danach exportieren wir unser Spiel erneut, dadurch kannst du es mit mehreren Spielern testen.
Kommen wir nun zum Spawn. Der Spawn soll ausgeführt werden sobald wir mit dem Raum verbunden sind. Durch die Rückmeldung OnJoinedRoom() wissen wir, dass wir erfolgreich mit einem Raum verbunden sind. Das heißt für uns, innerhalb dieser Methode rufen wir das Spawn() auf. Zum aktuellen Zeitpunkt verfügen wir jedoch noch nicht über eine Spawn Methode. Legen wir also diese zuerst einmal an.
Ein GameObject mit dem Namen Player haben wir bisher noch nicht. Erstelle innerhalb deines Assets Ordner einen Resources Ordner und hier einen Würfel mit dem Namen Player. Die eben erstellte Methode noch im Rumpf der OnJoinedRoom()-Methode aufrufen und schon kannst du dein Spiel testen. Wie du siehst erscheint nun unser Spieler. Doch wie sieht dies aus, wenn wir einen weiteren Spieler spawnen lassen. Dazu kannst du deine Anwendung exportieren und auf diese Weise mehrmals starten.
Nützliche Links
YouTube Playlist: https://www.youtube.com/playlist?list=PLVGTm2ujeFKR3EkfHlegCarHE6Dp9PE7D
Photon im Asset Store: https://www.assetstore.unity3d.com/en/#!/content/1786
Photon Webseite: https://www.photonengine.com