Skip to content

1.21 Release Notes

Release date: TBD

NOTE

This is a preview work-in-progress release, which may have breaking changes introduced at any time. Choose it if you're in the early development stages or need a specific feature unavailable in the stable release. Note that preview releases are not published on Unity's Asset Store and have to be installed from GitHub.

Compatibility

Supported Unity versions range: 6000.0.50 - 6000.2

Only LTS releases in the range are supported. Any issues with the future Unity releases will be addressed in the next Naninovel releases. Compatible Unity versions for past releases are specified in the release notes ↗.

Upgrade Guide

When upgrading a project with Naninovel version 1.18 or older, first follow the v1.19 release upgrade guide, then continue with the following instructions:

  1. Back up the project or use a VCS ↗ to be able to roll back in case something goes wrong.
  2. In case using VS Code extension, update both the extension and VS Code itself to the latest versions.
  3. Install the new release. [doc]
  4. Run the upgrade script via Naninovel/Upgrade/v1.20 to v1.21 Unity editor menu.
  5. If you've customized the built-in save-load UI, revisit the prefab, as it now has an additional "AUTO" tab.
  6. Choice buttons are now always loaded via the Choice Button Loader specified in the choice handler configuration menu, and should be stored in the Resources/Naninovel/ChoiceButtons folder. Alternatively, you can configure a different resource provider in the loader settings.
  7. In case using custom commands, update the Execute signature to accept ExecutionContext instead of AsyncToken.
  8. In case using script playback APIs of IScriptPlayer service, use IScriptPlayer.MainTrack to get IScriptTrack, which now hosts most of the playback-related APIs. In custom commands, use ExecutionContext.Track to get the track associated with the command execution.
  9. In case using @animate or @delay commands, replace them with @async.
  10. In case using custom printers, revise the "trigger objects" setup: instead of assigning such objects to the trigger list on the printer component, attach Input Trigger component with Continue input ID to the objects that should act as triggers.
  11. In case using custom UIs with Block Input When Visible enabled and expecting Always Process inputs to not be muted, specify the inputs in the blocking UI's Allowed Inputs list instead, individually for each blocking UI that requires it.

