Jump to content
Unity Insider Forum
Sign in to follow this  
  • entries
    14
  • comments
    32
  • views
    42,197

UNet, Photon, nein ich gehe zu Lidgren (oder alternativ zur Bolt)

Sign in to follow this  
MaZy

734 views

[size=6][font=courier new,courier,monospace][i]Keine Zeit mehr zu warten.[/i][/font][/size]

(Der Text wurde sehr spät. bzw früh mit Müdigkeit und Mühe geschrieben. Eventuell gefundene Fehler werden bald mit einem Update gefixt :))

[font=courier new,courier,monospace][size=6][b]UNet[/b][/size][/font]
[font=courier new,courier,monospace][size=1]-[/size][/font]
[font=courier new,courier,monospace]Ich habe mich mit UNet auch intensiv beschäftigt. Ich muss leider sagen, dass es nicht wirklich meine Wünsche befriedigt. Ist egal, ob es jetzt seine Endphase nicht erreicht hat, aber wie sich das entwickelt zeigt schon, dass ich doch bei der alten Network bleiben muss, oder meine eigene brauche.[/font]

[font=courier new,courier,monospace]UNet ist toll, wenn man diesen NetworkManager benutzt und seinen zwei Szenen klatscht. Was aber, wenn man mehrere hat? Steht nicht viel dazu. [/font]
[font=courier new,courier,monospace]UNet bietet auch Cloudserver an, was total schön ist für Spiele die sehr dynamisch aufgebaut sind (So wie bei LoL, Dota 2: Spiel / Match suchen / finden -> Server wird bereitgestellt -> Spiel beenden -> Server wird für die nächsten Matches verfügbar gemacht)[/font]

[font=courier new,courier,monospace]Doch was ich bei UNet bemerkt habe ist, entweder du hast es sehr simple oder sehr schwer. Das hat sogar ein Unity-Crew gesagt in einer Demonstration. Entweder leicht haben oder sich Schwer machen. So ähnlich wurde es gesagt. Ich muss sagen ich finde es schwerer als altes Netzwerksystem.[/font]

[font=courier new,courier,monospace]Warum?[/font][list=1]
[*][font=courier new,courier,monospace][b]PlayerController[/b]: Ist eine Klasse aus Networking. PlayerController ist quasi sowas wie NetworkPlayer. Hat eine Variable PlayerController.[b]gameObject[/b]. Da steht, dass es einen Player GameObject gibt. Was wenn wir RTS spiele machen und viele Einheiten steuern? Wo ist dann Player GameObject.[/font]
[*][font=courier new,courier,monospace]NetworkServer und NetworkClient ist zu kompliziert gemacht. Man weiß gar nicht, wann man was braucht. Ich habe echt lange gebraucht bis ich das hinbekommen habe.

[b]NetworkServer.Listen(port)[/b] und [b]NetworkClient client = new NetworkClient()[/b]
brauchen Konfigurationen bevor sie laufen. Das finde ich ja noch ok, weil man da vieles einstellen kann, aber mache Dinge machen keinen Sinn. Für beiden kannst du die Maximale Connection einstellen. Wieso? [/font]
[*][font=courier new,courier,monospace]Viele Namen werden komisch verwendet, die nicht das Aussagen, was eigentlich tut. AddPlayer ist jetzt zum Beispiel bedeutet, dass man einer Verbindung ein GameObject zuweist (Quasi sagen dieser Spieler darf diesen GameObject kontrollieren).[/font]
[*][font=courier new,courier,monospace]Zu sehr auf Lobby Spiele fixiert.. Spieler müssen sogar "ready" sein um weiter zu kommen.[/font]
[*][font=courier new,courier,monospace][b]Command[/b] und [b]RpcClient[/b] sind auch nette Attributen.[/font]
[font=courier new,courier,monospace]Command werden von Clients (Zitat: aus Spielerobjekten) an andere Spielerobjekte gesendet. Daher Server als Spielerobjekt kriegt es eventuell auch. [/font]
[font=courier new,courier,monospace]Z.B: CmdDoFire().[/font]

[font=courier new,courier,monospace]RpcClient sendet von Server Objekten an Objekten von Clients[/font]
[font=courier new,courier,monospace]RpcKill()[/font]

