1. Tabletop Simulator
  2. News
  3. Tabletop Simulator v14.0 Public Beta — Engine Upgrade (Unity 6 LTS)

Tabletop Simulator v14.0 Public Beta — Engine Upgrade (Unity 6 LTS)

[h2]Tabletop Simulator v14.0 Public Beta — Engine Upgrade (Unity 6 LTS)[/h2][p]A quick note from the team: We know it’s been a long time since the last big update. Behind the scenes we’ve been doing a lot of groundwork on the engine and tools, and this patch is the first step to a renewed focus on regular updates and improvements to TTS. Thank you for your patience and for sticking with us ❤️[/p][p][/p][h2]Public Beta (Steam)[/h2][p]This is a huge engine and platform update, so we’re rolling it out as a public beta first to shake out any remaining issues before it goes live for everyone.[/p][h3]How to opt into the public beta on Steam[/h3]
  1. [p]Open your Steam Library.[/p]
  2. [p]Right-click Tabletop SimulatorProperties…[/p]
  3. [p]Go to the Betas tab.[/p]
  4. [p]Select the public beta branch for the Unity 6 update from the dropdown.[/p]
  5. [p]Close the window and let Steam download the update.[/p]
[p]You can switch back to the live version at any time by setting the beta dropdown back to “None”.[/p][p][/p][h3]Give feedback[/h3][p]Please report bugs and suggestions on our Nolt board 👉 https://tabletopsimulator.nolt.io/[/p][p]Include your OS, GPU, and logs (see Troubleshooting & Logs below) when reporting issues. It helps a lot.[/p][p]Please use the "Public Beta" tag for feedback to do with this patch.[/p][hr][/hr][p][/p][p]Windows: 64-bit Windows 10 21H1+ (Windows 11 supported) macOS: 11 Big Sur+ Linux: Ubuntu 22.04/24.04 (64-bit)[/p][p][/p][h2]Summary[/h2]
  • [p]Engine upgrade to Unity 6 LTS: smoother performance, better stability, and faster loading in many cases.[/p]
  • [p]Native Apple Silicon support on macOS with a universal app that runs on both Apple Silicon and Intel, using Metal by default on Apple Silicon.[/p]
  • [p]New Vulkan graphics API option on Windows & Linux (experimental) for potentially better performance in heavy scenes.[/p]
  • [p]New minimum system requirements:[/p]
    • [p]Windows: 64-bit Windows 10 21H1+ (Windows 11 supported)[/p]
    • [p]macOS: 11 Big Sur+[/p]
    • [p]Linux: Ubuntu 22.04/24.04 (64-bit)[/p]
  • [p]Win 32-bit builds are no longer supported.[/p]
  • [p]Game & plugins updated to latest versions and now code-signed for fewer antivirus/security issues.[/p]
  • [p]Big quality-of-life upgrades: camera movement, keybind behavior, music player overhaul, notepad improvements, grid tools, erase-all controls, Cloud Manager upgrades, new console options.[/p]
  • [p]New Lua tools for drafting, hand selection, hand “stash” areas, rewind control, and more scripting power.[/p]
[p]Gameplay, rules, and your saves are unchanged. This is primarily an engine and quality-of-life update.[/p]
[hr][/hr][p][/p][h2]Engine, Platform & Security[/h2]
  • [p]Updated TTS to Unity 6 LTS.[/p]
  • [p]Updated all plugins to their latest compatible versions.[/p]
  • [p]The game executable is now code signed, improving trust with Windows and reducing false positives with antivirus.[/p]
[p][/p][h3]New OS / Platform Requirements[/h3]
  • [p]Windows[/p]
    • [p]64-bit only.[/p]
    • [p]Minimum: Windows 10 version 21H1 (build 19043) or newer.[/p]
    • [p]Windows 11 fully supported.[/p]
  • [p]macOS[/p]
    • [p]Minimum: macOS 11 Big Sur or newer.[/p]
    • [p]Now ships as a universal app that runs on both Intel and Apple Silicon (M-series).[/p]
    • [p]On Apple Silicon, TTS now runs natively (no Rosetta required).[/p]
  • [p]Linux[/p]
    • [p]Supported: Ubuntu 22.04 / 24.04, 64-bit.[/p]
    • [p]Wayland and X11 supported (behavior may vary by distro/driver).[/p]
