跳转到内容

角色 ​

角色是用于表示放置在 背景 之上的场景实体的 Actor。

角色 Actor 由名称、外观、可见性、变换(位置、旋转、缩放)和朝向定义。

可以使用 Naninovel -> Configuration -> Characters 编辑器菜单或使用 Actor 记录 配置角色的行为;有关可用选项,请参阅 配置指南。可以使用 Naninovel -> Resources -> Characters 编辑器菜单访问角色的资源管理器。

在剧本脚本中,角色通过 @char 命令控制:

nani
; 以默认外观显示 ID 为“Sora”的角色。
@char Sora

; 与上面相同,但将外观设置为“Happy”。
@char Sora.Happy

; 与上面相同,但另外将角色放置在距离场景左边界 45%
; 和底部边界 10% 的位置;
; 还让他向左看。
@char Sora.Happy look:left pos:45,10

提示

与其手动调整数值参数,不如使用 场景录制,通过 Unity 场景视图中的 Gizmos 布置 Actor 和摄像机,并自动生成对应的 NaniScript 命令。

Actor 记录 ​

如果您有很多角色,并且通过编辑器菜单逐一分配它们不方便,请使用 Actor 记录资产(Create -> Naninovel -> Actor Record -> Character)。它们支持多重编辑,并允许您使用文件夹组织记录。请观看下面的视频查看示例。

cover

姿势 ​

每个角色都有 Poses 属性,允许指定命名状态(姿势)。

cover

姿势名称可以用作 @char 命令中的外观,以一次性应用姿势中指定的所有选定参数,而不必通过命令参数逐个指定它们。

nani
; 假设为“Kohaku”定义了“SuperAngry”姿势,
; 应用姿势中指定的所有选定参数。
@char Kohaku.SuperAngry

; 与上面相同,但在 3 秒内使用“DropFade”过渡。
@char Kohaku.SuperAngry via:DropFade time:3

请注意,当姿势用作外观时,您仍然可以覆盖单个参数,例如:

nani
; 假设为“Kohaku”定义了“SuperAngry”姿势,
; 应用姿势状态中指定的所有参数,
; 但色调除外,它在命令中被覆盖。
@char Kohaku.SuperAngry tint:#ff45cb

在角色和背景配置中,您还可以找到 Shared Poses——这些姿势在所有相应的 Actor 之间共享。共享姿势的典型用例是复用说话/非说话模板,或创建相对于摄像机的预定义舞台站位。

cover

Actor 自身的姿势和共享姿势也都可以通过专用的 pose 参数应用:

nani
@char Kohaku.Happy pose:DownLeft
@char Yuko.Surprise pose:UpCenter
@char Misaki pose:UpRight
cover

Actor 自身的姿势优先于共享姿势,这意味着如果 Actor 姿势的名称与共享姿势相同,则将使用 Actor 自身的姿势。这样就可以在必要时为特定 Actor 覆盖共享姿势。

显示名称 ​

在角色配置中启用 Has Name 后,即可为特定角色设置 Display Name。设置后,打印机名称标签 UI 会显示该名称,而不是角色 ID。这样就能使用由多个词组成、含有空格或特殊字符的角色名称,而这些字符不能用于 ID。

或者,可以使用“CharacterNames”管理文本 文档指定名称,该文档在运行生成管理文本资源的任务时自动创建。使用它来本地化显示名称和/或在 Unity 编辑器之外编辑它们。管理文本文档中的记录优先于 Actor 配置中设置的显示名称,并将覆盖它们。

可以将显示名称绑定到剧本变量,以便通过剧本脚本在整个游戏中动态更改它。要绑定显示名称,请在角色配置菜单中指定用大括号括起来的剧本变量名称。

cover

然后,您可以在脚本中更改变量值,显示名称也会随之更改:

nani
@set PlayerName="神秘人"
Player: ...

@set PlayerName="斯坦博士"
Player: 你可以叫我斯坦博士。

也可以利用名称绑定功能,让玩家通过 @input 命令选择自己的显示名称:

nani
@input PlayerName summary:"请选择你的名字。"
Player: 你可以叫我 {PlayerName}。

大括号中的内容实际上会被视为完整的 剧本表达式,因此可以用更复杂的逻辑来计算显示名称。例如,您可能希望在某个时刻之前让角色使用预定义的可本地化显示名称,之后再让玩家选择自定义名称。

