Who are you?
I’m a sole programmer on a localization team, and have released several retail games using unity.
What kind of game are you trying to build or would like to build?
We bring Japanese visual novel games to English (a niche market, I know!). Often the original code isn’t suitable for localization, but for various reasons, sometimes due to OS compatibility or other issue but more often than not they no longer have the code, so we need to port the game to a new engine. As you might guess, Unity is by far the fastest and easiest way to do this.
If you’re not familiar with visual novels, they are (usually) fully 2d, and play like elaborate cutscenes, with character sprites, portraits and backgrounds arranged on screen to make up scenes while text and voice conveys dialogue and narration to what’s happening. At times can make decisions throughout the game that impact how things play out. They don’t always count as a ‘game’ from a end-user standpoint, but the backend is all game. Behind the scenes, large script files direct all of the onscreen action and text.
How does Windows standalone player fit into that? What use-cases do you have?
Our games target windows as the primary platform, though we do release for mac os and linux as well. The games feature high resolution hand drawn art, so having a fast, pixel perfect 2d engine is an absolute requirement. While ‘visual novel’ as a genre is often associated with static images with text, what animation and movement occurs must be smooth and appealing, and being able to handle masking and transitions between cameras to create special effects and transitions is also important.
What are the GOOD things about Windows standalone player that you like?
For the most part, working with unity has been a blast. It is incredibly easy to get something up and running, and even as a sole developer on the projects, I’ve been able to get complete games up much faster than I would have thought necessary. Unity’s workflow, from the robust scene hierarchy, game objects and components, it all just really clicked with me and I find that there’s a huge amount of power in it. To single one thing out though, a lot of these games are heavy on the UI, so unity’s new UI tools are an absolute joy to work with.
What are the BAD things about Windows standalone player that you dislike?
The biggest pain I’ve had with working with unity has to do with the Asset systems. In my use case, our games contain a vast number of assets, usually in the 1-4 Gb range, mostly in the form of textures and audio assets. As an example, the current game I’m working on uses over 20,000 individual audio clips for character voices. The vast majority of assets are infrequently used, and sometimes only ever called on once. Unity completely falls apart when dealing with such a volume of assets. Ignoring the incredible time it takes to import or change platforms, prior to unity 5, you couldn’t even select that many files without unity crashing.
I attempted to solve the issue by using asset bundles, as this is the recommended solution for this use case, but it turns out it’s not really acceptable on desktop platforms. Loading asset bundles will load the entire bundle into memory, which when paired with my game’s huge number of infrequently used assets, was a no go. Technically I could suffer through and split things into thousands of smaller bundles, but when I attempted to do so I found that Unity will actually cache the asset bundles in the user’s appdata folder. That means that if I loaded 1Gb of assets, somehow unity would cache all of that into the users profile to take even more space. It makes sense if you’re loading asset bundles from the internet, but it makes absolutely no sense on a desktop platform.
In the end I ended up building my own external archive format and loading assets at runtime. It saved me the headache of having all those assets within my project, and allowed me flexibility to make useful changes (such as loading from a patch archive before others). This though wasn’t without challenges. Unity provides no facility to load audio files from an external archive. There’s just no way to do it. There’s functionality for loading ogg files via the WWW class, but you can’t load an ogg from a file stream or memory. I ended up using the library NVorbis to load and play these audio files, and piped the audio samples into unity using a custom audio filter. One giant hack.
I’ve ranted for a while, but one last note. The games I work with need to be pixel perfect, at least as the default resolution. I had an older game I worked on ran natively at 800x600… but if the users had a wide screen monitor, the game would stretch going full screen! Surely this should be easy, I could just handle the alt-enter key press to switch to a resolution of my choosing. But it’s actually impossible to change the alt-enter hotkey, it’s hardcoded into unity, and cannot be disabled. Ultimately I wrote a hook into user32.dll and kernel32.dll to intercept the keypress and use my own handler, but it’s one of those “things you can’t turn off and can’t change” that sometimes happens more than you’d like.
How can we make it BETTER? What use-cases, features, workflows would you like to see?
I think I covered my grievances above. I love unity, but yeah, there’s some issues. I think a more sane implementation of asset management and asset bundles would go a long way to making things better. Right now I don’t see why you would use asset bundles on desktop, it just doesn’t make a lot of sense, not without the ability to use them without loading them fully into memory (similar to how you use the ‘resources’ folder now), and not with them caching to appdata. Both sound like a result of only having the WWW class to load asset bundles. Relying on WWW to access locally stored assets in general seems like a bit hacky honestly.
Beyond better asset bundles, which would solve a lot of my current headaches, I guess I’ll re-iterate the usual nested prefabs suggestion, and more granular control over windowed fullscreen settings. Being able to switch while running to borderless fullscreen and such would be pretty grand. As alexzzzz mentioned before me, window positioning and fullscreen handling could use some love.