[p][/p]
[p]If you’re on an older OS than the above, TTS may not launch after this update. Please update your system.[/p]
[p][/p][h3]Graphics APIs[/h3]
  • [p]macOS (Apple Silicon):[/p]
    • [p]Metal is now the default graphics API when running on Apple Silicon.[/p]
    • [p]If you’re not on Apple Silicon, the game uses OpenGLCore by default.[/p]
  • [p]Windows & Linux:[/p]
    • [p]Added Vulkan as a new experimental graphics API.[/p]
    • [p]In very demanding scenes, Vulkan can offer better performance on supported hardware.[/p]
    • [p]Because Vulkan is still experimental, if you hit visual glitches or stability problems, switch back to the default renderer.[/p]
[p][/p][h3]Security[/h3]
  • [p]Includes the latest Unity 6 security fixes, addressing known file-loading vulnerabilities in older engine versions.[/p]
  • [p]Combined with code signing, this should reduce security prompts and exploit risk.[/p]
[hr][/hr][p][/p][h2]General & Performance[/h2]
  • [p]Greatly increased snappiness of WASD camera movement with less “floaty” gravity.[/p]
  • [p]Keybinds now use physical key location instead of character, so bindings line up across different keyboard layouts.[/p]
  • [p]Voice chat improvements:[/p]
    • [p]Disabling voice chat in the configuration menu properly stops all voice chat processes.[/p]
    • [p]This can fix audio issues with some Bluetooth headsets.[/p]
    • [p]If you are the host and disable voice chat, it disables voice chat for all players.[/p]
    • [p]Added an error message when trying to use voice chat when it isn’t connected.[/p]
  • [p]UI theme can now automatically follow your system theme if none is manually selected.[/p]
  • [p]Greatly optimized network serialization on CPU via more efficient bitpacking.[/p]
  • [p]Image loading improvements:[/p]
    • [p]Loading new (uncached) images is now more performant.[/p]
    • [p]Improved image quality in many cases.[/p]
    • [p]Reduced likelihood of crashes when large or many new images are being loaded.[/p]
[hr][/hr][p][/p][h2]VR (Beta Note)[/h2]
  • [p]In the current public beta, post-processing is not active in VR.
    This means effects like LUT-based color grading and other post-processing visuals do not work in VR yet. We’re planning to restore this in a future update.[/p]