[font=courier new,courier,monospace]Beide Attributen zwingen entweder Cmd oder Rpc als Anfangsbuchstaben für eine Funktion zu benutzen. Gar nicht toll!!. Sieht Später richtig unübersichtlich aus.[/font]

[font=courier new,courier,monospace]CmdDoFire()[/font]
[font=courier new,courier,monospace]RpcKill()[/font]

[font=courier new,courier,monospace]Hier muss man kein networkview.RPC oder sowas ausführen. Hier kann man Direkt den Methoden Namen schreiben und es ist automatisch an andere versendet.[/font]

[font=courier new,courier,monospace]Vielleicht merkt ihr das Problem[/font]
[font=courier new,courier,monospace]Command: Client an Clients & Server[/font]
[font=courier new,courier,monospace]RpcClient: Server an Clients[/font]

[font=courier new,courier,monospace]Wo ist von Server an Server und Clients.. gibst nicht. Und das doofe ist, dass die Methoden RpcKill bei sich selber nicht funktioniert. Man ist also gezwungen noch eine Funktion Kill() zu schreiben, wo nochmal die gleichen Sachen stehen. Das ganze zwei Mal machen nein Danke.[/font]
[*][font=courier new,courier,monospace]Ist schwer zu beschreiben. Ich hatte eine Klasse wo ein NetworkView Component war. dort hatte ich auch ein Script wo viele Funktionen gab. Sowas wie ChangeName, Chat. So allgemein Dinge halt. Ich musste den Component nur linken. Dann hatte ich sowas wie GlobalNetworkview.RPC("methode, All, bla, bla). Das geht noch so mit UNet. Allerdings ist das Problem bei Playerobjekten. Die Skripte müssen quasi das gleiche seine um etwas Synchron zu machen.

Stellt vor. Mein GlobalNetworkview wäre für alles. Da bekomme ich die Position, die Rotation von Objekten, Chat nachrichten alles einfach.

Jetzt ist das nicht mehr möglich[/font]
[/list]
[font=courier new,courier,monospace]Wie man sieht [size=5][b]zwingt[/b][/size] mich UNet zu Dingen, die ich gar nicht möchte und vor allem nicht brauche, wie mit PlayerObjekten zuweisen.[/font]


[font=courier new,courier,monospace][size=6][b]Photon Cloud[/b][/size][/font]
[font=courier new,courier,monospace][size=1]-[/size][/font]
[font=courier new,courier,monospace][size=4]Photon ist gut. Leider aber können die Pings manchmal hoch sein 80-120. Gute Pings sind im Vergleich 10-40.[/size][/font]
[font=courier new,courier,monospace][size=4]Daher passieren auch doofe Lags und Verzögerungen im Spiel die man bisschen umgehen kann ( "visuelles Faken" nenne ich das :) )[/size][/font]

[font=courier new,courier,monospace]Photon Cloud kostet, aber bis 20 concur kostenlos, 100 ConCur einmalig 90$ glaub ich war das. Geht noch so.[/font]

[font=courier new,courier,monospace]Das Problem ist, dass ich schon mal geschafft habe, dass ich 90.000 Spieler gleichzeitig bei meinem App sich aufgehalten haben. Wie soll man Später sowas bei Photon Cloud finanzieren. Damit mach ich nicht das Geld, womit ich das finanzieren könnte.[/font]

[font=courier new,courier,monospace]Außerdem gibst hier riesen fetten Nachteil. Kein serverseitiges Programmieren. Alles läuft über ein Spieler (als hätte er das Spiel gehostet).[/font]
[font=courier new,courier,monospace]Ich will, aber auch das können.[/font]



