Hi,
ich programmiere derzeit an einem 3D-Shooter Multiplayer mit einem dedicated Server. Es gibt einen zentralen Server, der nur in C# (ohne Unity) geschrieben ist. Auf diesem können sich Spieler anmelden und eine eigene Lobby erstellen und in diese Freunde einladen. Der zentrale Server ist auch für das Matchmaking zuständig und hat Zugriff auf eine Datenbank.
Meine Frage ist nun: Wie geht man vor, wenn man einen neuen Game-Room erstellen möchte? Den Spieleserver würde ich in Unity programmieren und am besten Unet verwenden, da dort viel Arbeit erspart wird. Außerdem soll der Server nicht nur Informationen an die Clients hin- und herschicken, sondern einige Dinge, wie beispielsweise die Richtung und Kollision der Projektile, brechnen. Da bietet sich Unity natürlich an. Soweit ich weiß, kann man später Unity-Projekte nur über die Konsole ausführen lassen und damit könnte man enorm Ressourcen sparen. Das Problem ist aber, dass man für jeden Game-Room keine neue Instanz einer Szene auf dem Spieleserver erstellen kann, da man in Unity immer nur eine Szene aktiv hat. Außerdem kann man Unity-Stuff nicht in separaten Threads abhandeln, denn das muss leider immer im Main-Thread geschehen. Eine Möglichkeit ist mir eingefallen: Man könnte für jeden Game-Room einen neuen Prozess erstellen, der auf jeweils verschiedenen Ports lauscht. Aber das Starten von Prozessen verbraucht mehr Leistung als Threads und ist deshalb nicht sehr effizient meiner Meinung nach. Oder liege ich da falsch und es stellt kein großes Problem dar?
Dieses Asset scheint mit verschiedenen Prozessen zu arbeiten. Ich bin mir da aber unsicher, ob das der richtige bzw. professionelle Weg ist: https://assetstore.unity.com/packages/tools/network/master-server-framework-71391
Ich möchte noch kurz erwähnen, dass ich nicht den Unity Networking Service, Photon oder ähnliches verwenden möchte, da es bei der kostenlosen Version auf ca. 50 Verbindungen beschränkt ist und ich gerne selbst den Server-Code programmieren und verstehen möchte.
Hat jemand eine Idee oder einen Ansatz, wie man das am besten umsetzen könnte? Ich freue mich über jede Antwort!
Viele Grüße
Christian