假设该角色的 ID 为“Char1”,预定义名称存储为 T_PredefinedName 管理文本记录,玩家输入的值将存储为 name 剧本变量,并且在玩家设置名称后,nameSet 变量将设置为 true。将以下表达式分配给 Display Name 属性:{ nameSet ? name : T_PredefinedName }。

cover

然后使用以下剧本脚本:

nani
@char Char1

Char1: 我的名字现在由 `T_PredefinedName` 管理文本记录预定义。
Char1: 它是可本地化的;更改语言环境,它会相应更新。
Char1: 现在,我们让玩家输入一个自定义名称。

; 注意通过 `value` 参数指定的默认输入值:
; 它是从管理文本中检索的,也是可本地化的。
@input name summary:"请选择你的名字。" value:{T_DefaultName}

; 在这里我们设置变量,该变量用于表达式中
; 以决定从哪里获取显示名称的值。
@set nameSet=true

Char1: 我的显示名称现在已绑定到 `name` 剧本变量。

禁用 Has Name 后,显示名称和角色 ID 都不会出现在打印机 UI 中。这对于 旁白角色 很有用:它们可能有 链接的打印机,但不应显示其 ID。

名称标签 ​

虽然在大多数情况下推荐使用上面讨论的显示名称,但有时您可能希望仅在几行中更改 Actor 的名称,或使多个 Actor 成为同一行的作者。为每个此类情况设置专用的 Actor 或基于变量的显示名称是不切实际的。此时请考虑使用 as 通用参数:

nani
; 即使“Kohaku”角色可能在配置中设置了自定义显示名称,
; 也使用“某人”作为名称打印此行。
Kohaku: 天地玄黄,宇宙洪荒。[< as:"某人"]

; 打印该行,将“大家”显示为作者名称
; 并使所有可见角色成为打印文本的作者。
*: 天地玄黄,宇宙洪荒![< as:"大家"]

; 类似,但只让“Kohaku”和“Yuko”成为作者。
Kohaku,Yuko: 天地玄黄,宇宙洪荒?[< as:"Kohaku 和 Yuko"]

— as 参数是可本地化的,会出现在脚本本地化文档中以供翻译。此外,说话者高亮 功能将识别作者 ID 中指定的 * 和 ,,并将所有/选定的角色高亮显示为说话者。

消息颜色 ​

在角色配置中启用 Use Character Color 时,如果在 @print 命令或通用文本行中指定了相应的角色 ID,则打印机文本消息和名称标签将使用指定的颜色设置色调。

以下视频演示了如何使用显示名称和角色颜色。

cover

头像纹理 ​

您可以使用 @char 命令的 avatar 参数为角色分配头像纹理。当兼容的文本打印机打印与角色关联的文本消息时,将显示头像。

cover

目前,只有 Wide 和 Chat 内置打印机支持头像功能。要在自定义打印机中支持该功能,请将带有 Author Image 组件的游戏对象分配给 Revealable Text Printer Panel 组件的 Author Avatar Image 属性。

要使用某个头像,您必须首先将其添加到头像资源并为其命名。您可以通过角色配置菜单中的 Avatar Resources 属性执行此操作。

cover

注意

头像名称可以是任意的,不必包含现有的角色 ID 或外观。这仅在您希望将头像与角色关联以便自动显示时才需要。

然后,您可以像这样显示特定的头像纹理:

nani
@char CharacterId avatar:AvatarName

要为角色设置默认头像,请将头像纹理资源命名为 CharacterID/Default;例如,要为 ID 为 Kohaku 的角色设置默认头像,请将头像资源命名为 Kohaku/Default。默认头像将自动显示,即使 @char 命令中未指定 avatar 参数。

也可以将头像与特定的角色外观关联,以便当角色更改外观时,头像也会自动更改。为此,请使用以下格式命名头像资源:CharacterID/CharacterAppearance,其中 CharacterAppearance 是要映射头像资源的外观名称。

要仅在文本打印机内显示角色的头像,但隐藏角色本身,请将 @char 命令的 visible 参数设置为 false,例如:

nani
@char CharacterId !visible

如果您在角色本身应保持隐藏的情况下不断更改头像,请考虑在角色配置菜单中禁用 Auto Show On Modify;禁用后,在角色处于隐藏状态时更改其任何参数都无需指定 !visible。

