Beste tweakers,
ik ben al een poosje bezig om een FPS game te maken in unity. Het is een multiplayer fps (zonder plugins, dus met eigen server gebruikmakend van TcpListeners e.d.) waar ik natuurlijk probeer uniek te zijn. Nou ben ik nog niet bij dat stadium, maar ik heb al wel een paar ideeën.
Ik ben in dit project als nog een redelijke noob gestapt. Zo had ik nog weinig benul wat een static variable nou deed of wat een struct precies was.
Gelukkig heb ik veel geleerd sinds het begin van het project. Daarom dacht ik dat het handig was om mijn oudste code eens wat beter te maken. Dit was ook de aller belangrijkste code van de game en server, namelijk de tcp networking code.
De oude code was gebaseerd om deze filmpjes op youtube:
YouTube: C# Tcp tutorial pt 1 - Server
YouTube: C# Tcp tutorial pt 2 - Client
Als je het offtopic gedeelte hebt gelezen en begrepen:
Zo niet dan is hier de conclusie: Ik ben nog steeds niet tevreden met mijn huidige implementatie van mijn tcp-systeem.
Heeft iemand ervaring met iets soortgelijks? Ik zoek niet naar een concrete oplossing, maar meer een duw in de goede richting. Tot nu toe zijn de oplossingen die ik bedacht heb het telkens net niet.
Ik hoop dat ik niet te vaag ben... Als er vragen zijn, dan beantwoord ik ze natuurlijk graag.
ik ben al een poosje bezig om een FPS game te maken in unity. Het is een multiplayer fps (zonder plugins, dus met eigen server gebruikmakend van TcpListeners e.d.) waar ik natuurlijk probeer uniek te zijn. Nou ben ik nog niet bij dat stadium, maar ik heb al wel een paar ideeën.
Ik ben in dit project als nog een redelijke noob gestapt. Zo had ik nog weinig benul wat een static variable nou deed of wat een struct precies was.
Gelukkig heb ik veel geleerd sinds het begin van het project. Daarom dacht ik dat het handig was om mijn oudste code eens wat beter te maken. Dit was ook de aller belangrijkste code van de game en server, namelijk de tcp networking code.
De oude code was gebaseerd om deze filmpjes op youtube:
YouTube: C# Tcp tutorial pt 1 - Server
YouTube: C# Tcp tutorial pt 2 - Client
spoiler:
Pas op: vage tekst hier beneden...
offtopic:
Hoe werkte mijn systeem?
De server en client waren (zo goed als) gelijk aan elkaar qua werking.
Beiden zaten ze op een poort te luisteren. Zodra er een connectie gevraagd werd, werd hij geaccepteerd. Het bericht werd uitgelezen en in een centrale list gezet. Hierna werd de connectie geclosed.
Om de centrale berichten list te doorlopen had ik een loop gemaakt. Deze checkte of er nieuwe berichten waren en voerde ze uit op de volgende manier: De server maakte verschil tussen servercommands en lobbycommands. Deze zaten in verschillende classes. Zodra het bericht naar de juiste class was gestuurd (let op: er zijn meerdere lobbies) voerde de class het bericht uit. Ik kan het wel verder uitleggen, maar het zal er niet duidelijker van worden.
Wat was er mis met de oude implementatie?
Hoe werkte mijn systeem?
De server en client waren (zo goed als) gelijk aan elkaar qua werking.
Beiden zaten ze op een poort te luisteren. Zodra er een connectie gevraagd werd, werd hij geaccepteerd. Het bericht werd uitgelezen en in een centrale list gezet. Hierna werd de connectie geclosed.
Om de centrale berichten list te doorlopen had ik een loop gemaakt. Deze checkte of er nieuwe berichten waren en voerde ze uit op de volgende manier: De server maakte verschil tussen servercommands en lobbycommands. Deze zaten in verschillende classes. Zodra het bericht naar de juiste class was gestuurd (let op: er zijn meerdere lobbies) voerde de class het bericht uit. Ik kan het wel verder uitleggen, maar het zal er niet duidelijker van worden.
Wat was er mis met de oude implementatie?
- Om een bericht te versturen naar een client/server moest er elke keen een nieuwe connectie gemaakt worden. Zodra het bericht gestuurd was, werd de connectie weer gesloten. Dit is niet optimaal voor een tcp-verbinding.
- Elk bericht was een naar bytes geconverteerde string. Om bijv. aan de server te zeggen welke map geselecteerd is stuurde je een bericht als deze: "/Lobby:2 Action:SetMap Value:5". Dit zou in de derde lobby de zesde map selecteren. Dit zorde ervoor dat als ik iets van de server/client nodig had, dat ik eerst moest opzoeken hoe de string voor de functie die ik wilde gebruiken eruit moest zien. Dit was erg onhandig. Ook moest je alle variabelen die wilde verzenden
- Het was niet mogelijk om antwoord te geven aan een request; Als je wilde weten van de server welke map geselecteerd dan stuurde je een request. De server "antwoorde" daarop met een setmap bericht, wat alle erg ongeorganiseerd maakte.
- Het was onveilig. Het maakte niet uit wie je was, maar als je een bericht stuurde, dan werd hij uitgevoerd.
Als je het offtopic gedeelte hebt gelezen en begrepen:
Zo niet dan is hier de conclusie: Ik ben nog steeds niet tevreden met mijn huidige implementatie van mijn tcp-systeem.
Heeft iemand ervaring met iets soortgelijks? Ik zoek niet naar een concrete oplossing, maar meer een duw in de goede richting. Tot nu toe zijn de oplossingen die ik bedacht heb het telkens net niet.
Ik hoop dat ik niet te vaag ben... Als er vragen zijn, dan beantwoord ik ze natuurlijk graag.