The Unity3D game engine is a powerful tool that I'd love to make use of, but lack of Linux support for their editor has made it an awkward fit for my environment. Recently, I took a few tries at getting it running on Linux, and I have documented the results here.
Unity has some support for Linux as a target platform to build games for, and they also have a Linux version of their Web Player plugin. This is great, but as a developer what I really would like is the ability to run the editor on Linux.
It is possible to run Unity on Windows and MacOS, but I'm a long time Linux user, and I'm not too excited about making the switch, needing to dual boot, or losing the advantages of operating under an environment that I am experienced and productive with.
It seems like there is an idea out there that there are not enough Linux users that would buy a pro license or subscription for Unity, and so it isn't worth their while to release and maintain a Linux version. Who knows whether there really are not enough people, but I am among those who likely would buy one. We do exist.
All usage detailed here was done with Unity version 4.5.4f1. The laptop used was a little old. It had an Intel i5-460M 2.5ghz CPU, and integrated Intel GMA HD graphics. These attempts were all performed in September and October of 2014.
My first attempt at running Unity3D on Linux was with Wine. The Unity Wiki has a page that goes over the details. I used their install script for PlayOnLinux. The whole process was very smooth and made it easy to get started.
When running under Wine things were fairly usable. I put in a couple dozen hours towards learning Unity while running in Wine, and I was able to do a lot of what was needed to run through tutorials and experiment with many different features.
As shown on the Unity Wiki page for Wine, it is possible to integrate with your native editor and image editing program. This worked well, and with a few tweaks to the scripts on that site I was editing code in Emacs and images in Gimp.
I did use MonoDevelop a little bit before I setup Emacs, and I didn't run into any problems. I did not try debugging or anything fancy, but as a code editor it worked fine.
I was able to create, edit, and build projects. There were some issues here, but I made several native builds of games for different platforms, including Linux, Windows, and Android. Just a few hours after I had first installed I was able to run around a hilly tree-filled terrain FPS style on an Android build running on an Amazon Fire TV. This immediate success using Unity really drew me in and provided the motivation to keep trying to find a workable way of getting a production Unity development environment going.
As a note on building for Android, in order for that to work you have to install the Android SDK. To do this, download the SDK, run playonlinux and then press "Configure" while your Unity3D install is selected. Under the "Miscellaneous" tab, press "Run a .exe file in this virtual drive." This allows you to run the Android SDK installer. You still need to install the components through the SDK. The UI for the Android SDK unfortunately did not work in Wine, but it is possible to install the needed requirements using the command line options.
As for performance, I found it to be alright. Some people may not find it completely acceptable, but I really didn't mind. When running with the "Game" window maximized, the frame rate did drop a little low, but it still was bearable. The Laptop I was using is a few years old, so with faster hardware this might not be an issue.
What Did Not Work
I was pretty impressed by how well Unity ran under Wine. It definitely is good enough to do an install and start learning Unity. Unfortunately, there is a long list of things that don't work, and so I don't think this will be useful for anything serious.
The first thing I noticed being broken was the ability to create new projects. Trying to browse to a new folder and create a project kept failing. Luckily, it is easy to work around. Pre-create your directory, then use "Open Project" instead of "Create New Project," and you will be able to get a new project started.
Another early problem involved resizing the window. The editor wasn't expanding to fill the new size of the window. To fix this it was necessary to exit and reenter the editor. So long as you do this, make it fill the screen, and then never resize again, it really isn't an issue.
A variety of error messages appeared regularly in the console. Things like, "Unable to join player connection multicast group." While the errors didn't seem to do any harm, they would sometimes get in the way of seeing the real console error and log messages.
I noticed that even after exiting Unity, several processes consistently remain. While this doesn't do much harm, it does waste RAM.
Importing from Blender didn't work. I was able to install the 32 bit version of Blender into the Wine prefix, but Unity still claimed that it was not installed and so it couldn't import .blend files. FBX files worked fine, so moving forward I exported from Blender to FBX and was able to import my models.
On occasion when I attempted to build for Android or enter Android mode, all my textures would get corrupted and need to be reimported. Other times it would work fine.
I did attempt to "Build & Run" onto a USB connected Android device, but Unity complained that it could not find the device. It might be possible to fix this. I didn't try.
The asset store window did not work. The window stayed completely empty. Right clicking shows "localized string not found." Limited use of the asset store can still be acheived by using the search in the project window. Assets found by searching can be installed without issue.
The most frustrating problems involved the mouse not behaving properly. Sometimes right clicks would stop working. Other times the mouse cursor would disappear when entering certain sections of the window. Even restarting Unity wouldn't always clear up the issues.
While overall Unity was usable and performed alright through Wine, these problems eventually led to me giving up on considering Wine a viable option for running Unity for regular production development work.
I enjoyed getting to know Unity in Wine, but the various problems were getting in my way, and it was becoming clear that running in Wine was not a good choice for anything serious. I was hesitant to go with Windows, but since I really wanted this to get this working, I bought a license for Windows 8.1. My plan was to install it in VirtualBox on Linux.
Installing Windows into VirtualBox was pleasantly uneventful. I did run into problems with the 3D acceleration corrupting the display, but upgrading to the latest version of VirtualBox cleared that up. I installed the VirtualBox Guest Additions, as well as the latest Extension Pack. Once Windows was installed, getting Unity3D and all of its dependencies on there was very easy. The steps for that are exactly the same as they would be on a native Windows install.
Putting performance aside for a moment, most things worked well under VirtualBox. The biggest problem I encountered was that mouselook didn't work in games. The mouse cursor could hover over things in the UI and effect them without issue. In the editor, holding down the right mouse button and moving the mouse properly rotated things. When the game was playing though, the axis movement was always 0 when the mouse moved.
While most things functioned properly in VirtualBox, the performance unfortunately was not up to par. I had 2D and 3D hardware acceleration enabled in the VM. I spent some time trying to tune the performance of Windows, and I played around a fair amount with the settings for the VM, but in the end I just could not get it fast enough.
The FPS provided in the stats often showed numbers between 40 and 60, but it was clear when playing that the reported amounts were not inline with what I was experiencing. Closing the scene window and having a small game window did help, but that isn't really an option. I did try experimenting with the project quality levels, and while dropping that definitely helped, it didn't help nearly enough. The feel was always a bit sluggish.
Audio did work, but I got the feeling that it was slightly off in timing. Since the performance was already a showstopper, I never took the time to look into improving the audio quality.
I did encounter a few other problems, including a couple hangs and crashes. Luckily, those were rare, and I have since run into rare similar behavior on native Windows installs, so I can't count that against VirtualBox. At one point I placed VirtualBox into seamless mode, which allows the guest OS's windows to exist in the host's window manager, but that just resulted in Unity hanging and needing to be forcibly closed.
Compared to Wine, Unity was far more reliable in VirtualBox, but the performance was too much of an issue to move forward.
In some past usage of virtual machines for other projects I found VMWare to be faster than VirtualBox. I was curious if the performance would be any better here, so I grabbed the trial of VMWare Workstation. This would definitely raise the cost of running Unity on Linux, but I thought it could be worthwhile if it was usable. VMWare Player Pro may have worked as well, but I decided to use their WorkStation Product for testing, since some of its extra features seemed potentially helpful.
VMWare did not like my laptop's 3D, and so when starting the VM it told me that "No 3D support is available from this host." I was able to override this by modifying the host's vmx file and adding this line:
mks.gl.allowBlacklistedDrivers = "TRUE"
This was unfortunate, since my non-officially supported graphics may taint the results here. When in 3D mode there were occasional minor drawing glitches, but nothing too problematic.
VMWare was even better at installing Windows than VirtualBox. It automated many of the steps and got me up and running quickly. I was able to install Unity, Gimp, Blender, and the Android SDK without issue.
While trying out VirtualBox I had been accessing my Unity project directories right out of my Linux home directory. For some reason in VMWare, the file sharing didn't work. It kept having issues finding files. To move forward, I just copied a few project directories over.
Performance was definitely superior to Virtualbox, but still not great. Unlike in VirtualBox, the reported FPS was believable. Unfortunately, the performance was very erratic. I loaded a big 3D terrain and found the frame rate wildly swinging between 20 and 0 FPS, even if nothing else was going on. I tried a simple 2D game, and it swung wildly between 60 and 30 FPS. The feel was sluggish, but bearable. I also tried a very simple pong-like 2D game where the only light in the scene was attached to the ball. Performance swung erratically between 70 and 0 FPS, and the game was unplayable.
VMWare suffered from the same issues with mouselook as VirtualBox.
Like VirtualBox, I felt like the audio was slightly off. I could be wrong, but it seemed like there was a slight latency between when the sounds should have been playing and when they actually did. I did not look further into this or try to fix it.
The VMWare experience was better than VirtualBox, but still not good enough to do serious work with. If I had a more modern system with faster (and maybe official supported) graphics, then the results might have been different, but as it stood, I couldn't use it.
Windows 8.1 Accessed Over a LAN
I didn't want to give up so I decided to try one more thing. I had an old desktop system that I almost never turn on these days. I normally "dock" my laptop into a KVM and just disconnect it and take it with me when I want to travel with my work. The other system on the KVM was my desktop, and I decided I would install Windows 8.1 on there and try to access it remotely over the LAN. This definitely went against my original plans, but by this point I had been learning Unity for a few weeks, and I was hooked and willing to bend the rules a little.
Most of my pragmatic reasons for wanting to run under Linux were for productivity. I do a lot of non game related development under Linux, and I know my tools and environment really well, so switching seemed like something that would slow me down a lot. By this point I was starting to feel like with Unity I could be a lot more productive in game development work than without it, and so putting aside my preferences and figuring out the least painful way of moving forward was making sense.
In order to make the Windows environment more unix-like, I installed Cygwin. Cygwin provided a shell, utilities, development tools, and a decent terminal emulator application. I configured Unity to launch Emacs inside of a terminal as my editor, and things started to feel reasonable for development.
I still wanted to be able to take my work with me on the laptop, so I put my projects into Git repositories and used Git for version control and as a way of getting updates between Windows and Linux. If you do go this route, don't forget to change your "Editor Settings" for the project to enable "Visible Meta Files" as the version control mode, and "Forced Text" asset serialization, so that the files work nicely inside of Git. (From the menu, Edit->Project_Settings->Editor)
As for accessing it over the LAN, going over a local gigabit network with VNC worked pretty well. I tried a few different versions of the VNC server and settled on TightVNC with the DFMirage display driver.
As for a VNC client, I'm still a little undecided. I tried a couple of the modern clients, and I really liked Remmina the best. Unfortunately, despite it having a far superior UI, it had issues that didn't exist with the more classic clients. For example, when running a maximized game window on a 1080p display, the image suffered from tearing. Also, the clipboard worked sporadically, if at all. I eventually settled on the TurboVNC client, which despite its old fashioned bulky UI had far better performance and flawless clipboard behavior.
If you do use VNC over a local network, you probably should disable all encryption (if that is acceptable) to help performance. While performance isn't as good in VNC as on the desktop, it is bearable for general editing. With my setup I get better performance at full screen than any of the emulated approaches, but with a maximized game window at 1080p the performance could be noticeable. In VNC you can drop the quality to help performance, and it does make a difference, though you then end up with a lower quality image as a trade off.
Like VirtualBox and VMWare, the mouselook issue exists when running in VNC. I feel like there should be a better solution for this, but for the time being I just plugged in a dual-analog USB controller, and I use that when I need mouselook.
My current setup uses VNC running full screen in a virtual desktop. If I need to run a game maximized for a while, then I switch to the desktop on the KVM to get full performance. I have been using this setup for a few weeks now, and it has worked pretty well.
Here is a quick summary of the results:
Wine worked well enough to start learning Unity, but there were many issues and things that didn't behave properly.
VirtualBox behaved well, but performance was too low.
VMWare Workstation had slightly better performance, but the performance was erratic and felt kind of sluggish.
I suspect that for people with faster hardware, VirtualBox and VMWare may actually be workable options, though not without some caveats.
On my older hardware, Wine was the best way of running Unity on Linux. Running under Wine introduces a long list of issues, but performance isn't bad, and many of the issues are possible to work around or avoid. Wine is fine for occasional use, but the numerous issues and some of the more severe problems make it a poor choice for serious work.
While trying these things out I gained some experience with Unity, and I didn't want to admit defeat. I decided to change the rules and I settled on running Unity on a native Windows installation accessed primarily over VNC, and directly with a KVM when more performance is needed (such as when running a game window full screen.) When not at home I have been using Unity on Linux through Wine. Git is used to keep both systems in sync with the same projects.
I have had a positive experience learning Unity, but I'm not yet very attached. With the VNC/KVM/Wine setup I have been managing to get things done, but native Linux support would be extremely helpful. I'm definitely going to keep my eyes on the competition and see if CryEngine or Unreal manage to add official Linux support. The Unreal Engine ships with source, and some people already have worked on native Linux support. It isn't ready for the prime time, and even if it was, it isn't yet a direct competitor to Unity. From my perspective this is mostly because Unity better supports the platforms I am interested in developing for.
For now, I have a setup that I am able to use to get work done, but it isn't ideal, especially when I am not at home and using Wine. While getting a faster laptop may make the virtualized options viable, it is not a guarantee, and so I am hesitant to upgrade just for that. In the meantime, this setup seems to be good enough to move forward with, but I'll definitely be hoping for better options in the future.