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:
- Back up the project or use a VCS to be able to roll back in case something goes wrong.
- In case using VS Code extension, update both the extension and VS Code itself to the latest versions.
- Install the new release. [doc]
- Run the upgrade script via
Naninovel/Upgrade/v1.20 to v1.21Unity editor menu. - If you've customized the built-in save-load UI, revisit the prefab, as it now has an additional "AUTO" tab.
- Choice buttons are now always loaded via the
Choice Button Loaderspecified in the choice handler configuration menu, and should be stored in theResources/Naninovel/ChoiceButtonsfolder. Alternatively, you can configure a different resource provider in the loader settings. - In case using custom commands, update the
Executesignature to acceptExecutionContextinstead ofAsyncToken. - In case using script playback APIs of
IScriptPlayerservice, useIScriptPlayer.MainTrackto getIScriptTrack, which now hosts most of the playback-related APIs. In custom commands, useExecutionContext.Trackto get the track associated with the command execution. - In case using
@animateor@delaycommands, replace them with@async. - 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 Triggercomponent withContinueinput ID to the objects that should act as triggers. - In case using custom UIs with
Block Input When Visibleenabled and expectingAlways Processinputs to not be muted, specify the inputs in the blocking UI'sAllowed Inputslist instead, individually for each blocking UI that requires it.
Added
- Added full support for concurrent scenario playback through the updated
IScriptPlayerAPIs and the new@asyncand@synccommands. [doc] - Transient scripts, such as those played via the
PlayScriptcomponent, 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
@unlesscommand andunlessparameter for all commands, which work as the logical inverse to@ifcommand andifparameter 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:
@stopcommands 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 Commandsproperty of theRevealable Text Printer Panelcomponent found on the printer prefabs) are now awaited allowing to use@waitcommands to control the reveal process. - Added "AUTO" save-load tab;
@savenow uses the auto tab instead of the quick-save tab. - Added
Auto Save On Quitoption 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(@toastcommand) is now updated on locale change. - Added
Expose Source Localeoption to the localization configuration (enabled by default). When disabled, the source locale won't be available for the end-users (players). [doc] - Added
loopparameter to@shakecommand allowing to enable/disable continuous shake effect instead of usingcount:0andcount:-1. - Added
atparameter to@savecommand 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
LastGameStateproperty 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
VirtualResourceProvideroption 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
reloadconsole command andIHotReloadengine service. - Made most built-in UIs pixel-perfect to prevent pixel alignment issues when running outside the native resolution.
@inputcommand will now automatically pull predefined value in case the assigned variable already has a value.@choiceand@inputcommands no longer require adding@stopto halt script playback until the user interaction is committed. In case a playback halt is not required, use the addedskipparameter.- Added condition context to
lockparameter of@choiceallowing 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.Contextproperty allowing to access the context of the evaluated expressions in the associated C# methods. - Added
IScriptManager.Add/RemoveTransientAPIs 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 Filterto 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 Delayoption 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 Modeoption to the actor metadata; set toPointfor 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/Eventscomponent menu. - Added
Disable Blocked Input Featuresoption to custom UI (enabled by default). WhenBlock Input When Visibleis 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 Identificationfeature 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
reloadconsole command to work in builds as well. - Added
Reload Scriptsoption 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 Scriptcomponent 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 Limitoption 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; useNaninovel/Upgrade/v1.20 to v1.21tool in the Unity editor menu to automatically upgrade the scripts. IScriptPlayerAPI has been changed to support async script execution; most playback-related APIs have been moved toIScriptTrack, which can be accessed from the script player.Command.Executemethod 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.
@inputand@choicecommands will now auto-halt the playback, so you no longer have to add@stopafter them. Upgrade script automatically changes@choiceto@addChoicewhich works same as the@choicebefore.- Changed the type of
lockparameter of@choiceto string with condition context to allow assigning expression without wrapping the value in curly braces. @savecommand now writes to the newly added "AUTO" tab instead of the quick-save tab.- Choice buttons are now always load via the
Choice Button Loaderspecified in the choice handler configuration menu (previously they'd fall back toResources.Loadmethod when loading failed). - Removed
@delaycommand; use@asyncfollowed by@waitinstead. - Removed
Object Triggerslist from the text printers; continue input triggers are now assigned by attachingInput Triggercomponent to any compatible object in the printer prefab. - Removed
Always Processfeature from the input samplers. Instead, specify the input names that should be processed when a blocking UI is visible in the UI'sAllowed Inputslist. - Removed
Stable Identificationfeature; use the newly addedText Identifierutility 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.OnVariableUpdatedevent 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
@awaitcommand waiting for all the currently played commands instead of only the nested ones. - Fixed
@transcommand completing all the currently played commands instead of only the nested ones. - Fixed custom
@choicebuttons 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
@movienot 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 UIdisabling 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.