[font=courier new,courier,monospace][size=6][b]Bolt[/b][/size][/font]
[font=courier new,courier,monospace][size=1]-[/size][/font]
[font=courier new,courier,monospace]Bolt wird jetzt auch von Exitgames entwickelt (von Photon Leuten). Leider weiß ich noch nicht viel darüber, aber anscheinend wollen die Matchmaking mit einplanen, die durch ihren Photon Cloud System laufen wird. Ob es auch nen Auto-Matchmaking haben wird ist ne andere Sache. Genau aber das werde ich brauchen.[/font]
[font=courier new,courier,monospace]Da ich wenig Zeit habe brauche ich eine Alternative.[/font]
[font=courier new,courier,monospace]Bolt ist eine Erleichterung was Programmierung an geht, wenn es um Networking geht. Viele Lösungen wie zum Beispiel Animation Synchronisierung wird da angeboten. Außerdem wird alles über Unity programmiert :). Konsole sowie Dedicated soll auch geben.[/font]


[font=courier new,courier,monospace][size=6][b]Unity Networking (altes)[/b][/size][/font]
[font=courier new,courier,monospace][size=1]-[/size][/font]
[font=courier new,courier,monospace]Die besten Erfahrungen habe ich damit gemacht. Bietet nicht viel an, aber dafür hat man andere brauchbaren Dinge. Hier kann man schön eigenen Server programmieren. Ein Beispiel zu meinem Spiel. Ich habe ein Server programmiert, wo man die Welt aber nicht sieht (denn es war nicht autoritativer Server), jedoch sollte irgendwo konstant ein Server laufen, wenn man das wollte. Zack programmiert fertig.[/font]

[font=courier new,courier,monospace]Bei einem anderen Beispiel war alles auf dem Server. Kollisionen usw wurden da auch überprüft. Das geht mit Bolt auch, aber nicht mit Photon Cloud und eventuell mit Lidgren.[/font]

[font=courier new,courier,monospace]Leider lässt angeblich die Perfomanz bei vielen Spielern nach. Habe ich bis jetzt erlebt.[/font]

[font=courier new,courier,monospace]Großer Nachteil für mich. Kein auto-matchmaking.[/font]
[font=courier new,courier,monospace]Wer mein Blog verfolgt hatte, hatte gesehen, dass ich das damit am Lösen war. Das Problem ist, dass es etwas machbar war, aber es wäre auf deutsch gesagt "scheiße" gelaufen. Sehr viel Fummelarbeit.[/font]

[font=courier new,courier,monospace][b]Lidgren[/b][/font]

[font=courier new,courier,monospace][size=1]-[/size][/font]
[font=courier new,courier,monospace]Lidgren ist kein Service wie bei UNet, Photon und Bolt, sondern man muss echt von Null Anfangen. Lidgren ist ein Allgemeines Networking für C# .Net.[/font]
[font=courier new,courier,monospace]Das heißt man müsste erst mal Unity dazu bringen Lidgren zu verstehen und Lidgren dazu bringen Unity zu verstehen (Plugins, Coding usw).[/font]

[font=courier new,courier,monospace]Ich habe damit angefangen muss sagen, dass es mir bis jetzt Spaß macht. Endlich mal, wo ich weiß, dass ich alles mir erstellen könnte, was ich so brauche. Denn ich fange von Null an und kann meine Wünsche mit einbauen.[/font]
[font=courier new,courier,monospace]Wird vielleicht länger dauern, schwer sein, aber, wenn ich überlege werde ich mehr Zeit sparen als auf UNet zu warten, als über Photon kosten auf zu regen.[/font]
[font=courier new,courier,monospace]Man auch mal richtigen dedicated Server mit ner Konsole machen ;) [/font]

[font=courier new,courier,monospace][size=5][b]Und was genau mach ich da? [/b][/size][/font]
[font=courier new,courier,monospace]Ich sage mal so. Bin ungefähr bei 40 %. Ich habe nun Lidgren und Unity kennenlernen lassen. Ich kann Server erstellen und kommunizieren lassen. Bis jetzt waren das nur Texte, aber vieles wurde vorbereitet. die ganzen Standard Sachen wie Vectoren, Quaternion, int, float habe ich eingebaut.[/font]

[font=courier new,courier,monospace]Vieles fehlt noch. Derzeit arbeite an einem System, wo man auch zukünftig, andere mit Leichtigkeit hosten lassen kann.[/font]

[font=courier new,courier,monospace]Eventuell werde ich meinen eigenen Auto-Matchmaking schreiben. Wir gucken mal weiter.[/font]