注意

头像与角色外观没有直接联系,不应被视为在场景中表示角色的方式。头像是将任意图像“注入”到兼容文本打印机的独立功能。如果您希望实际角色出现在文本打印机(或自定义 UI)内,请参阅 将 Actor 渲染到纹理 功能。

说话者高亮 ​

在角色配置中启用后,说话者高亮会根据最后打印的消息是否与角色关联,为角色应用指定的 姿势。这样可以自动高亮显示“正在说话”的角色,通常通过设置色调或缩放来实现。

cover

当为多个角色应用相同的高亮姿势时,建议使用位于角色配置根级的 Shared Poses。

口型同步 ​

事件驱动 ​

支持动画的角色实现(通用、分层、Live2D 等)提供 On Started Speaking 和 On Finished Speaking Unity 事件。当此类角色成为打印消息的作者或不再是作者时(更确切地说,是当消息完全显示时),将调用这些事件,允许您触发任何自定义逻辑,例如开始或停止受控角色的嘴部动画。

cover

启用 自动配音 功能时,事件将由配音驱动;否则,打印的文本消息将激活事件。在后一种情况下,您可能希望手动屏蔽这些事件(例如,为了防止在打印标点符号时出现嘴部动画);对于此类情况,请使用 @lipSync 命令。

音频驱动 ​

如果您想通过语音音频剪辑的实际波形来驱动角色嘴部动画,请使用角色配置中的 Voice Source 选项。当分配带有 Unity Audio Source 组件的预制件时,Naninovel 将在角色对象下实例化该预制件,并通过音频源组件播放角色的语音。

通过访问用于角色语音的专用音频源组件,您可以接入自定义解决方案来分析播放音频的波形并相应地驱动嘴部动画。有多种第三方解决方案可以帮助实现这一点。例如,Live2D 的 Cubism Audio Mouth Input 组件或 SALSA ↗。

链接的打印机 ​

可以使用 Linked Printer 属性将 文本打印机 与角色关联。

cover

链接后,该打印机将自动用于处理以该角色为作者的消息。

请注意,@print 命令(在打印通用文本行时也在底层使用)默认会使关联的打印机成为默认打印机并隐藏其他可见打印机。当打印机链接到角色时,打印命令将在打印与相应角色关联的文本时自动更改当前可见和默认的文本打印机。可以通过在打印机 Actor 配置菜单中禁用 Auto Default 属性来防止此行为;禁用后,您必须使用 @printer 命令手动显示/隐藏和切换默认打印机。

提示

将打印机链接到 旁白角色,并禁用 Has Name,即可让旁白文本使用该打印机。这样就无需反复使用 @printer 切换回非角色(默认)打印机。

要在运行时链接和取消链接打印机,请使用 @linkPrinter 和 @unlinkPrinter 命令。此外,也可以通过在 @printer 下嵌套命令,将所有作者临时链接到特定打印机。

nani
; 无作者行默认使用“Fullscreen”。
@linkPrinter Fullscreen to:DefaultAuthor
; “Kohaku”默认使用“Wide”打印机。
@linkPrinter Wide to:Kohaku

这会用“Fullscreen”打印。
Kohaku: 我则用“Wide”打印!

; 对嵌套命令强制使用“Dialogue”。
@printer Dialogue
    这会用“Dialogue”打印。
    Kohaku: 现在我必须使用“Dialogue”。

回到“Fullscreen”。
Kohaku: 我又可以使用自己的“Wide”了!

; 无论“Kohaku”链接的是哪个打印机,都取消其链接。
@unlinkPrinter from:Kohaku
这不受影响,仍使用“Fullscreen”。
Kohaku: 谁拿走了我的“Wide”?!正在用“Fullscreen”打印...

默认作者 ​

当为常规角色使用 链接的打印机 时,您可能希望没有显式作者的 通用文本行 和 @print 命令回退到专用打印机。这就避免了必须为每个这样的行指定旁白 ID 或使用 @printer 命令手动切换打印机。

要启用此行为,请创建一个 ID 为 DefaultAuthor 的角色记录,将其实现设置为 NarratorCharacter 并禁用 Has Name 选项。该角色随后将充当任何无作者文本的回退作者,并自动应用其链接的打印机。

