Pre-launch update!
HELLO!
March and April kind of feel like a blur. We’ve been deep in development focusing on getting Ether shipped on the PS4 so apologies about the lack of updates in April. It’s being released in a few days so I’ve I thought this would be a good chance to update you all about how the last couple of months have been.
We went out to GDC in March with the UE team and had a great time! I can’t thank them enough for the amazing experience. They really do treat the community great and everyone on the team is incredibly open and nice and treat you as part of the family. I’d especially like to thank Chance Ivey for organising for us all to attend. It must have been a hectic time for him sorting out all of the awesome UE content at GDC and on top of all that he arranged for a group of devs from the community to hang out with them. It must have taken a huge amount of planning and preparation and it goes to show just how much the UE team care about their community. I didn’t manage to write an update of the trip but Tom Looman over on his blog did a pretty good post for anyone interested. I have to say, I met some awesome (and incredibly talented) guys from the community (see image below) and it was inspiring to see so many awesome things being done in the engine - it gave me a good recharge of energy to get home and get the game finished.
But anyway … back to development!
So the last couple of months have been focused on shipping our game on UE4 and we’ve come into some interesting hurdles along the way which I wanted to talk to you about.
Shipping in UE4 on console over PC.
I’ve always heard horror stories about cross platform releases and how you’d have to optimise in different areas to get the game to even run. Thankfully we’ve found that this isn’t the case with UE4 and they’ve clearly put a lot of thought into small teams shipping games on multiple platforms. We went to the PSX last year with Sony and creating the demo to show at the event was just a case of telling the engine which platform to deploy to. This is great because it means you’re not taking time out of development to focus on a single platform. That said though, I would recommend any development teams wanting to release on multiple platforms to focus on one platform at a time. We’ve ran into a lot of platform specific issues which has slowed down progress and so rather than worrying about all the issues on each platform at once, we decided to focus on just the PS4 and then release PC a few weeks. We decided to do this because we already knew the process of releasing a game on PC from last year and the PS4 is our first console game, so we wanted to focus on the unknown first. If you’ve never shipped on console before, I would highly recommend you focus on that first.
Custom Actor Classes
Using custom actor classes helps massively when shipping a game. As I may have mentioned in a previous post, we use something called an ‘EtherTriggerItem’. This is a pretty basic class that detects when the player clicks on it and then it will send off a ‘Triggered’ event inside of Blueprint. It also has a few other properties built into it such as ToggleHidden, Screentag (this is for when you press and hold LMB on the object it tells you what it’s called), StaticMeshComp, etc. So this is basically just a Static Mesh with a bunch of additional properties. The great thing about this is if I set something to hidden or toggle hidden through blueprint at any point of the game, our programmer has already saved the property ‘ToggleHidden’ which means that’s one less thing to worry about when it comes to implementing a save game system. It also means I can have a folder in my content browser full of different trigger items extended from ‘EtherTriggerItem’ so they inherit the same properties and I don’t have to worry about setting them up each time. This has been a massive time saver in terms of getting the puzzle design implemented because we re-use a lot of mechanics throughout the map and it’s a case of dragging and droping into the world then editing any custom functionality.
In Ether UDK we also had a custom particle system & custom InterpActor however we didn’t feel as though we needed the particles this time around because and I used EtherTriggerItems whenever I needed to make something move as they’re dynamic by nature. I may not have needed all of the other properties such as a screentag for a basic mover however it allowed me the flexibility to implement things quickly and if I then decided I wanted a screentag later on then it was already there to access.
Through Blueprint we had a PostSave and PostLoad function, this mean that I could save a variable, timeline or whatever had changed in the level and then on post load I could get a saved bool and fire off an event into Blueprint on True/False which gave me (as a designer) a lot of power – It also means that if anything isn’t saving properly it’s all my fault instead of passing the blame onto our programmer!
Save game through Blueprints
What an invention! The save game property on all variables in Blueprint. I can’t say enough how helpful this has been. It has sped up our workflow massively. Instead of finding something that isn’t saving then waiting on our programmer to fix things I can now jump in and fix everything that doesn’t save by clicking the save game property on a variable. I sometimes question if this is too much power for a designer to have but hey, it works! I would recommend creating a new category called ‘SaveGame’ when saving variables so that you can quickly go into each blueprint, select the category and flick through all the variables to make sure the property is ticked. If you have a lot to do at once or if you’re just completely worn out from development when clicking the savegame it’s possible that you might forget to tick one or two so this process ensures that you can quickly locate the ones that haven’t been ticked.
Level Streaming on console
I wanted to make sure the game ran smoothly on the PS4 and I knew that it would require a lot of optimisation. The good thing about releasing on the PS4 means that we focused a lot on optimisation at the beginning and therefore when it comes to releasing on PC we’ll also be well optimised.
One thing that I have found though is that you can go too far with level streaming. In one of the bigger levels in the game (Pinwheel Village) we had about 40 streaming volumes in place making sure that whenever you couldn’t see something it was streamed out. We also had pretty aggressive culling in place and had secondary culling for longer view distances. This worked out really well on PC however when we loaded onto the PS4 we were getting crashes. This was partly due to a SceneRenderCapture not working how it was supposed to but it was also to do with the streaming volumes and trying to calculate multiple volumes at a time. It turns out that when the console is constantly thinking about which level is loaded in is just as bad as having everything loaded in (if not worse). To get the game running we had to do multiple tests, I ended up deselecting all streaming volume information from each streamed level and it seemed to still run fine. It turns out with just a culling volume in place and all levels streamed as AlwaysLoaded we only get slightly less FPS (maybe 2-3) however everything else runs fine. Sometimes you have to be conscious about over-optimisation and whether you’re actually improving the game at that point. One of the biggest flaws of UDK Ether was that we didn’t have enough time to optimise at the end. Once you get to the end of a project it’s almost too late to start streaming levels (especially levels with a lot of gameplay/kismet/blueprint on them) because you don’t want to break everything. I’ve found doing this process early on definitely helped however it’s also possible to go too far so know your limitations!
The ‘Promoted’ branch
Somewhere towards the end of March it was decided we had to move over to the 4.8 promoted branch. Obviously this was a massive step because it isn’t recommended you move a game onto an unreleased engine as they can sometimes be unstable however the pros well outweighed the cons in this instance. This helped our programmer out massively as he had access to a lot of things he needed to ship our game on console. However it also broke a lot of art & design things in the game. When it starts getting to the end of a project, the programmers time is more valuable than art and design because of the amount of systems that can break or the platform specific code that needs implementing. So anything that you can offload from the programmers workload the better. It also meant the rest of the team had a lot of bug fixing on their hands. Things like particles not working, and SSAO breaking were common issues. The AO seemed to get fixed then break again multiple times which was quite stressful because we thought we might have to ship with broken AO but thankful the UE devs on the forum helped us out very quickly with those issues so that was a massive help.
The biggest issue we had was with blocking volumes not translating over onto PS4. If I created blocking volume in the editor and duplicated it around to different parts of the level it would work perfectly on PC however when you built for PS4 all the blocking volumes wouldn’t be detected. It took me multiple packaged builds of identifying the issue but it turned out it was if a blocking volume was duplicated and then moved onto a streamed level. Obviously this is a very Ether specific bug but I guess I’m trying to say that random issues can arise towards the end of devel and they take time to identify and fix. Knowing that these things can happen unexpectedly will allow you to leave plenty of time before shipping which is another reason why tackling one platform at a time would make your life a lot easier and allow you to ship on time.
Closing thoughts
The main development of Ether One has pretty much wound to a close now. We’re launching on Playstation 4 through the PS+ instant game collection this week and then it will be a case of identifying bugs and getting it patched as quickly as we can and then moving onto PC in a few weeks. The interesting thing about shipping a game is that no matter how much playtesting you do it will never be as much as day one release when 1000’s of people are simultaneously playing your game. Hopefully there won’t be any major issues but you can never tell – the important thing is that your active in responding to the community and get the issues resolved as quickly as you can. Once the bugs are fixed we’ll then move onto the PC re-release which will be free for people that already own the game and then we’ll be moving onto new things!
I’ll still post a few more updates on post-release and any other advice I can think of about shipping a game and the process of moving from UDK to UE4 however please do post any questions you may have about the process as we’d like to help people out in any way we can.
Thanks for reading!