Added

  • Added full support for concurrent scenario playback through the updated IScriptPlayer APIs and the new @async and @sync commands. [doc]
  • Transient scripts, such as those played via the PlayScript component, are now serialized with the game state, support rollback, and no longer have any limitations compared to regular script assets.
  • Added relative and wildcard endpoint syntaxes allowing to simplify navigation paths. [doc]
  • Added lazy resource policy mode. [doc]
  • Added placeholder character and background implementations. [doc]
  • Added @unless command and unless parameter for all commands, which work as the logical inverse to @if command and if parameter respectively.
  • Added default assignment operator ?= allowing to declare and assign variable only in case it's not already assigned. [doc]
  • Added [-] alias for the wait input command ([wait i])) and[>] alias for the parameterize generic command with skip parameter ([< skip!]).
  • Eased control flow exit requirements: @stop commands are no longer required to gracefully terminate control flow; also, it is now allowed for nested blocks to not have exit lines.
  • Added a dedicated "Keyboard" input mode with the associated control legend for better accessibility.
  • Added select tag. [doc]
  • Added wait input tag. [doc]
  • Printer character commands (Char Commands property of the Revealable Text Printer Panel component found on the printer prefabs) are now awaited allowing to use @wait commands to control the reveal process.
  • Added "AUTO" save-load tab; @save now uses the auto tab instead of the quick-save tab.
  • Added Auto Save On Quit option to state configuration (enabled by default); when enabled, then game will auto-save to the newly added "AUTO" tab before exiting to title or when the application is quit.
  • Added assign resource header to all the compatible asset inspectors allowing to quickly register an asset as a Naninovel resource. [demo] ↗
  • Text of Toast UI (@toast command) is now updated on locale change.
  • Added Expose Source Locale option to the localization configuration (enabled by default). When disabled, the source locale won't be available for the end-users (players). [doc]
  • Added loop parameter to @shake command allowing to enable/disable continuous shake effect instead of using count:0 and count:-1.
  • Added at parameter to @save command allowing to redirect the player position after the saved game is loaded.
  • Added script reference helper, which simplifies referencing script assets in a stable manner. [doc]
  • Added LastGameState property to state manager providing access to the last de-/serialized game state.
  • Added filtering for locale-specific fonts so that they're not included in the font selection in game settings.
  • Improved nesting diagnostic in VS Code – it know indicates the extra indentation in the affected line and clearly states the reason for the warning.
  • Added an option to refresh script resource paths. [demo] ↗
  • Improved error when missing a localization document – it now points to the specific missing resource and locale.
  • Added VirtualResourceProvider option to the resource loaders configuration allowing to add resources at runtime.
  • Added [Command.Group] attribute allowing to assign a category to script command; used by standalone editor to group the commands and associate them with icons.
  • Improved hot reload stability and fixed several edge cases which caused inconsistent behavior.
  • Hot reload is now available at runtime via reload console command and IHotReload engine service.
  • Made most built-in UIs pixel-perfect to prevent pixel alignment issues when running outside the native resolution.
  • @input command will now automatically pull predefined value in case the assigned variable already has a value.
  • @choice and @input commands no longer require adding @stop to halt script playback until the user interaction is committed. In case a playback halt is not required, use the added skip parameter.
  • Added condition context to lock parameter of @choice allowing to assign expression without wrapping the value in curly braces.
  • It's now possible to use boolean flags with parameters of the expression context.
  • Spreadsheet tool is no longer limited by 32KB CSV line size when importing the localization.
  • Added ExpressionEvaluator.Context property allowing to access the context of the evaluated expressions in the associated C# methods.
  • Added IScriptManager.Add/RemoveTransient APIs to register transient (generated at runtime) scripts, allowing them to function as actual script assets.
  • Added nowait! flag to the parametrize generic ([<]) command allowing to disable waiting for the text reveal to finish before proceeding with the playback.
  • Added Author Filter to the voice-over utility allowing to filter the generated voice lines by a specific author or exclude un-authored lines.
  • Added an option to move the "Naninovel" editor menu under the "Tools" submenu.
  • Added toggles in the editor menu for enabling/disabling Live2D and Spine integrations.
  • Added an option to the voice map utility to use addressable when it's installed.
  • Added a "Show Played Line" command to the VS Code extension allowing to navigate to the currently played scenario line.
  • The IDE extension settings are now applied immediately and no longer require restarting VS Code for the changes to take effect.
  • Added default key bindings to the VS Code commands.
  • Added a VS Code diagnostic for dynamic endpoints.
  • Added Skip Print Delay option to printer configuration allowing to slow down the print command execution while in skip mode.
  • Added expression, command, and formatting tags highlighting, diagnostic, and auto-completion to the VS Code extension.
  • Optimized the audio interface to not require anything from the Unity's default audio backend for easier overrides with custom audio solutions.
  • Improved interoperability with Unity's new input system; optimized the input interface for easier overrides with custom input solutions.
  • Added Filter Mode option to the actor metadata; set to Point for pixel-perfect rendering.
  • Naninovel will now auto-import TextMeshPro essential resources in case they're missing to prevent errors when entering play mode.
  • State rollback is now possible in the editor even when disabled in the configuration for debug/authoring purposes.
  • Buttons on the text printer's control panel will auto-hide when associated UIs or features are disabled.
  • Added Unity events for the essential engine events; the components can be found under Naninovel/Events component menu.
  • Added Disable Blocked Input Features option to custom UI (enabled by default). When Block Input When Visible is enabled on the UI, disable to option to prevent the UI from disabling features associated with the blocked input, such autoplay and skip.
  • Added text identifier utility instead of the Stable Identification feature for a more controlled way to automatically generate text identifiers for the scenario text and also an option to un-identify the text. [doc]
  • Improved reload console command to work in builds as well.
  • Added Reload Scripts option to the local resource provider; when enabled (default) will hot reload the modified script files stored under the local provider resources directory.
  • Added an API to retrieve the existing save slot IDs to the state manager service.
  • Added APIs to track and load the last saved game to the save-load UI.
  • Play Script component now accepts a script asset reference instead of a script path, which persists the reference when the asset is renamed or moved.
  • Added context object associations to error and warnings logged in the Unity console; when such messages are clicked, the associated game object will be pinged in the Unity editor.
  • Added Message Limit option to the chat text printer allowing to limit the maximum number of displayed chat messages (disabled by default).
  • Added bubble anchors feature, allowing automatically aligning bubble printers with their respective authors. [doc]
  • Added Live2D background implementation.
  • It's now possible to edit the resource loader path prefix in the inspector.