占位符角色 ​

占位符实现是默认实现,用于在您还没有任何视觉资产来表示角色时起草剧本。它使用 Actor 元数据(如标识符、显示名称和颜色)来程序化生成角色占位符。

cover

下面是一个 占位符背景 的示例,上面有几个占位符角色。请注意,当前正在说话的角色通过增大缩放和不透明度来高亮显示。

cover

精灵角色 ​

角色 Actor 的精灵实现是最常见和最简单的;它使用一组包裹在四边形网格(精灵)上的 纹理 ↗ 资产来表示角色的外观。纹理可以基于 .jpg、.png、.tiff、.psd 或任何其他 Unity 支持 ↗ 的图像文件格式。

提示

选择最适合您的开发工作流程的文件格式。构建项目时,Unity 会自动将所有源资源(纹理、音频、视频等)转换为最适合目标平台的格式,因此您最初在项目中存储资源的格式不会产生影响。有关 Unity 如何管理项目资产的更多信息,请参阅 官方文档 ↗。

场景中精灵角色网格的初始(未缩放)大小取决于参考分辨率(摄像机配置)、角色的 Pixels Per Unit 属性(在配置菜单中为每个角色 Actor 设置)和源纹理分辨率。

为了获得最佳渲染质量和最佳性能,通常建议对所有角色保持默认的 Pixels Per Unit 值(100),并通过纹理分辨率控制所需的初始角色大小。例如,假设游戏中的参考分辨率是默认的 1920x1080 像素,要使角色占据整个屏幕高度,请将角色纹理的高度设置为 1080 像素(例如,通过 Photoshop 或其他图像编辑器调整大小);要使另一个角色占据屏幕高度的 2/3,请将高度设置为 1080 * 2/3,依此类推。

切片精灵角色 ​

DicedSpriteCharacter 实现基于开源的 SpriteDicing ↗ 包构建,允许通过重用角色精灵的纹理区域来显著减小构建大小和纹理内存占用。

Sprite Dicingcover

请通过 Unity Package Manager ↗ 安装该包:打开 Package Manager 窗口(Window -> Package Manager),单击“+”按钮,选择“Add package from git URL”,将以下 URL:

https://github.com/elringus/sprite-dicing.git?path=/plugins/unity/Assets/SpriteDicing

— 输入到输入字段中,然后单击“Add”。

注意

在从 Git 存储库安装包之前,请确保您的机器上安装了 Git 客户端 ↗ 并且 Git 可执行文件路径已添加到 PATH 系统环境变量 ↗(通常会在安装过程中自动完成)。

通过 UPM 安装“SpriteDicing”扩展后,Naninovel.DicedSpriteCharacter 选项将出现在角色实现列表中。

cover

包含角色外观的 DicedSpriteAtlas 资产用作切片精灵角色的资源。每个外观都按名称映射到图集中包含的切片精灵。

提示

角色元数据属性(例如,每单位像素数、轴心)会应用到在场景中表示角色的渲染纹理上,而切片图集中的同类属性会应用到生成的切片精灵上。更改图集属性后,请记得重新构建图集,使更改生效。

以下视频指南涵盖了创建和配置切片精灵图集、基于创建的图集添加新的切片角色以及从剧本脚本控制角色。

cover

有关可用切片选项和使用示例的更多信息,请参阅 扩展文档 ↗。

示例

有关设置切片 Actor 的示例,请参阅 切片 Actor 示例。

Universal 角色 ​

当您希望角色不仅仅是简单的精灵时,首先值得考虑的便是 Universal 实现。它支持 Unity 提供的所有默认渲染器:网格、粒子、蒙皮精灵、瓦片地图等。此外,Universal Actor 的内容会受到光源和 Volume 的影响。

使用 Create -> Naninovel -> Character -> Universal 资产上下文菜单从模板创建新的 Universal 角色预制件,然后双击该预制件进入预制件编辑模式。您会在根对象上看到 Universal Character Behaviour 组件,它是 Naninovel 与预制件内容之间的适配器。

您可以像构建 Unity 中的任何其他预制件一样构建此预制件。Naninovel 会捕获预制件根对象下所有兼容的渲染器,并在运行时将它们合成到角色渲染纹理中。请注意组件上的 On Appearance Changed 事件;您可以使用它为外观更改设置回调。例如,可以使用 Unity 的 Animator ↗ 系统驱动角色动画。