[font=courier new,courier,monospace]Der Anfang[/font]
[font=courier new,courier,monospace][img]http://puu.sh/jRd9u/286bfeb13a.png[/img][/font]
[font=courier new,courier,monospace]Wie man auf dem Bild sieht hoste ich mit ner Konsole. Und da ist auch ein Message von einem Client angekommen als "Broadcast" mit "this is a test"[/font]
[font=courier new,courier,monospace]Und in der Unity Console sihet man, dass der Server auch was zurück geschrieben hat.[/font]

[font=courier new,courier,monospace]Und dazu hab ich ne eine DemoKlasse gemacht:[/font]
[font=courier new,courier,monospace][img]http://puu.sh/jRgV6/3abae0ae7a.png[/img][/font]

[font=courier new,courier,monospace]Wie man hier sieht habe ich sowas änhnliches wie beim UNet "ULGNetworkbehavior". Dort wird Global eine Verbindung aufgebaut, sei es als Server oder Client. Gott sei Dank geben bei dir den Peer connection zurück, wobei ich dann nicht NetServer oder NetClient benutzen muss. Würde einfach doppel zu viel Arbeit machen.[/font]

[font=courier new,courier,monospace]Wenn man Connect macht (Eventuell, werden diese namen verändert).[/font]
[font=courier new,courier,monospace][img]http://puu.sh/jRgTX/b498c72601.png[/img][/font]
[font=courier new,courier,monospace]Dummerweise kann nicht wirklich FailConnection auswendig machen. Da kriegt man auch einfach Disconnectereignis. Vielleicht schicke ich bei der Disconnect Event noch eine Meldung (Grund Paramater) hinterher und die Entwickler können selbst entscheiden, obwohl sie danach überprüfen. Mal sehen.[/font]

[font=courier new,courier,monospace]Derzeit sieht der Ordner so aus:[/font]
[font=courier new,courier,monospace][img]http://puu.sh/jRhhp/6e3854da43.png[/img][/font]


[font=courier new,courier,monospace]NetMessage ist einfach eine Hilfe um die Unity-Typen besser zu senden. Mit nem[/font]
[font=courier new,courier,monospace]Netbuffer.WriteVector3(Playerpos) kann man seine Position über das Netzwerk senden.[/font]
[font=courier new,courier,monospace]mit NetBuffer.ReadVector3() kriegt man dann die Position wieder.[/font]

[font=courier new,courier,monospace]Falls ihr ideen habt immer her damit.[/font]
[font=courier new,courier,monospace]Ich habe extra nen Trello erstellt. Eigentlich für mich persönlich, aber auch falls ihr Ideen habt.[/font]

[font=courier new,courier,monospace]Der Text wurde sehr spät. bzw früh mit Müdigkeit und Mühe geschrieben. Eventuel gefundene Fehler werden bald mit einem Update gefixt :)[/font]
Sign in to follow this  


8 Comments


Recommended Comments

Tsja Unity halt solang du im workflow bleibst bist fast as possible sobald du allerdings was von auserhalb willst musst du alles von selbst machen.

Zu Lidgren kann ich nur bestätigen ist immer noch relativ einfach. Hier ein kleines Implementierungs beispiel http://1drv.ms/1Ts87A2 vorsicht die Verschlüsselung hat aktuell einen Bug (sollte ich irgendwann mal fixen)

Share this comment


Link to comment
Super Infos! Was würdest du empfehlen, wenn man nur ein Zweispieler/Duell Game machen möchte? Vor allem sollte es auf den verschiedenen Plattformen laufen. Gibt es noch andere Systeme die du noch nicht aufgezählt hast?

Share this comment


Link to comment
@Mabenan. Danke. Ich habe das mal bissel angeguckt, aber ist etwas anders Aufgebaut als bei mir. Sieht gut aus.
Ich habe schon da ein Problem bei mir. Ich versuche das gleiche aufzubauen wie bei Unity und Photon State Sychronizing also OnNetworkviewSerialize. Jedoch weiß ich nicht, wie ich unbekannte Typen mit Write senden und empfangen kann.

