In this update5
Full notes
Full Argebe update
Read the full published notes in a cleaner layout. The original post stays linked below.
What changed
- Gameplay
- Server
Argebe changes
Oh boy.
This post marks the end of a long overdue rework that took me quite a while to finish. Let's look at where it all began, and why changing what I did was so important!
Humble beginnings
Argebe is my first multiplayer game. I've made some singleplayer games before, so I've had a decent amount of experience with Unity going into it. In fact, I was working on another game of mine when I had the inspiration and idea for what Argebe would turn out to be! I wrestled with my own urges to start a new project for a few weeks before finally giving in and looking into networking solutions for Unity.
Across the board, I saw mentions of a framework called "Mirror" and something called "Photon", but I kind of bounced off of those. What REALLY caught my eye was Unity's own solution: Network for GameObjects (NGO). Everything I needed was already built in, I wouldn't have to read into 3rd party documentation and it was relatively new and therefore most likely built with the issues of older systems in mind, while being old enough to have a good amount of forum entries and YouTube tutorials. So I sat down, built a little map generator and started experimenting with synchronizing games between instances.
And it was great! NGO worked perfectly as expected, I could connect to myself using my local IP Address and it even worked on multiple devices within the same network! I made the game playable and played it against family members who were unfortunate enough to be my test subjects (While the game was still horribly balanced), but eventually I wanted to play it with friends online.
The problem with playing online
There's only so far that a direct IP Address setup can carry you. That border is usually drawn at your router. Trying to reach the outside world like that would mean you'd have to perform some networking trickery while also exposing IP Addresses to the people in a game (They have to enter yours if they want to connect, of course). Having dedicated Servers was never an option for me, that stuff costs valuable money and might not be around forever, so I had to find a solution.
Relay
Unity provides some great Services, called "Unity Services". One of which is Unity Relay, a service that allows for peer-to-peer networking with a join code using a server hosted by Unity to act as a sort of IP replacement. Well, that's how you can imagine it at least. I shouldn't get too much into the tech side of things in this post. Does anyone actually read this by the way? Well, evidently you're reading it right now, so uuuhhh... thanks for reading my ramblings, that's really cool! I should probably cut to the actual meat and bones of this update though. So here's the deal:
Relay is free up to a certain amount of people using it at the same time.
Now, I'm not counting on Argebe ever reaching a large enough concurrent playerbase for this to matter, my goal is not to make the next Strategy E-Sports game, but I wouldn't want to have it passively drain my bank account while I'm not looking. I was fine with that though, since it worked and using NGO was easy and effective.
Playing with randoms
Of course I'd like to find other people that play this game, without having to use a join code. So of course I looked into my options and it turns out Unity also provides a service called "Lobby"! And guess what, it lets you set up lobbies that other people can join! I'll spare you the details on why it was so incredibly difficult to work with it, but let's just say Unity's documentation for it isn't exactly very accurate and I had to dig quite deep to find something about lobby callbacks, and then activate that feature after talking to a Unity rep who sad it was already available but then it wasn't, and the actual implementation was also weird and there were lots of rate limits and I could only ever have 30 concurrent users before I'd have to pay and I'm rambling again, so
Unity Services needed to go
At a point where I finally had everything working, it dawned on me: Lobby and Relay, while great for my initial plans, wouldn't cut it past those. Lobby filtering didn't really work, there were desyncs and other network issues, the callbacks weren't reliable and the rate limiting was annoying and counterproductive. Oh, and the costs too. So I looked back into "Mirror", because I knew that that would work with Steamworks transport. In fact, at that point I had already integrated Steamworks (More specifically the Facepunch implementation of it) into Argebe for features like achievements and stats. I tried using the raw Steamworks Sockets implementation for a while, but that didn't really work out too well.
But upon closer inspection, I found a transport implementation for Steamworks that worked with NGO, and Facepunch also included Steam Matchmaking, which would be a great Lobby replacement. So I took several weekends to rip out Relay transport and replace it with the Steam implementation, followed by scrubbing the project clean of any traces of Unity Lobby and instead using Steam Matchmaking. And that is where we are today.
There were of course some other fixes and small changes in this update, but the main deal here is that we're not completely running on Steam! That means I can open up the real test-gates soon! Well, I should probably market the game a bit more before that point.
For now though, to all my current testers: Please try out the online mode! If you need more keys to give to your friends, tell me! Let the masses break the game so I can fix it before going live!
Thank you so much for your time and interest! I'm already looking forward to working on something else in the meantime that does not involve networking...
Source
Changelog.gg summarizes and formats this update. How we read updates.
