1) The most standard way
/usr/local/bin (binaries) /usr/local/share/<gamename> (data files) /usr/local/etc/<gamename> (global config files (optional) /home/<username>/.<gamename> (local config files)This is sometimes a pain because it spams the filesystem with files and if you try to move it, often the paths are hardcoded at compile time so they will look in the wrong locations.
2) The common way for ported software
/opt/<gamename> (everything dumped in here) /usr/local/bin (simple script added here to set paths and run game)I personally do not mind this too much. It keeps the proprietary software away from the rest of the operating system. Typically used by software such as acrobat reader, skype etc...
This solution is also good for developers who use non-native (to UNIX) languages such as Java, .NET etc...
I see a lot of indie games written in Mono which distribute an entire implementation of the mono runtime with the game. I much prefer this to having to install mono on the system. I would also quite like to see Java developers distribute their games with an entire JRE. For an extra ~10 megs, it saves some pointless headaches for the user. Almost all software on Windows provides its own msvcrt.dll (C runtime) so the duplication is massive... but who cares right? At least the developer knows that the correct runtime will be used when the user double clicks the game haha.
3) The portable binaries way (kinda a hybrid)
[...]/bin [...]/share/<gamename> [...]/etc/<gamename> [...]/lib /home/<username>/.<gamename>When the application runs, it works out its own path and works out paths to external files at runtime. This allows it to be moved to wherever, /opt, /usr, /usr/local etc... without breaking hardcoded paths.
The hardest thing about this is getting a program to work out where it "lives". I use the following code...
(have a look at void Application::setupPaths())
It may look quite crazy but this is not an easy task to solve in a portable manner (things like procfs only really exist on Linux so I needed something that worked on the BSDs too). Feel free to ask any questions about it.
I also use this method for software on Windows. It works quite nicely and gives it a bit of a UNIXy twist ;)