[hr][/hr][p][/p][h2]Music Player[/h2]
  • [p]Added search filter for playlists. (Nolt #2143)[/p]
  • [p]Added Clear Playlist button.[/p]
  • [p]Added Export Playlist and Import Playlist:[/p]
    • [p]Save your current playlist to a file.[/p]
    • [p]Add a playlist file into your current playlist.[/p]
  • [p]Added Upload Music Folder:[/p]
    • [p]Select a folder and upload all songs in it at once, with naming.[/p]
  • [p]TTS will now suggest a name for a song when you provide a URL or file.[/p]
  • [p]Fix: Music player no longer breaks when loading a new mod. (Nolt #2038)[/p]
  • [p]Fix: Music events no longer break when a song ends with no playlist active.[/p]
  • [p]Fix: Music player no longer resets when loading a save file with no music saved on it.[/p]
[hr][/hr][p][/p][h2]Notepad (On-Screen Notes)[/h2]
  • [p]On-screen notes region is now resizable.[/p]
  • [p]New notepad settings for:[/p]
    • [p]Font[/p]
    • [p]Font size[/p]
    • [p]Text justification[/p]
  • [p]New console commands:[/p]
    • [p][c]ui_notepad_edit[/c][/p]
    • [p][c]ui_notepad_left_align[/c][/p]
    • [p][c]ui_notepad_locked[/c][/p]
    • [p][c]ui_notepad_fixed_width_font[/c][/p]
    • [p][c]ui_notepad_font_size[/c][/p]
    • [p][c]ui_notepad_size[/c][/p]
    • [p][c]ui_notepad_text[/c][/p]
[hr][/hr][p][/p][h2]Grid[/h2]
  • [p]While Grid settings are open, the grid now renders on top of everything, making adjustments easier.[/p]
    • [p]Controlled via [c]ui_grid_highlight_when_editting[/c] (console / Misc setting).[/p]
  • [p]New anchor & gizmo mode:[/p]
    • [p]Click the Gizmo button in the Grid window.[/p]
    • [p]Select a component to center the grid on it.[/p]
    • [p]Ctrl+click a second component to size the grid appropriately (using your snap settings).
      (Nolt #1871)[/p]
[hr][/hr][p][/p][h2]Erase All[/h2]
  • [p]Applies to drawn lines, text, and decals.[/p]
  • [p]Non-promoted players:[/p]
    • [p]“Erase all” now only erases their own drawings/decals. (Nolt #1841)[/p]
  • [p]Promoted players:[/p]
    • [p]Can erase everything.[/p]
    • [p]Can erase just their own.[/p]
    • [p]Can erase all content from a specific player.[/p]
[hr][/hr][p][/p][h2]Cloud Manager[/h2]
  • [p]Cloud folder dropdown now has a “Select Folder” button that opens the Cloud Manager folder browser. (Nolt #711)[/p]
  • [p]Starred folders:[/p]
    • [p]Folders can now be Starred (button next to folder name).[/p]
    • [p]Starred folders show first in the folder browser dropdown. (Nolt #711)[/p]
  • [p]Cloud search now restricts results to the current folder. (Nolt #1839)[/p]
  • [p]Fix: Resolved several file browser issues and cleaned up its underlying code to improve stability.[/p]
[hr][/hr][p][/p][h2]Misc Features[/h2]
  • [p]Custom Figurine:[/p]
    • [p]Added toggle to use a minimal collider on the card part. (Nolt #1929)[/p]
    • [p]Added option to mirror the back texture. (Nolt #2107)[/p]
  • [p]Added Reset Scale to an object’s scale context menu. (Nolt #2078)[/p]
  • [p]Hotseat player names are now remembered between sessions. (Nolt #2070)[/p]
  • [p]Added [c]vr_floor[/c] command / VR setting:[/p]
    • [p]Lets you turn off the floor independently of [c]fog[/c] / “Floor Of Mist”. (Nolt #2173)[/p]
  • [p]Server browser improvements:[/p]
    • [p]Player names now show in the server browser.[/p]
    • [p]Your name is hidden if you are offline, invisible, or you untick the “Show Name In Server Browser” option.[/p]
[p](The previously mentioned standalone external server browser tool has been removed and is no longer part of this update.)[/p][hr][/hr][p][/p][h2]Console Commands[/h2][p]New/updated commands:[/p]
  • [p][c]component_hotkey_state_change[/c][/p]
    • [p]When enabled, press number keys while hovering an object to change its State.[/p]
    • [p]Appears in Misc Settings.[/p]
  • [p][c]ui_notebook[/c][/p]
    • [p]Shows the Notebook window.[/p]
  • [p][c]text_tool_default_font_size[/c][/p]
    • [p]Sets default size for the Text tool. (Nolt #2000)[/p]
  • [p][c]autorun_lua[/c][/p]
    • [p]Controls whether Lua automatically runs when updated.[/p]
  • [p][c]camera_reset_on_color_change[/c][/p]
    • [p]Controls whether the camera automatically moves to your seat when you change color. (Nolt #256)[/p]
  • [p][c]show_name_in_server_browser[/c][/p]
    • [p]Controls whether your name is listed in the server browser for public servers you join.[/p]
[p]Fixes:[/p]
  • [p]Fixed [c]help[/c] command not working on commands that have no arguments.[/p]
  • [p]Removed old console commands related to global chat. (Nolt #2117)[/p]
[hr][/hr][p][/p][h2]Misc Fixes[/h2]
  • [p]You can now obtain the “Be Social” achievement using in-game chat. (Nolt #1895)[/p]
  • [p]Fixed game crashing when trying to load a CMYK JPG.[/p]
  • [p]Fixed line tool not converting to cm in component mode. (Nolt #1934)[/p]
  • [p]Fixed “Showing Hand” button displaying incorrect color after seat swap.[/p]
  • [p]Fixed on-screen hand blocking in-game UI. (Nolt #1757)[/p]
  • [p]Fixed hotseat turn not being set to correct player on load. (Nolt #1960)[/p]
  • [p]Fixed hotseat players being unable to drop cards in searched deck. (Nolt #1959)[/p]
  • [p]Fixed hotseat turn incorrectly resetting when loading a Classic game.[/p]
  • [p]When starting a hotseat game, the game now only picks larger tables, so all player colors are immediately selectable.[/p]
  • [p]Fixed context menu not clamping to screen. (Nolt #1966)[/p]
  • [p]Fixed context menu appearing in the wrong position when right-clicking a card in hand. (Nolt #2051)[/p]
  • [p]Fixed unintuitive Text Tool placement behavior.[/p]
  • [p]Fixed appearance of custom card aspect ratios when searching containers. (Nolt #2021)[/p]
  • [p]Fixed cards merging incorrectly with a deck when the deck is on a snap point. (Nolt #2063)[/p]
  • [p]Fixed left edge of search dialog not having a collider. (Nolt #2077)[/p]
  • [p]Fixed Japanese language name in language select. (Nolt #2116)[/p]
  • [p]Fixed shake detector triggering when the user spams Tap.[/p]
  • [p]Fixed Random Domino/Card/Mahjong Tile not generating every possible object. (Nolt #2160, #2154)[/p]
  • [p]Fixed rewind/forward ([c]rwd/fwd[/c]) not working correctly. (Nolt #2161)[/p]
  • [p]Fixed game breaking on first launch but working on subsequent launches.[/p]
  • [p]Fixed cards getting cut off onscreen when scaling very large hands.[/p]
  • [p]Fixed deleting a folder in Cloud Manager not deleting all contained files.[/p]
  • [p]Fixed issues when uploading PDF files via “Upload All” in the Cloud Manager.[/p]
  • [p]Fixed a bug where objects with multiple assets (primary/secondary AssetBundles) could think they finished loading too early, breaking on-screen hands, highlighting, and Lua load completion.[/p]
  • [p]Fixed dice behavior when picking up and dropping instantly, so dice now roll correctly in that scenario.[/p]
  • [p]Fixed VR floor setting being inverted for the [c]vr_floor[/c] option.[/p]
[hr][/hr][p][/p][h2]Lua[/h2][p]New Lua functions and features for creators:[/p][h3]Object State Changes[/h3]
  • [p]Added [c]tryObjectStateChange(object, new_state_index, player_label)[/c] and [c]object.tryStateChange(new_state_index, player_label)[/c].
    (Nolt #1822)[/p]
[p]These are called whenever a user uses the state change action on an object — even if the object doesn’t actually have extra states. That means:[/p]
  • [p]You can hook into the “state change” action to drive similar custom behavior in your own scripts.[/p]
  • [p]You should not use this as a generic “do anything” trigger; keep it semantically tied to state-change-like behavior so your mods remain intuitive.[/p]
[h3][c]Wait.collect[/c][/h3]
  • [p]Added
    [c]Wait.collect(table expected_ids, on_finished, on_add = nil, on_error = nil) -> {table expected, table results, add(id, ...), reset()}[/c].[/p]
[p][c]Wait.collect[/c] takes a list of expected ids and returns a [c]collect_table[/c]:[/p]
  • [p]When the task for a given id is complete, call:
    [c]collect_table:add(id, ...)[/c].[/p]
    • [p]The first time this happens for a given id:[/p]
      • [p][c]collect_table.results\[id][/c] is set to the [c]...[/c] you passed in.[/p]
      • [p]If you provided [c]on_add[/c] to [c]Wait.collect[/c], it is called as:
        [c]on_add(id, ...)[/c].[/p]
  • [p]Error handling:[/p]
    • [p]If you call [c]add[/c] more than once for the same id and you provided [c]on_error[/c], it is called as:
      [c]on_error(Wait.COLLECT_DUPLICATE, id, ...)[/c].[/p]
    • [p]If you call [c]add[/c] with an id that was not expected and you provided [c]on_error[/c], it is called as:
      [c]on_error(Wait.COLLECT_UNKNOWN, id, ...)[/c].[/p]
[p]When all expected ids have been added:[/p]
  • [p][c]on_finished(results)[/c] is called with the final [c]results[/c] table.[/p]
[p]You can call:[/p]
  • [p][c]collect_table:reset()[/c] to zero out call counts and clear results so you can reuse the same collector.[/p]
[h3]Rewind State[/h3][p]Rewind states are stored periodically. If a store happens in the middle of a complex scripted change, you can end up with bad intermediate states. These helpers let you control when rewinds are saved.
(Nolt #617)[/p]
  • [p][c]storeRewindState(closure andThen, block_further_stores)[/c][/p]
    • [p]Attempts to store a rewind state if there are unsaved changes, then calls:
      [c]andThen(success, didSave)[/c].[/p]
    • [p][c]success[/c]:[/p]
      • [p][c]true[/c] → the call completed successfully.[/p]
      • [p][c]false[/c] → a rewind state could not be stored. You should always check this before continuing.[/p]
    • [p][c]didSave[/c]:[/p]
      • [p][c]true[/c] → a new rewind state was actually written.[/p]
      • [p][c]false[/c] → call succeeded but there was nothing new to save.[/p]
    • [p]If [c]block_further_stores[/c] is [c]true[/c] and [c]success[/c] is [c]true[/c], then no additional rewind states will be recorded until:[/p]
      • [p]You call [c]storeRewindState[/c] again, or[/p]
      • [p]You call [c]allowRewindStore()[/c], or[/p]
      • [p]60 seconds have passed.[/p]
    [p]If [c]success == false[/c], the safest simple strategy is to retry [c]storeRewindState[/c] before proceeding with the critical part of your script.[/p]
  • [p][c]allowRewindStore()[/c][/p]
    • [p]Clears the block on storing rewind states.[/p]
    • [p]You should call this any time you previously used [c]storeRewindState[/c] with [c]block_further_stores = true[/c], once your “don’t interrupt me” work has finished.[/p]
[h3]Hand Zone Stash[/h3][p]Each player’s primary hand zone now has a “stash”:[/p]
  • [p][c]player.getHandStash()[/c] → returns the stash object if it exists.[/p]
  • [p][c]player.drawHandStash()[/c] → draws all cards from stash into hand.[/p]
  • [p][c]player.setHandStashLocation(v3 position, int rotation)[/c] → set stash position & rotation.[/p]
  • [p][c]card.moveToHandStash()[/c] → moves a card in hand into its stash.[/p]
[p]Use cases: drafting mechanics, temporary hidden piles, etc.[/p][h3]Hand Select Mode[/h3][p]Automate drafting & hand selection:[/p]
  • [p][c]chooseInHand(label, minCount, maxCount, prompt, players) -> affectedPlayers[/c][/p]
  • [p][c]chooseInHandOrCancel(label, minCount, maxCount, prompt, players) -> affectedPlayers[/c][/p]
  • [p][c]clearChooseInHand(players) -> affectedPlayers[/c][/p]
  • [p][c]currentChooseInHand(player) -> label[/c][/p]
  • [p][c]onPlayerHandChoice(player_color, label, objects)[/c]
    → Callback triggered when a player confirms their selection.[/p]
[h3]Lua Fixes[/h3]
  • [p]Fixed [c]JSON.encode[/c] not working correctly with Unicode. (Nolt #1263)[/p]
[hr][/hr][p][/p][h2]Troubleshooting & Logs[/h2][p]If you hit problems, attaching your Player.log helps us a lot:[/p]
  • [p]Windows:
    [c]C:\\Users\\\\AppData\\LocalLow\\Berserk Games\\Tabletop Simulator\\Player.log[/c][/p]
  • [p]macOS:
    [c]~/Library/Logs/Berserk Games/Tabletop Simulator/Player.log[/c][/p]
  • [p]Linux:
    [c]~/.config/unity3d/Berserk Games/Tabletop Simulator/Player.log[/c][/p]
[p]Enable logging with [c]/log[/c] in chat or the [c]-log[/c] launch option.[/p][p]Your Mods and other user data live here (good for backups or clean caches):[/p]
  • [p]Windows: [c]%USERPROFILE%\\Documents\\My Games\\Tabletop Simulator\\Mods[/c][/p]
  • [p]macOS: [c]~/Library/Tabletop Simulator/[/c][/p]
  • [p]Linux: [c]~/.local/share/Tabletop Simulator/[/c][/p]
[hr][/hr][p][/p][h2]Thank you ❤️[/h2][p]Engine upgrades are big and tie in to every platform and a ton of unique hardware configurations.
If you run into issues, please include with your report:[/p]
  • [p]OS version[/p]
  • [p]GPU + driver version[/p]
  • [p]Player.log[/p]
  • [p]Workshop link (if it’s mod-related)[/p]
[p]And again, thank you for your patience during the long gap of silence. This engine work sets us up for faster, more frequent updates going forward — and your feedback in the public beta will help us get there.[/p]