1.22 Release Notes
Release date: Q4 2026
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: 6.7 LTS release (with the latest patches).
Non-LTS (tech, beta and alpha) releases are not supported. Any issues with future Unity releases will be addressed in the next Naninovel versions. Compatible Unity releases for past Naninovel versions are listed in the release notes.
Upgrade Guide
When upgrading a project with Naninovel version 1.20 or older, first follow the v1.21 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.
- If using the 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 the
Naninovel -> Upgrade -> v1.21 to v1.22Unity Editor menu. - If using the following attributes in custom C# extensions, rename them:
[ExpressionFunction] -> [ExpressionQuery][ConstantContext] -> [EnumContext][Alias(NamelessParameterAlias)] -> [PrimaryParameter]
- The
BGMandSFXresources are now separated, and theAudioresource prefix is no longer used. The upgrade script automatically assigns existingAudioresources asSFX. You will need to reassign the music clip assets asBGM. You can do that in batch by selecting multiple clip assets and choosingBGMin the Inspector header. [demo] - If initializing custom meta (previously "global") variables with the
@setcommand, add themeta!flag (theg_prefix no longer has any significance and can be removed). - If using decimal or integer parameters in custom commands, change the type to
NumberParameter. - If using variable APIs in C#, update the names: what was "CustomVariable" before is now just "Variable"; for example,
ICustomVariableManageris nowIVariableManager. - If using custom choice handlers, assign the
Contentproperty on the root prefab and revise the layout: theContentobject is now the target of@choiceHandlertransformations; any prebaked transformations should be applied to the descendants.
WARNING
Compatibility of save data between Naninovel releases is not guaranteed. When patching a shipped project with a new Naninovel version, make sure that existing saves work as expected.
Added
- Added a scene recording feature that allows capturing the state of scene objects into scenario scripts. [doc]
- Added support for inline comments in scenario scripts. [doc]
- Added support for whitespace in command parameter values, eg
@set a=1, b=2. - Added line and command decorations to the VS Code extension. [doc]
- Added support for nesting with tabs. [doc]
- Added expression operator aliases. [doc]
- Added
@orcommand, which works as a shortcut to@else if:.... - Added the universal actor implementation, which uses native URP rendering and supports most built-in renderers out of the box. [doc]
- Added
Volumesto the camera configuration andfxparameter to the@cameracommand for applying post-processing effects in URP. [doc] - Added options to control URP camera stacking to the camera configuration.
- Added ruby support to the default choice buttons.
- Added
Clear Save Datautility to the Naninovel editor menu for quickly purging saved games and global state, such as unlocked tips. - Added support for partial localization documents; ie Naninovel no longer throws when a scenario or managed text localization document is missing (a warning is still logged).
- Added support for spaces in labels, eg
# My Labeland@goto # My Label. - Added support for case-insensitivity across all the user-facing identifiers: actor IDs, commands and queries, variable names, resource paths, script paths and labels, etc.
- Added an option to control the indent type (tab or four spaces) to the VS Code extension.
- Added a played line indicator to the VS Code extension instead of selecting the played line text.
- Actor order is now always stable, making features like auto arrange produce consistent results between runs.
- Added fuzzy search and advanced grouping to the dropdowns throughout the editor menus. [demo]
- Added
Instant Reveal On Continueoption to the revealable text printers (enabled by default). When disabled, theContinueinput won't instantly complete the gradual text reveal effect. [demo] - Added script text constants to the expression auto-completion list in the VS Code extension.
- Added
toparameter to the@setcommand for specifying a shared value to be assigned to the variables. - Added
meta!andconst!flags to the@setcommand for designating the variable kind without using special name prefixes. - Added scenario variable scopes and local scope. [doc]
- Added rename refactoring, auto-completion filtering, go to definition and find declarations features for scenario variables in the VS Code extension.
- Added input rebinding APIs to the input manager and a dedicated input settings tab for rebinding the input.
- Added auto trimming for layer composition expressions, which prevents accidental whitespace or new lines from breaking them.
- Added error reporting when an exception occurs while waiting for a queued add actor task.
- Added public APIs to
BridgingServicefor communicating with the attached bridging servers, such as the VS Code extension and Story Editor. - Added binary load progress to the Story Editor appearing when loading takes more than 3 seconds.
- Added an auto reload feature to the Story Editor, which automatically reloads the embedded editor to install the update after it's downloaded.
- Updated the Arabic support script to the latest version, which now correctly handles TMPro tags and various edge cases.
- Added
posandwposparameters to the audio commands for controlling the audio source position in scene and world space, aka "3D audio". [doc] - Added
Aspect Ratiosoption to the camera configuration for enforcing specific aspect ratios on the managed cameras. [doc] - Added a rename field to the resource header editor for renaming compatible resources without using dedicated editor menus. [demo]
- Added
waitFadeparameter to the@bgmand@sfxcommands that allows waiting for the fade-in/out, while thewaitparameter now allows waiting until the played audio ends. - Added
pitchparameter to the@bgm,@sfxand@voicecommands that allows changing the perceived frequency (speed) of the played audio. - Added
easingparameter to the@bgm,@sfxand@voicecommands that allows animating the audio properties with a tween. - Added
@linkPrinterand@unlinkPrintercommands for overriding linked printers at runtime. - Added nesting capability to the
@printercommand, which will auto-link the printer while the nested context is executing and unlink on exit. - Added
[PrimaryParameter]attribute that can be used as a shortcut for[Alias(PrimaryParameterAlias)]. - Added auto trimming for the values submitted by
VariableInputUI. - Added
Clear Coloroption to the camera configuration for changing the color used to clear the screen when rendering with the default camera without setting up a custom camera prefab. - Added support for the latest Live2D Cubism SDK based on the URP renderer.
- Added a customizable notification when state recovery occurs.
- Added system font fallback in the editor when rendering glyphs unsupported by the game fonts.
- Added auto registration of the generated localization documents with Addressables when installed.
- Added
Import Sourceoption to the Spreadsheet utility. When enabled, the source scenario scripts will be rewritten with the source locale column in spreadsheets. Useful for proofreading the scenario content along with translations. - Improved
@choice: it can now be used without restrictions, including in conditional and non-deterministic contexts. - Added cut/copy/paste operations for lines in the Story Editor.
- Added an option to paste from the clipboard directly into the Story Editor, allowing you to paste, for example, scenario scripts from the docs or VS Code directly into the editor.
- Added an option to select and drag-and-drop multiple lines in the Story Editor.
- Added context commands for tabs in the Story Editor: close, close all, close other, close to left/right.
- Added support for spaces after the script path in navigation endpoints, allowing them to be formatted as
@goto Script # Label. - Added
Push Rollback Snapshotmethod to theState Eventscomponent for pushing snapshots from Unity events. - Added
@pushRollbackcommand allowing the player to roll back to a specific point in the scenario script. - Added support for Spine SDK version 4.3.
- Added an option to specify animation tracks for Spine actors in scenario scripts. [doc]
- Added
Control Animationparameter to the Spine actor controller; when enabled, the appearances will map automatically to animations and respect the transition duration parameter. - Added
Default Trackparameter to the Spine actor controller for changing the animation track index used when it's not specified in scenario script commands. - Added syntax highlighting for managed text documents (including localization documents) to the VS Code extension.
- Added
wposalias to thepositionparameter in supported commands and made it mutually exclusive withposwhere applicable for clarity. - Added
rollparameter to actor and spawn commands as a shorthand for Z-axis rotation. - Added
transientparameter to the@spawncommand; when enabled, the spawned object won't serialize with the game state and won't require@despawnlater — useful for one-shot short-lived effects. - Added automatic unloading of audio resources once their associated clips stop playing.
- Added
Main RendererandUI Rendererto the camera configuration for selecting custom URP renderers for the main and UI cameras respectively without having to assign custom camera prefabs. - Added automatic UI focus fallback when the focused object is not interactable.
- Added Linux support for the embedded Story Editor.
- Added an explicit player-facing error message when a save fails; it's possible to customize the behaviour by overriding the new
HandleSaveFailedmethod of theStateManagerservice.
Changed
- The minimum supported Unity version changed to
6.7. - Removed the legacy script graph and visual scenario editor (use the Story Editor instead).
- Removed the legacy
@animatecommand (use@asyncinstead). - Changed the assignment expression separator from
;to,(semicolon is now used by inline comments); use the upgrade script to automatically upgrade scripts. - Expression functions have been renamed to queries; all the associated APIs and features have to be updated accordingly.
- Renamed
[ConstantContext]metadata attribute to[EnumContext]to prevent confusion with the newly introduced expression constants. - The
g_andt_custom variable prefixes no longer have any significance. To initialize meta (previously "global") variables with the@setcommand, use themeta!andconst!flags for metas and constants respectively. - The concept of "Nameless Parameter" is renamed to "Primary Parameter" for clarity.
- Replaced
IntegerParameterandDecimalParameterwith a singleNumberParameter. - Renamed APIs related to variables from "CustomVariable" to "Variable"; for example,
ICustomVariableManageris nowIVariableManager. - Separated
BGMandSFXaudio resources: they now each have their own resource loader and category. - Changed the effect of the
waitparameter on the@bgmand@sfxcommands: it now waits until the played clip ends instead of waiting for the fade-in/out to finish; addedwaitFadeparameter to do that instead. - The layered actor implementation is deprecated and will be removed in the next release. Use the new universal actor implementation with the
Layered Actor Controllercomponent 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 in the "Patches" section of the previous release changelog.
- Fixed printer resources not being unloaded from memory when the actor is removed from the scene.
- Fixed choice handlers ignoring transform parameters of the
@choiceHandlercommand. - Fixed
@sun,@rainand@snowignoring initialposandwposparameters. - Fixed UI focus and navigation issues when the target object is disabled in the hierarchy or not interactable.
- Fixed first-time setup skipped in projects sharing a name with a previously opened one.