如果要包含在 Universal Actor 中的对象使用自定义渲染功能(例如 2D 光源或程序化绘制),可以在组件中实现 Naninovel.IUniversalActorDrawable 接口,并将该组件附加到包含自定义内容的游戏对象上,从而使其兼容。例如,Live2D Actor 就是以这种方式实现的。

分层角色 ​

分层实现基于 Universal,并额外提供 Layered Actor Controller 组件,允许从多个层组合角色,然后在运行时通过剧本脚本单独或成组地切换它们。

要创建分层角色预制件,请使用 Create -> Naninovel -> Character -> Layered 资产上下文菜单。进入 预制件编辑模式 ↗ 以组合层。默认情况下将创建几个层和组。您可以使用它们,也可以删除并添加自己的层和组。

预制件根对象的子游戏对象中,带有 Layered Actor Layer 组件的对象被视为层,其他对象则被视为组。除了组织和变换用途外,将层放置在组内还允许您使用剧本脚本中的单个表达式选择单个层,或禁用或启用组内的所有层(稍后会详细介绍)。

当层游戏对象还具有 渲染器 ↗ 时,该渲染器会自动用于驱动层状态:层被禁用时,渲染器也会被禁用,反之亦然。要默认隐藏特定层,请禁用其渲染器组件(而不是游戏对象)。或者,可以使用 On Layer Enabled 和 On Layer Disabled 事件驱动层的启用状态。

提示

在 Photoshop 中制作分层角色美术素材时,请考虑使用 Unity 的 PSD Importer 包 ↗ 自动生成保留所有层及其位置的角色预制件。为了保留层的层次结构,请确保在导入设置中启用 Use Layer Grouping 选项。

要在剧本脚本中控制分层角色,请以与其他角色实现相同的方式使用 @char 命令。唯一的区别在于设置外观的方式:使用层组合表达式代替单个 ID。有三种表达式类型:

  • 启用组中的单个层:group>layer
  • 启用层:group+layer
  • 禁用层:group-layer

例如,考虑一个“Miho”角色,它有一个“Body”组,其中包含三个层:“Uniform”、“SportSuit”和“Pajama”。要启用“Uniform”层并禁用所有其他层,请使用以下命令:

nani
@char Miho.Body>Uniform

要启用或禁用层而不影响组中的任何其他层,请分别使用“+”和“-”代替“>”。您还可以指定多个组合表达式,用逗号分隔它们:

nani
; 启用眼镜,禁用帽子,选择“Cool”情绪。
@char CharId.Head/Accessories+BlackGlasses,Head-Hat,Head/Emotions>Cool

要选择任何组之外的层(预制件根对象的子对象),只需省略组部分,例如:

nani
; 假设“Halo”层对象放置在预制件根对象下,禁用它。
@char CharId.-Halo

也可以通过省略组合表达式中的层名称来影响组内的所有层(使用选择表达式时还会影响其相邻的组):

nani
; 禁用“Body/Decoration”组中的所有层。
@char CharId.Body/Decoration-

; 启用所有现有层。
@char CharId.+

; 假设有“Poses/Light”和“Poses/Dark”组,启用“Light”组内的
; 所有层并禁用“Dark”组内的层。
@char CharId.Poses/Light>

上述表达式不仅会影响目标组的直接子级,还会递归影响其下层各组中包含的所有层。

当未指定外观时(例如,在此前未设置任何外观的情况下使用 @char CharId),将使用默认外观;分层角色的默认外观就是分层预制件在编辑器中的样子。

可以通过 Layered Actor Controller 组件的 Composition Map 属性将组合表达式映射到键:

cover

— 然后可以使用这些键指定分层 Actor 的外观:

nani
; 等于“Body>Uniform,Hair/Back>Straight,Hair/Front>Straight,Shoes>Grey”。
@char Miho.Uniform
; 等于“Hair/Back>Straight,Hair/Front>Straight”。
@char Miho.StraightHair
; 也可以组合键和表达式。
@char Miho.Uniform,Hair/Front>Short

