1.20 Release Notes
Release date: Q4 2024
NOTE
This is the current stable release, which receives only bug fixes. Keep using it if you're in the later stages of development or have already published your project. Note that Unity Asset Store distribution usually lags by 2-3 months, so we recommend installing Naninovel from GitHub.
Highlights
Compatibility
Supported Unity versions range: 2022.3.61 - 6000.0
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 v1.19 release upgrade guide, then continue with the following instructions:
- Backup the project or use a VCS to be able to rollback in case something goes wrong.
- In case using VS Code extension, update both the extension and VS Code itself to the latest versions, then run
Naninovel: Purge Cached Metadatacommand viaView -> Command Paletteand restart VS Code. - Remove
NaninovelandNaninovelData/Savesfolders from the project and install the new release. [doc] - Reset
Script Parserin scripts configuration (when not using custom parsers, just re-select the only available option), restart Unity editor and re-import scenario scripts. - Revise how script assets are stored in Unity project: it's now required for all scripts to be stored under a single root directory (
Assets/Scenarioby default, can be changed in scripts configuration viaScript Rootoption); when a script is stored outside the specified root, a warning will be logged. - In case organizing script assets under sub-directories of the script root, make sure to reference them by their local paths; for example, to navigate to
Assets/Scenario/Prologue/Day1.naniscript, use the following command@goto Prologue/Day1. - Due to scripts now being identified by their local paths instead of just name, localization and auto-voicing have to be re-generated; to preserve existing translations, make sure localization documents mirror scripts file structure. For example, Japanese localization document for
Assets/Scenario/Prologue/Day1.naniscript has to be atAssets/Resources/Naninovel/Localization/ja/Text/Scripts/Prologue/Day1.txt. Use localization sample project as a reference setup. - Some managed text documents may need to be regenerated, as some records associated with static fields used to have incorrect keys; for example,
GameSettingsFontDropdown.DefaultFontNamerecord insideDefaultUIdocument hadNaninovel.UI.GameSettingsFontDropdown.DefaultFontNamekey. - Add
SkipMovieinput binding to the input configuration menu or input actions asset (when using new input system) with the desired bindings to skip movie playback (Escby default). - In case using
@ifconditional blocks, either make sure the commands inside blocks are not indented or switch to the new syntax with indentation and remove@endifcommand. [doc] - In case using
@elseif ...commands, replace them with@else if:.... - In case using
doparameter of@choicecommand, replace it with nested callback. [doc] - In case using
doparameter of@waitcommand, replace it with@delaycommand. - In case using
@startTransand@stopTranscommands, replace them with@trans. - In case using
[skipInput]command, replace the occurrences with[< skip!]generic parameter. [doc] - In case using
ExpressionFunctionsattribute to expose custom expression functions, remove the attribute from the class and instead applyExpressionFunctionattribute to the methods of the class. [doc] - In case using
removeparameter of@hide,@hideAllor@hideCharscommands, remove the parameter and instead use@removecommand after hiding the actors. - In case using Live2D or Spine extensions, remove the extension directories and follow setup instructions on the dedicated character guides (both extensions have been merged with the main package). You may also have to re-assign character implementation types in the configuration after finishing the setup. [doc]
- In case using async methods of Naninovel C# API, remove the "Async" suffix; eg,
Command.ExecuteAsyncis nowCommand.Execute. - In case using custom actor shaders, assign materials instead of the shaders. [doc]
- Due to
Authored TemplateandAuto Line Breaksmoved to text printer UI setting, revise the formatting settings. For example, "Fullscreen" printer has%AUTHOR%: “%TEXT%”template for authored messages (+) specified by default. [doc] - In case using
@stylecommands, replace them with@formatcommands. - In case using
[br]inlined commands, replace with<br>tags.
WARNING
In-game saves (slots in save/load menu, values in settings menu and global game state) created with previous versions may cause undefined behavior when loaded with the updated version; when patching a shipped project with a new Naninovel version, make sure existing saves work as expected.
Added
- Added compiler localization feature allowing to re-map all the NaniScript compiler specs: control characters, command and parameter names, constants and basically anything you have to type when authoring scenario scripts. [doc]
- Added nesting concept to NaniScript allowing to specify a block of commands nested under (associated with) other command. Various existing commands are now using this concept for more readable and concise syntax; added several new commands, which were previously impossible to represent in NaniScript without the new syntax: [doc]
- Upgraded
@ifand@elsecommands to support nesting; [doc] - Upgraded
@choicecommand to support nesting; [doc] - Merged
@startTransand@finishTranscommands into@trans; additionally, it's no longer required to specifytime:0for each underlying command — they'll complete instantly by default; - Added
@whilecommand for looping nested commands as long as condition is truthy; - Added
@delaycommand allowing to delay execution of nested commands; - Added
@randomcommand allowing to randomly execute one of its children; - Added
@groupcommand allowing to join multiple lines into single execution block; - Added
@awaitcommand allowing to await nested async commands before continuing script playback. Intended to be used withWait By Defaultdisabled in script player configuration, which is now the default in new projects. [doc]
- Upgraded
- Added boolean flags as shortcuts for boolean parameter values. [doc]
- Added a way to apply print parameters for parts or whole generic text lines. [doc]
- Added a way to delimit slack white space in generic lines with
[](empty inlined command). [doc] - Added
ConservativeandOptimisticresource policy modes instead ofStaticandDynamic. [doc] - Script file names no longer have to be unique and can be referenced by their local paths; for example you can have
Scripts/Prologue/Day1.naniandScripts/MainRoute/Day1.naniand reference them as@goto Prologue/Day1and@goto MainRoute/Day1. - It's no longer required to specify assemblies for custom types via
Type Assembliesproperty in the engine configuration; the option is removed. - Naninovel can now be installed as a UPM package.
- Live2D and Spine extension have been merged into the main package; it's no longer required to install dedicated packages to activate the integration.
- Improved engine initialization time by caching types on build instead of resolving them via reflection at runtime.
- Script and managed text resources are now loaded on-demand, which significantly reduces RAM usage and improves engine initialize time in large projects.
- Added
Label By Scriptsoption to the resource provider configuration; when enabled (default) will label all the Naninovel addressable assets by the scripts in which they’re used; whenBundle Modeof the addressable group is set toPack Together By Label, asset bundles will be optimized for the project scenario structure improving load times and RAM usage. [doc] - Player read progress feature no longer incurs runtime overhead, as the required data is cached at build time;
Count Total Commandsoption is removed from the scripts configuration, as it's now always available/enabled by default. - Added
Remove Actorsoption to resource provider configuration; when enabled (default) unused actors will be automatically removed and associated game objects disposed when unloading script resources, w/o the need to use@removecommands. [doc] - Added
Async Instantiationto the engine configuration; when enabled (default) will move the object instantiation off the main thread for improved performance and smooth asset loading. - Generic, Live2D and Spine actors now support multiple appearances applied at once to make setting up complex animation states easier. [doc]
- Added
Join Linesto localization utility. When enabled, generic lines in localization documents will be kept in single line for convenience. [doc] - Annotations inside localization docs now also include gist of the translated content to give translators more context. [doc]
- Added
lockparameter to@choicecommand allowing to lock/disable a choice. [doc] - Added
Auto Detect Localeto localization configuration. When enabled (default) will attempt to auto-detect locale using system language when the game is started first time. [doc] - Added continue input prompt to pagination reveal effect before changing page.
- Layered actor prefab instances are now nested under the associated actor game object; this adds support for behaviour which depends on object transform, such as lighting, interactive spots, etc.
- Added
Camera Maskoption to layered actor behaviour component allowing to specify additional camera layers to preserve when rendering the actor; use to support render features, which require dedicated camera layers, such as Unity's 2D Light. - Added
Has Nameto character configuration; when disabled, neither display name, nor actor ID will be displayed in printer UI. Useful for narrator-type characters with linked printers. [doc] - Added an option to supply font with community localization. [doc]
- Added an option to assign custom materials for rendering the actors, allowing to use Shader Graph to author custom actor shaders.
- Added
Separator Literalto built-in Tips UI allowing to change character used to separate title, category and tip text in managed text records. - Added
Selected Prefixto built-in Tips UI allowing to change unlockable ID prefix used to indicate that item was selected (seen) at least once. - Added
TipsPanel.HasUnselectedItem()method allowing to check if the tips panel contains any unselected items. - Added
Build Resourceseditor menu allowing to build Naninovel-related project resources (including addressables, when enabled) without building the player. - Added
lazyflag to@char,@back,@camera,@slideand some other commands allowing to not complete the animation when player skips it; useful for blending long-running async animations, such camera panning. - Added a way to create identified text references by prepending
&to the identifier. [doc] - Added an option to specify alias and documentation for custom expression functions.
- Numeric expression function parameters are no longer limited to
double. - Added
Play SFX While Skippingoption to audio settings; when disabled,@sfxcommands withoutloop!will not play while skipping. - Added
asparameter to@printcommand allowing to set custom name label; when combined withauthorparameter now handling multiple authors (delimited with,) and all authors specified with*— useful for representing multiple characters authoring single text line. [doc] - Added a way to include script expressions to localization documents and force re-evaluation when locale is changed. [doc]
- Added graceful handler for missing fonts: warning is logged and default font is used instead of throwing an exception.
- Added
blockparameter to@moviecommand allowing to block player interaction while the movie is playing to prevent skipping. - Added
@formatcommand instead of@stylefor more powerful text formatting capabilities. - Added folder selector to
GeneratedDataPathoption in the engine configuration. - Added
SkipMovieinput binding dedicated to skipping movies (previously sharedCancelbinding). - Added
@removecommand for disposing actors. - Added
Support Custom Opacityoption to text reveal fader effect; when enabled the effect will respect<alpha>tags and limit max opacity when fully revealed at the cost of some performance overhead. - Added
typeparameter to@inputcommand allowing to enforce type of the input variable value. - Added
Include Author To Backlogoption to text printers configuration allowing to not include author of the printed messages to the backlog; disabled by default for "Fullscreen" printer. - Added
Scene Path Rootoption to scene background actor settings allowing to change the root directory of the scene assets associated with the actor appearances. [demo] - Engine now has its own CSV parser and no longer depends on the third-party library.
- IDE (VS Code) extension improvements:
- New file-based bridging service makes the connection between Unity, VS Code and Web Editor more reliable and doesn't require any setup or tweaking, such as specifying preferred socket ports. [guide]
- Added visual indicator for the bridging connection status. [demo]
- Added rename refactor option for labels, script files and folders. [demo]
- The extension is now capable of formatting NaniScript documents. [demo]
- Label auto-completion and diagnostics no longer requires syncing metadata with editor;
- Added
Debounce Delaysetting to optimize diagnostic performance. The extension will no longer diagnose on each document change and instead accumulate changes and process them in batch with the specified debounce interval (500ms by default). - Already specified parameters are no longer suggested in the auto-completion list;
- Parameters, that has no effect or not supported by the command, such as
ifparameter in@ifcommand andwaitparameters in commands that are not async, are no longer suggested in the auto-completion list; - Parameter values with expression context are now highlighted as expressions, even when the value is not wrapped in
{}; - Localizable parameter values, such as printed text and choice labels are now highlighted independently to better distinguish "natural" text presented to player from other values.
- Indented lines are now foldable. Useful for folding nested blocks, as well as adding custom folding regions by indenting lines;
- Added an option to specify custom folding blocks; [doc]
- Added an option to specify context for expression function parameters. [doc]
- Added support for minimap section headers. [doc]
- Added code highlighting to the example snippets inside tooltips.
- Added common configuration defaults to the extension contributions: token colors, hiding
.metafiles, word wrapping, etc. - Added weak (informational) warnings in VS Code when a dynamic parameter value is preventing resource preloading.
- Appearances metadata (used for auto-completion in VS Code) for generic, live2d and spine actors is now generated based on trigger parameters in Animator component of the implementation prefab.
Changed
- Minimum supported Unity version changed to 2022.3.
- State reset now additionally invokes all the tasks added with
IStateManager.AddOnGameDeserializeTaskwith an empty game state. This affects built-in variable trigger component, as well as backlog, variable input, chat printer and choice handler UIs, resetting their local state when exiting to title and starting new game. - Target script of
@gosubcommand is now always preloaded. [doc] - Removed
@elseifcommand; use@else if:...instead. - Removed
doparameter of@choicecommand; use nested callback instead. [doc] - Removed
doparameter of@waitcommand; use@delaycommand instead. Wait By Defaultin script player configuration is now disabled by default in new projects. [doc]- Removed "Lazy" resource policy; use the new "Conservative" or "Optimistic" policies instead. [doc]
- Removed
[skipInput]command; use[< skip!]generic parameter instead. [doc] - Removed
ExpressionFunctionsclass attribute; useExpressionFunctionmethod attribute instead. [doc] - Movies are now skipped with dedicated
SkipMovieinput binding (previously sharedCancelbinding). - Removed
removeparameter from@hide,@hideAlland@hideCharscommands due to issues when the commands are not awaited; use@removecommand after hiding the actors instead. - Normalized power of snow and rain effects to 0.0-1.0 range; default values are now 0.5 for both.
- Removed
@startTransand@stopTranscommands; use@transinstead. - Scenario scripts are now identified by their local resource paths, instead of just asset names; associated APIs have been changed accordingly.
- Removed legacy (playback spot) auto-voicing mode.
- Dropped "Async" suffix in all the async method names.
- Changed
Custom Texture ShaderandCustom Sprite Shaderproperties in the actor metadata to accept materials instead of shaders for more flexibility and compatibility with shader graph. - Moved
Authored TemplateandAuto Line Breaksfrom text printer actor metadata to the printer UI. - Removed
@stylecommand; use@formatinstead. - Removed
@brcommand; use<br>tag instead.
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 chat printer duplicating messages on locale change.
- Fixed chat printer not updating printed text on locale change until restart.
- Fixed some managed text records associated with static fields having full type name as keys instead of short type name.
- Fixed leading and trailing white space lost when importing localization CSV sheets that were edited with Microsoft Excel.
- Fixed visual editor adding extra space after command identifier when nameless parameter is not specified.
- Fixed VS Code maximizing and stealing focus when highlighting played lines.
- Fixed VS Code missing metadata associated with class-level attributes.
- Fixed VS Code mixing appearances of actors with same ID, but of different types.
- Fixed VS Code inserting script name when typing
.to skip script in@gotoand@gosubcommands. - Fixed VS Code extension failing to properly process file names with non-ASCII characters.
Patches
2024-11-18Fixed expression parsing of double numbers affected by the culture.2024-11-18Fixed VS Code false-positive diagnostic of dynamic expression assignment.2024-11-19Fixed entry and title script missing in the generated metadata.2024-11-19Fixed language setting not localized on engine initialization.2024-11-20Fixed generated data folder created under the default location on library rebuild even when a custom location is specified.2024-11-24Fixed sprite actor having invalid initial appearance in builds when using addressables.2024-11-24Fixed exception thrown when clicking resource label in actor record assets.2024-11-25Fixed actor records not saving associated configuration on edit.2024-11-29Fixed voice language dropdown can't be localized.2024-11-30Fixed@formatcommand not applying default template selector.2024-11-30Fixed resources registered with addressable provider missing in the generated metadata.2024-12-11Fixed error when loading external scenario scripts (community modding).2024-12-22Fixed error when preloading@charand@backcommands with*specified as actor ID.2025-01-07Fixed VS Code missing on-hover documentation for functions inside named parameters with expression value context.2025-02-05Fixed BGM fails to play when started while it's stopping with an un-awaited@stopBgm.2025-02-07Fixed inconsistency between editor and build in resolving start game script when it's not explicitly specified.2025-02-15Fixed issues with folding ranges in VS Code.2025-02-16Fixed transient auto-generated data scattered under multiple directories.2025-02-18Fixed2025-02-16regression where VS Code failed to resolve data root until the project is opened with web editor.2025-02-24Fixed spreadsheet tool not allowing to select scenario folder which has all script assets organized under sub-folders.2025-02-24Fixed continue input requested before page break despite the content before the break being invisible (whitespace).2025-03-02Fixed extra closing parenthesis in script expressions not diagnosed in VS Code.2025-03-06Fixed[< !skip]causing double wait for input.2025-03-13Fixed confirmation UI warns about missing glyphs when changing language with associated font.2025-03-15Fixed error when parsing parameterize generic command with a dynamic parameter.2025-03-19Fixed script serializer not quoting nameless parameter values containing parameter assign symbol.2025-03-24Fixed error caused by delayed choice removal when loading game.2025-03-30Fixed missing operator in script expressions not being diagnosed by the VS Code.2025-04-26FixedAuto Show On Modifyactor option breaking standalone visibility animation.2025-05-14Fixed crash on circular script dependencies.2025-05-15Fixed error on goto and gosub in transient scrips.2025-05-28Fixed wrong click-to-continue indicator position after device rotation.2025-06-03Fixed error when performing rollback across scripts after changing language.2025-06-11Fixed debug console not available after engine reinit.2025-07-03Fixed character avatar failing to auto sync with the character appearance in some cases.2025-07-06Fixed falsy@elseincorrectly played when exiting an unterminated nested conditional block.2025-07-12Fixed invalid playback navigation after submitting nested@inputcommand.2025-07-14Fixed spawns leaking to rollback frames after an async despawn.2025-07-14Fixed snow and rain fx disappear abruptly on despawn.2025-07-15Fixed screen blinking when starting@transon some platforms.2025-07-15Fixed spine character trimmed when scaled.2025-07-15Fixed inconsistent actor position when fast-forwarding through@shakeand@char.2025-09-09Fixed empty layered enable/disable expressions affecting unrelated groups.2025-09-19Fixed choices not selectable with gamepad/keyboard after exiting a modal.2025-09-22Fixed infinite serialization loop when editing resources of an actor without any assigned resources.