Changed

  • The minimum-supported Unity version changed to 6.0.50.
  • Unity's legacy input manager is no longer supported.
  • Changed label delimiter from . to # to support the new relative endpoint syntax; use Naninovel/Upgrade/v1.20 to v1.21 tool in the Unity editor menu to automatically upgrade the scripts.
  • IScriptPlayer API has been changed to support async script execution; most playback-related APIs have been moved to IScriptTrack, which can be accessed from the script player.
  • Command.Execute method signature changed from (AsyncToken) to (ExecutionContext).
  • Layered actors no longer attempt to align an underlying game object with the render texture, as that was causing rendering issues. Perfect alignment is not possible anyway due to render effects, such as look direction flipping. When the alignment is required, use generic or custom implementations.
  • Command attribute [Command.CommandAlias] renamed to [Command.Alias], parameter attribute [Command.PrameterAlias] removed—use [Command.Alias] instead.
  • Removed Google Drive resource provider; use Local Provider pointing to a directory synced with Google Drive (or other similar services) instead.
  • @input and @choice commands will now auto-halt the playback, so you no longer have to add @stop after them. Upgrade script automatically changes @choice to @addChoice which works same as the @choice before.
  • Changed the type of lock parameter of @choice to string with condition context to allow assigning expression without wrapping the value in curly braces.
  • @save command now writes to the newly added "AUTO" tab instead of the quick-save tab.
  • Choice buttons are now always load via the Choice Button Loader specified in the choice handler configuration menu (previously they'd fall back to Resources.Load method when loading failed).
  • Removed @delay command; use @async followed by @wait instead.
  • Removed Object Triggers list from the text printers; continue input triggers are now assigned by attaching Input Trigger component to any compatible object in the printer prefab.
  • Removed Always Process feature from the input samplers. Instead, specify the input names that should be processed when a blocking UI is visible in the UI's Allowed Inputs list.
  • Removed Stable Identification feature; use the newly added Text Identifier utility instead. [doc]

Fixed

Most fixes associated with bugs found during the pre-release stage are backported to the previous stable release and are not listed here; find them at the "Patches" section of the previous release changelog.

  • Fixed ICustomVariableManager.OnVariableUpdated event not invoked on game load and rollback.
  • Fixed parameter value without whitespace has wrapping quotes removed when formatting with VS Code or with stable identifier in Unity.
  • Fixed layered actors clipping when scaled, and the local position is not balanced.
  • Fixed warnings on hot reload after editing a line before the currently played one.
  • Fixed video resources failing to load in WebGL build when the addressable is not installed.
  • Fixed video resources duplicated in the WebGL build when the addressable is installed.
  • Fixed @await command waiting for all the currently played commands instead of only the nested ones.
  • Fixed @trans command completing all the currently played commands instead of only the nested ones.
  • Fixed custom @choice buttons failing to load when the path is dynamic (specified with an expression).
  • Fixed a false-positive VS Code warning when nested lines are separated by an empty line.
  • Fixed @movie not awaited by default.
  • Fixed unintended input activations when typing variable value with @input.
  • Fixed false-positive VS Code diagnostics for overloaded expression functions with non-static parameters.
  • Fixed Loading UI disabling autoplay and skip when shown.
  • Fixed actor rendering issues in URP in the Unity editor when the scene view is set to 3D mode.
  • Fixed author labels ignored in the backlog UI.
  • Fixed incorrect formatting of the backlog choices.