编辑分层角色预制件时,可以通过右键单击映射记录并选择“Preview Composition”来预览映射的组合表达式。另一个菜单项——“Paste Current Composition”——将生成角色的当前组合表达式字符串(基于层次结构中启用/禁用的精灵渲染器)并将其粘贴到所检查的记录中;可以用它快速将当前预制件状态映射到组合项。

cover

示例

有关设置分层 Actor 的示例,请参阅 分层 Actor 示例。

通用角色 ​

通用角色是最灵活的角色 Actor 实现。它使用根对象上附加了 Generic Character Behaviour 组件的预制件。外观更改和所有其他角色参数都会作为 Unity 事件 ↗ 转发,因此您可以按需自由实现底层对象的行为。

cover

注意

通用 Actor 实现只是转发来自剧本脚本的事件,底层行为需由用户自行实现,例如,Actor 应如何响应外观或可见性更改命令,是否以及如何支持说话者高亮功能等。不要指望大多数 Actor 相关功能能在通用实现中自动生效。

要从模板创建通用角色预制件,请使用 Create -> Naninovel -> Character -> Generic 资产上下文菜单。

请查看以下视频教程,了解如何将带骨骼绑定的 3D 模型设置为通用角色,并通过 Animator ↗ 组件将外观更改转发到骨骼动画。请注意,该视频是使用旧版 Naninovel 录制的,一些属性和组件名称现在已不同;有关最新信息,请参阅上述文档。

cover

提示

当游戏对象在同一帧中启用/禁用时,Unity 的 Animator 组件可能无法注册 SetTrigger;如果您使用 GameObject.SetActive 处理可见性更改(如上述教程所示),请考虑改为启用/禁用带有渲染器的子对象。

示例

请查看 通用 Actor 示例,其中使用通用角色实现来承载 3D 动画模型。

视频角色 ​

视频角色使用循环的 视频剪辑 ↗ 资产来表示外观。

有关每个平台支持的视频格式,请参阅 Unity 视频源文档 ↗。

使用带有 alpha 通道(透明度)的视频时,请参阅 支持格式指南 ↗。

为了防止特定外观循环,请在外观名称后追加 NoLoop(不区分大小写)。

Live2D 角色 ​

Live2D 角色实现使用通过 Live2D Cubism ↗ 2D 建模和动画软件创建的资产。

cover

为了能够使用此实现,您必须首先安装 Live2D Cubism SDK for Unity ↗。请参阅官方 Live2D 文档以获取安装和使用说明。

安装 Live2D SDK for Unity 后,单击 Naninovel -> Extensions -> Enable Live2D 编辑器菜单项以激活提供 Live2D 与引擎之间集成的 Naninovel 模块。

cover

注意

与这一第三方商业产品的集成,主要用于演示如何让 Naninovel 与其他工具配合使用。我们会努力维护示例集成与 Live2D 更新及更改的兼容性,但提供的功能将保持在最小范围。对于超出示例范围的其他产品与 Naninovel 的配合使用,我们无法提供支持或帮助。

Actor 的 Live2D 资源应在根对象上附加 Live2D Character Behaviour 组件。外观更改作为 SetTrigger ↗ 命令转发到动画器组件,外观即触发器名称。例如,如果您有一个“Kaori”Live2D 角色预制件并想调用名为“Surprise”的触发器,请使用以下命令:

nani
@char Kaori.Surprise

请注意,上述命令只会尝试在附加到预制件的动画器控制器上调用带有“Surprise”参数的 SetTrigger ↗;您必须自己搭建底层的 动画器 ↗ 状态机。

当 Live2D 模型预制件上存在并设置了 Live2D 的 Cubism Look Controller 和 Cubism Mouth Controller 组件时,Live2D Character Behaviour 可以选择使用它们来控制角色的朝向和嘴部动画(又名口型同步功能)。有关设置详情,请参阅关于 眼球追踪 ↗ 和 口型同步 ↗ 的 Live2D 文档。

以下视频指南涵盖了从 Cubism Editor 导出 Live2D 角色、配置预制件、创建简单的动画器状态机以及通过剧本脚本控制角色。

cover

示例

请查看 Live2D 示例,其中 Live2D 角色与 Naninovel 一起使用。

Spine 角色 ​

Spine 角色实现使用通过 Spine ↗ 2D 建模和动画软件创建的资产。

cover

为了能够使用此实现,您必须首先安装 4.3 或更高版本的 Spine runtime for Unity ↗。请参阅 官方文档 ↗ 以获取安装和使用说明。