Write ist ok, aber wie soll der Server immer wissen, was die Clients senden.
Was ich vorhabe ist, dass der Entwickler nichts auf dem Server machen muss, außer auf dem Client. So wie bei Photon. Da wird auch alles zu Server gesendet und der Server sender weiter zu Clients. Der Cloudserver kann ja unmöglich wissen, was wir Programmierer alles senden wollen ^^.

@delspeedy. Es gibt noch Forge. Das soll auch gut sein.
Bei Zweispieler Duell Game allein reicht nicht aus, um zu sagen, was man da benutzen sollte. Die Faktoren wie Multiplayer Lobbys, Räume, Autohosting und Datenbänke usw die sagen da mehr aus.
Wenn es darum geht, dass einer hostet und der andere joint, dann kann man auch das normale Unity Networking nehmen.

Share this comment


Link to comment
@MaZy verstehe ich dich richtig das dein Server nur Packete zu anderen Clients weiterleiten soll? Wenn ja musst du doch nur die Input Message nehmen und wieder in ne Output Message umwandeln dich braucht ja der Inhalt nicht zu kümmern wenn du es Auf bestimmte Message beschränken willst kannst du für Message allgemein ein byte an den Anfang schreiben was den Type der Message festlegt

Share this comment


Link to comment
[quote name='Mabenan' timestamp='1442307994']
@MaZy verstehe ich dich richtig das dein Server nur Packete zu anderen Clients weiterleiten soll? Wenn ja musst du doch nur die Input Message nehmen und wieder in ne Output Message umwandeln dich braucht ja der Inhalt nicht zu kümmern wenn du es Auf bestimmte Message beschränken willst kannst du für Message allgemein ein byte an den Anfang schreiben was den Type der Message festlegt
[/quote]

Ich habe bereits von anderen eine Hilfe bekommen wie man das machen kann.

Das Problem war, dass man einen IncomingMessage bekommen hat, aber du wusstest als Server nicht, wie viele mal "Write" benutzt wurde und welcher Type benutzt wurde und zu OutgoingMessages kann man auch nicht einfach so umwandeln.

Ja mit dem Type vor dem Message hatte ich auch die Idee, aber ich müsste noch überlegen wie ich weiß wie viele da ankommen.
Ich wollte for schleife benutzen und dann zu OutincomingMessage machen.
Dafür wurde mir das hier gezeigt:
[quote]while (netIncomingMessage.PositionInBytes < netIncomingMessage.LengthBytes - 1)[/quote]
Das wird mir helfen ^^

Share this comment


Link to comment
Ãœber Bolt:

Bolt wird/wurde vom Einzelkämpfer Fredrik Holmström (auch als fholm im Netz unterwegs) entwickelt. In einer Erklärung heißt es, dass fholm sein Projekt unter den Schirm von Photon schiebt, damit er sich nicht mehr mit administrativen Aufgaben auseinander setzen muss und so sich koimplett auf die Entwicklung von Bolt stürzen kann.

Das Bolt eine Integration der Dienstleistungen von Photon erhält ist mir neu. Bisher läuft das Design von Bolt darauf hinaus, dass die Hosts der Matches auf einem Clienten laufen. Ein Masterserver hilft nur Sessions anzubieten und dann das NAT Punch Through auszuüben, dass Spieler eben über das Internet sich zu anderen verbinden können.

Daher ist Bolt eher für das lokale Netzwerk geeignet, es sei denn es kommt tatsächlich noch ein Server hinzu, damit nicht der Host eines Matches durch eine schwche Breitbandanbindung ein Störrfaktor ist.


Das Entwickeln von Mehrspielern mit Bolt ist richtig richtig gut - es macht sehr viel Spaß. Es wirkt sehr durchdacht. Die Community ist lebhaft.

Share this comment


Link to comment
Hallo MarcoMeter. Folgendes steht aktuell auf der Seite:
[img]http://puu.sh/ldz49/db8191a1c2.png[/img]
In der ersten Beschreibung stand noch sowas wie powered by Photon Cloud oder Zeus. Bin mir nicht sicher, welches davon geschrieben war.
Wie man hier auch raus lesen kann, wird es tatsächlich sowas bald angeboten.

Share this comment


Link to comment

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
×