{"id":16151473,"url":"https://github.com/0xf4b1/unify","last_synced_at":"2025-09-14T20:55:17.746Z","repository":{"id":165275354,"uuid":"640624536","full_name":"0xf4b1/unify","owner":"0xf4b1","description":"Automatically port Unity games for macOS or Windows to Linux","archived":false,"fork":false,"pushed_at":"2025-08-23T21:20:59.000Z","size":33,"stargazers_count":44,"open_issues_count":5,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-24T08:20:03.785Z","etag":null,"topics":["epic","game","games","legendary","linux","native","port","unity"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/0xf4b1.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-05-14T17:47:01.000Z","updated_at":"2025-08-23T22:18:25.000Z","dependencies_parsed_at":"2024-03-03T14:23:39.700Z","dependency_job_id":"8a734aad-a27a-4be5-b8ea-8609cec1bdcd","html_url":"https://github.com/0xf4b1/unify","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/0xf4b1/unify","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xf4b1%2Funify","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xf4b1%2Funify/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xf4b1%2Funify/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xf4b1%2Funify/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/0xf4b1","download_url":"https://codeload.github.com/0xf4b1/unify/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/0xf4b1%2Funify/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":275167315,"owners_count":25416988,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-14T02:00:10.474Z","response_time":75,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["epic","game","games","legendary","linux","native","port","unity"],"created_at":"2024-10-10T00:56:59.342Z","updated_at":"2025-09-14T20:55:17.727Z","avatar_url":"https://github.com/0xf4b1.png","language":"Python","readme":"# unify\nAutomatically port Unity games for macOS or Windows to Linux\n\nGames based on the Unity engine can be deployed and run on multiple platforms, including Linux.\nThe platform-specific engine files are mostly generic, so we take the official game files and run them with Unity's Linux binaries.\nThis way we get a native Linux version of the game without the need of compatibility layers, such as Wine.\n\nThis method can work as long as the game was exported with OpenGL or Vulkan renderer enabled.\nWindows versions usually default to DirectX and only rarely have OpenGL enabled, but macOS versions often have OpenGL enabled and chances are high to get them to run.\n\nMany Unity titles are officially available for Linux, but there are also some cases where this method can create a missing Linux port.\nLots of Unity Games that were availbale for free on Epic Games have been tested.\nSince Epic Games does not support Linux game versions, you can also benefit from this method to play your Unity games that you may have collected on that platform.\n\nTake the [Compatibility Status](https://github.com/0xf4b1/unify#compatibility-status) list as reference if you are only interested in games that are known to be playable.\n\n## Install Unity Games\n\nTo determine which games are based on Unity, you can check out [steamdb](https://steamdb.info/tech/Engine/Unity/).\n\n### Epic Games\n\nYou can download games with [Legendary](https://github.com/derrod/legendary), the free and open-source Epic Games Launcher alternative.\n\nList all your titles for macOS or Windows\n\n```\nlegendary list --platform \u003cMac|Windows\u003e\n```\n\nInstall the macOS or Windows version of game with\n\n```\nlegendary install --platform \u003cMac|Windows\u003e \u003cApp name\u003e\n```\n\n### Steam\n\nYou can download Steam games for a specific platform with steamcmd. To download macOS versions, use the following command:\n\n```\nsteamcmd +@sSteamCmdForcePlatformType macos\n```\n\nInside steamcmd run the following:\n\n```\nlogin \u003caccount_name\u003e\napp_update \u003capp_id\u003e\n```\n\n## Porting\n\nInstall requirements via pip:\n\n```\npip install -r requirements.txt\n```\n\nCheck available renderers of the game by using the script:\n\n```\n./renderers.py \u003cgame dir\u003e\n```\n\nIf the script outputs OpenGL Core or Vulkan as detected Graphics Apis, you are lucky and can continue!\nOtherwise you should stop here because the game does not contain shaders that work with Unity on Linux.\nIf you still want to proceed, read through the [Research section](https://github.com/0xf4b1/unify#research) to see possible experimental ways to get the needed shaders or let me know if you have an idea!\n\nIf the game has a `_Data` directory prefixed with the game title (e.g. `The Last Campfire_Data`), you should rename it to just `Data`.\nThen run the script with the path of the Unity game as argument\n\n```\n./unify.sh \u003cgame dir\u003e\n```\n\nThe script probes the game for the Unity version, then downloads the relevant engine files and copies them into the game directory.\nIf it succeeded, try to start the game via the `LinuxPlayer` binary.\nIf it does not run, make sure to check the logs usually in `~/.config/unity3d/\u003cvendor\u003e/\u003ctitle\u003e`.\nIn most cases, the game misses some native libraries that need to be replaced.\nFor Steam games it might work to just copy an arbitrary `.so` file to the place of the expected `libsteam_api64.so`.\n\nThe script will cache the downloaded and extracted unity files by default in the folder `~/Unity/Hub/Editor`, but you can override this location using the `UNITY_REPO` environment variable.\n\nIf the script is not successful, the game may not be a Unity game or it may have a different structure.\nThe script in its current state is very basic and does not cover all cases.\n\n## Research\n\n### Shader object extraction\n\nDump shader objects from games and use them in other games.\n\nIf a game needs the exact same shaders that are present in another game with the desired graphics api and same unity version, there is a chance that you can reuse the whole shader objects.\n\n#### Shader object dumping\nDump shader objects from a game that supports the desired graphics api:\n```\n./shaders.py \u003cgame dir\u003e --dump --shader_dir \u003cshader_dump_dir\u003e\n```\n\n#### Shader object replacing\nReplace the shader objects in a game with previously dumped ones:\n```\n./shaders.py \u003cgame dir\u003e --replace --shader_dir \u003cshader_dump_dir\u003e\n```\n\nForce the game to use a different graphics api by patching file `globalgamemanagers`, e.g. 17 for OpenGL Core:\n```\n./renderers.py \u003cgame dir\u003e --force 17\n```\n\n### Shader compilation\n\n#### Compile missing shader objects with Unity directly\n\nBuildin-shader source code can be downloaded from the unity archive per unity release, for example [builtin_shaders-6000.2.1f1.zip](https://download.unity3d.com/download_unity/55300504c302/builtin_shaders-6000.2.1f1.zip).\nOther shader source code provided via packages should possibly be located on the filesystem after installing.\nBy creating and exporting a Unity project that contains the shader objects with the desired graphics api, they can be extracted as described above.\n\n#### Compile shader code by using UnityShaderCompiler directly\n\nThe Unity Editor comes with a dedicated UnityShaderCompiler executable. The Unity Editor opens a port and starts instances of the UnityShaderCompiler with parameters to connect to Unity's open port.\nThe communication can be intercepted by setting up a proxy, like described [here](https://discussions.unity.com/t/how-can-i-use-unityshadercompiler-exe/167609).\nAs proxy tool, [tcpprox](https://github.com/staaldraad/tcpprox) can be used for example.\nThe communication is a proprietary protocol that needs to be analyzed. One of the supported commands is `c:compileSnippet` that Unity sends followed by plain shader source code to receive compiled shaders and other information back.\n\n### Shader translation via cross-compiling\n\nFor games that come only with DirectX and no way to get the shader sources, try to translate DXBC to OpenGL or Vulkan shaders.\n\n#### Translate DirectX byte-code (DXBC) to OpenGL\n\n[HLSLcc](https://github.com/Unity-Technologies/HLSLcc): https://github.com/0xf4b1/unify/issues/11 HLSLcc is part of Unity's shader compiler, see [docs](https://docs.unity3d.com/6000.1/Documentation/Manual/shader-compilation.html).\n\nIn the hlslcc branch is an attempt to use the library to translate DXBC to OpenGL. The translation works for the test DXBC object, however it crashes on dumped DXBC objects from unity for yet unknown reasons.\n\n#### Translate DirectX byte-code (DXBC) to SPIR-V (Vulkan)\n\n- [DXVK](https://github.com/doitsujin/dxvk): DXVK reimplements the DirectX api calls to target Vulkan.\nThis means it must also handle shader translation from DirectX (DXBC) -\u003e Vulkan (SPIR-V).\nThe needed functionality for the translation should start [here](https://github.com/doitsujin/dxvk/blob/master/src/d3d11/d3d11_shader.cpp#L17C1-L59C6).\n\n- [DirectXShaderCompiler](https://github.com/microsoft/DirectXShaderCompiler): For compiling shader source code and possibly DXBC to SPIR-V using the SPIR-V CodeGen.\n\n### Unity shader object rewriting\n\nRewrite Unity shader objects with new shader code.\n\nEven if there is a way to directly translate shader byte-code to another graphics api, only replacing the shader code does not work as Unity's shader object contains much for information which means all this required information that Unity writes into the object need to be determined to be able to rewrite the whole unity shader object so that the shader can run.\n\n### More compatibility\n\n- Support for macOS (OpenGL is supported on macOS): https://github.com/0xf4b1/unify/issues/4\n- Research if Android is possible (OpenGLES is supported on Windows): https://github.com/0xf4b1/unify/issues/7\n\n### Useful tools\n- [AssetRipper](https://github.com/AssetRipper/AssetRipper)\n- [UABE](https://github.com/SeriousCache/UABE)\n- [UnityPy](https://github.com/K0lb3/UnityPy)\n\n## Compatibility Status\n\n### macOS\n\n| App title                         | App name                         | Unity version | Linux available | OpenGL enabled | Playable | Notes                                         |\n|-----------------------------------|----------------------------------|---------------|-----------------|----------------|----------|-----------------------------------------------|\n| Duskers                           | 1e9c3a9a10c6463e9c065f371b8b42bf | 5.3.4f1       | yes             | yes            | yes      |                                               |\n| Sunless Sea                       | 2420b50453144c07b3b847fff941275d | 5.5.1f1       | yes             | yes            | no       | can not find matching unity engine            |\n| Darkwood                          | 923130ebb546417b9d3115507f752d34 | 5.5.3f1       | yes             | yes            | no       | can not find matching unity engine            |\n| Night In The Woods                | cd1b8a6e5b6c47369e2a1e2cf7b7f536 | 5.6.2p4       | yes             | yes            | no       | can not find matching unity engine; 5.6.2xf1Linux can be used instead[^4]; needs fmod 1.7.8[^3] |\n| Stories Untold                    | Parsley                          | 5.6.3p2       | no              | yes            | no       | can not find matching unity engine; 5.6.3xf1Linux can be used instead[^4]; needs fmod 1.8.0[^3]; needs AVProVideo and more |\n| Inside                            | Marigold                         | 5.6.6f2       | no              | yes            | no       | can not find matching unity engine            |\n| The First Tree                    | cd98b47155654e1f9a9e84e60d0b49e4 | 2017.4.11f1   | yes             | yes            | yes      | rewired: Rewired_OSX_Lib.dll must be removed  |\n| Absolute Drift                    | 19927295d6e3467887d4e830d8c85963 | 2017.4.16f1   | yes             | yes            | no       | needs EOSSDK-Mac-Shipping[^1]; rewired: Assembly-CSharp.dll needs to be patched[^2]; starting but unplayable due to white screen |\n| Enter the Gungeon                 | Garlic                           | 2017.4.27f1   | yes             | yes            | no       | needs AkSoundEngine                           |\n| Hand of Fate 2                    | 808f0dfbf3b84c2680793724d7f207bf | 2017.4.40f1   | yes             | yes            | no       | needs InControlNative                         |\n| Tacoma                            | Flagfin                          | 2018.4.9f1    | yes             | yes            | yes      | rewired: Rewired_OSX_Lib.dll must be removed  |\n| Rise of Industry                  | cf6c487e39a14113b75d1f625fed1da7 | 2018.4.11f1   | yes             | yes            | yes      | needs EOSSDK-Mac-Shipping[^1]                 |\n| Totally Reliable Delivery Service | Hoatzin                          | 2018.4.14f1   | yes             | yes            | yes      | rewired: External.dll needs to be patched[^2] |\n| Faeria                            | Vulture                          | 2018.4.18f1   | yes             | yes            | no       | needs libepic_api.so[^1]; needs rewired       |\n| Iratus                            | 82ab0adb6e0b41bea531fcbb0c43cfc7 | 2018.4.26f1   | yes             | yes            | yes      | needs EOSSDK-Mac-Shipping[^1]                 |\n| **Crying Suns**                   | 18fafa2d70d64831ab500a9d65ba9ab8 | 2018.4.30f1   | **no**          | yes            | **yes**  | needs AkSoundEngine                           |\n| Moonlighter                       | Eagle                            | 2019.2.20f1   | yes             | yes            | no       | needs InControlNative                         |\n| Kerbal Space Program              | a1e2ce30defe4a9187ebc14fc9d2bd8b | 2019.4.18f1   | yes             | yes            | yes      | mv GameData KSP.app/Contents/Resources/       |\n| Verdun                            | 38c0129b680e4843b4807b98bad67027 | 2019.4.29f1   | yes             | yes            | yes      | needs EOSSDK-Mac-Shipping[^1]; needs to be started with `./LinuxPlayer -epicusername=\u003csomething\u003e -epicuserid=\u003csomething\u003e -AUTH_PASSWORD=\u003csomething\u003e`; rewired: Assembly-CSharp-firstpass.dll needs to be patched[^2]; no sound, needs fmod |\n| Tannenberg                        | ecfdc10170eb49b6b61cf16b3aa36d56 | 2019.4.29f1   | yes             | yes            | yes      | needs EOSSDK-Mac-Shipping[^1]; needs to be started with `./LinuxPlayer -epicusername=\u003csomething\u003e -epicuserid=\u003csomething\u003e -AUTH_PASSWORD=\u003csomething\u003e`; rewired: Assembly-CSharp-firstpass.dll needs to be patched[^2]; no sound, needs fmod |\n| The Fall                          | daac7fe46e3647cb80530411d7ec1dc5 | 2020.2.2f1    | yes             | yes            | yes      |                                               |\n| Magic The Gathering Arena         | stargazer                        | 2020.3.13f1   | no              | yes            | no       |                                               |\n| Terraforming Mars                 | 582c8940f499450d9033840efe5937a6 | 2021.3.12f1   | no              | no             | no       |                                               |\n| while True: learn()               | 4f272a49a39742b795d63e1f483a7c7d | 2021.3.14f1   | yes             | no             | no       |                                               |\n| The Long Dark                     | ed93b18355a84230938c705121c63661 | 2021.3.16f1   | yes             | yes            | no       |                                               |\n| **Stacklands**                    | (itch.io release)                | 2022.3.4f1    | **no**          | yes            | **yes**  |                                               |\n| Pokémon Trading Card Game Live    | pokemon                          | 2022.3.21f1   | no              | no             | no       |                                               |\n\n### Windows\n\n| App title                         | App name                         | Unity version | Linux available | OpenGL enabled | Playable | Notes                                         |\n|-----------------------------------|----------------------------------|---------------|-----------------|----------------|----------|-----------------------------------------------|\n| Shadowrun Returns                 | dc29cb42f32e4a17af1d68c715fa459c | 4.2.0f4       | yes             | no             | no       |                                               |\n| DARQ                              | ee96375fac2f47de978170a24398e581 | 5.3.6f1       | no              | no             | no       |                                               |\n| Yooka-Laylee                      | ce2a78bf70b646e9b9f57c46dac99184 | 5.4.3p3       | yes             | no             | no       |                                               |\n| Shadow Tactics                    | Fangtooth                        | 5.4.4f1       | yes             | no             | no       |                                               |\n| The Escapists 2                   | Fowl                             | 5.5.0p4       | yes             | no             | no       |                                               |\n| AER Memories of Old               | 26b63c46de9e4dcc856b3c6b106b6777 | 5.6.1f1       | yes             | no             | no       |                                               |\n| Dungeons 3                        | 351fe5b32e22412d8fa41f4c7395fed1 | 5.6.6f2       | yes             | no             | no       |                                               |\n| Sheltered                         | b9af0845f9d64b0d9e851d9811141f67 | 5.6.7f1       | yes             | no             | no       |                                               |\n| Halcyon 6                         | b9e848fc5e844f4285b0624789476664 | 2017.2.1f1    | yes             | no             | no       |                                               |\n| For The King                      | Discus                           | 2017.2.2p2    | yes             | no             | no       |                                               |\n| The Messenger                     | Jay                              | 2017.4.12f1   | no              | no             | no       |                                               |\n| Void Bastards                     | 595e35287b824902a2f7107139603732 | 2017.4.21f1   | no              | no             | no       |                                               |\n| Car Mechanic Simulator 2018       | 8032b75cf0914afa87c78d6914adc165 | 2017.4.24f1   | no              | no             | no       |                                               |\n| PC Building Simulator             | ab277c0995e945d2b2c50c46883627f1 | 2018.4.16f1   | no              | yes            | no       |                                               |\n| **Neon Abyss**                    | a26f991a5e6c4e9c9572fc200cbea47f | 2018.4.21f1   | **no**          | yes            | **yes**  | needs fmod 2.0.8[^3]                          |\n| Moving Out                        | 8e29583ae4b44a21883038668f7e301e | 2018.4.21f1   | no              | no             | no       |                                               |\n| Horizon Chase Turbo               | bb406082b69a47208489d3616b22b5c2 | 2018.4.27f1   | yes             | no             | no       |                                               |\n| Overcooked! 2                     | Potoo                            | 2018.4.32f1   | yes             | no             | no       |                                               |\n| **Offworld Trading Company**      | Snapper                          | 2018.4.36f1   | **no**          | yes            | **yes**  | needs libEOSSDK-Win32-Shipping.dll[^1]; needs to be started with `./Offworld -AUTH_LOGIN=\u003csomething\u003e -AUTH_PASSWORD=\u003csomething\u003e` |\n| Idle Champions                    | 40cb42e38c0b4a14a1bb133eb3291572 | 2019.3.0f6    | no              | no             | no       |                                               |\n| Tunche                            | fd51551d919847beb178985f6daf0306 | 2019.4.0f1    | no              | no             | no       |                                               |\n| Pine                              | 6d564ff21f9c45b7b782b7113ad60be8 | 2019.4.10f1   | yes             | no             | no       |                                               |\n| Recipe for Disaster               | 61e074e998044594b7bb566fe111687b | 2019.4.24f1   | no              | no             | no       |                                               |\n| Fall Guys                         | 0a2d9f6403244d12969e11da6713137b | 2019.4.37f1   | no              | no             | no       |                                               |\n| Never Alone                       | f38de9fa4c6d43eabac080942cb394a1 | 2020.3.19f1   | yes             | no             | no       |                                               |\n| Among Us                          | 963137e4c29d4c79a81323b8fab03a40 | 2020.3.22f1   | no              | no             | no       |                                               |\n| City of Gangsters                 | 002b00085aeb49b1a3f3c42e3f918f2f | 2020.3.28f1   | no              | no             | no       |                                               |\n| Gloomhaven                        | 1bcd791d54684eb29ed32ad1c0593d12 | 2020.3.33f1   | no              | no             | no       |                                               |\n| Stranded Deep                     | 02107cba432c4551a027d25d597adc49 | 2021.2.7f1    | yes             | yes            | no       | needs libBCrypt.so                            |\n| Epistory - Typing Chronicles      | 4ec72fd8cbd94aa4acc61624c68fbc4f | 2021.3.3f1    | yes             | no             | no       |                                               |\n| Shop Titans                       | 329064225aaf4df29c4658f141173905 | 2021.3.10f1   | no              | no             | no       |                                               |\n| Bloons TD 6                       | 7786b355a13b47a6b3915335117cd0b2 | 2021.3.16f1   | no              | no             | no       |                                               |\n| Against All Odds                  | ad8aff099d2a445599f9797a24e9ff93 | 2021.3.19f1   | no              | no             | no       |                                               |\n| **The Last Campfire**             | 990630                           | 2018.4.24f1   | **no**          | yes            | **yes**  | Needs an arbitrary `.so` file named as `Data/Mono/x86_64/libsteam_api64.so`. Controller input doesn't work (may require patching the Rewired library) |\n| Pokémon Trading Card Game Live    | pokemon                          | 2022.3.21f1   | no              | no             | no       |                                               |\n\n[^1]: The file `libEOSSDK-Linux-Shipping.so` can be taken from the EOS-SDK and renamed to replace the missing library.\n[^2]: The file can be patched to use `Rewired_Linux.dll` instead of `Rewired_OSX.dll` with [dnSpy](https://github.com/dnSpy/dnSpy). `Rewired_Linux.dll` can be taken from the macOS version of Totally Reliable Delivery Service.\n[^3]: FMOD Engine can be downloaded for free after registering from [here](https://www.fmod.com/download).\n[^4]: Older Unity builds for Linux can be found in the forum [here](https://forum.unity.com/threads/unity-on-linux-release-notes-and-known-issues.350256/). The `LinuxPlayer` executable can be binary patched to match the expected version.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F0xf4b1%2Funify","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F0xf4b1%2Funify","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F0xf4b1%2Funify/lists"}