安装 Spine runtime for Unity 后,单击 Naninovel -> Extensions -> Enable Spine 编辑器菜单项以激活提供 Spine 与引擎之间集成的 Naninovel 模块。

cover

注意

与这一第三方商业产品的集成,主要用于演示如何让 Naninovel 与其他工具配合使用。我们会努力维护示例集成与 Spine 更新及更改的兼容性,但提供的功能将保持在最小范围。对于超出示例范围的其他产品与 Naninovel 的配合使用,我们无法提供支持或帮助。

用作实现资源的 Spine 角色预制件应具有附加到根对象的 Spine Controller 组件。来自剧本脚本命令(例如 @char)的外观更改将转发到控制器的 On Appearance Changed 事件,类似于 通用实现。您可以随心所欲地处理事件;例如,使用 Spine 的 SetAnimation 方法或在 Unity 的动画器控制器中调用触发器。

cover

启用 Control Animation 时,外观会映射为在 Default Track 上循环播放的 Spine 动画。要在其他轨道上播放动画,请在外观名称后追加 @ 和轨道索引:

nani
@char Hero.Idle,Shoot@1

这会在默认轨道上播放 Idle,并在轨道 1 上播放 Shoot。随后应用 @char Hero.Idle 将保持 Idle 播放,并混出轨道 1。若要仅通过 On Appearance Changed 回调处理外观,请禁用 Control Animation。

提示

可以使用继承自 Spine Controller 的自定义组件。这样您就可以重写虚方法及相关行为(例如,以特定的持续时间或过渡参数处理外观更改)。

在内部,Spine 模型被渲染到纹理,然后投影到屏幕上。这是防止在淡入淡出角色时出现半透明过度绘制伪影所必需的。要指定纹理大小,请使用 Render Canvas 组件(添加 Spine Controller 时自动附加)。在预制件模式下启用 Gizmos ↗ 以预览当前大小。请注意,尺寸越大,纹理消耗的内存就越多,因此请使其尽可能小。

注意

不支持 Spine 的 Skeleton Render Separator ↗(多重渲染)工作流程;要将该工作流程与 Naninovel 集成,请创建自定义角色实现。

示例

请查看 Spine 示例,其中 Spine 角色与 Naninovel 一起使用。

旁白角色 ​

旁白角色在场景中没有任何呈现(外观、位置、朝向、色调等),但仍可以作为打印消息的作者,并具有相关的配置选项(显示名称、消息颜色、链接的打印机等)。

cover

渲染到纹理 ​

可以将所有实现(通用除外)的角色和背景 Actor 渲染到纹理资产,然后可以将其分配给自定义 UI、打印机、材质或任何其他兼容源。

通过 Actor 配置中的 Render Texture 属性分配渲染纹理资产。分配纹理后,Actor 将不会作为游戏对象出现在场景中,而是会渲染到纹理。Render Rectangle 属性允许指定要渲染到纹理中的 Actor 区域。

cover

注意

使用 Addressables 包 ↗ 时,Unity 无法正确跟踪资产引用 ↗,这可能会导致构建中渲染纹理重复,从而使该功能无法正常工作。请手动处理引用(通过 AssetReference API),或如下图所示使用 Get Actor Render Texture 组件。

cover

当 Actor 渲染到纹理时,变换(位置、旋转、缩放)和其他一些修改将没有任何效果。此时应改为变换渲染纹理的宿主对象(例如,如果纹理分配给了 UI 原始图像组件,则变换该图像)。

下面的视频演示了如何将 Live2D 角色渲染到纹理,再将该纹理分配给自定义文本打印机。打印机与角色链接后,在处理关联的文本消息时,角色会随打印机自动显示和隐藏。

cover

所有其他角色和背景实现类型(通用除外)都可以按照与 Live2D 示例类似的方式设置为渲染到纹理。

多种外观 ​

通用、Live2D 和 Spine Actor 支持同时应用多种外观,例如:

nani
@char Kohaku.Body/Pose1,Face/Smile

— 将调用 Body/Pose1 和 Face/Smile 外观更改事件。使用此功能同时触发多个动画器触发器以设置复杂的动画状态。所有外观也将与 Actor 状态一起序列化,并在游戏加载或回滚时恢复。

cover