Skip to content

公共 API 参考

运行时版本为 Live2DApi.RuntimeVersion == "0.6.1",能力版本为 Live2DApi.RuntimeApiVersion == 9。 只有 Live2D.Api 命名空间属于稳定第三方 API;Live2D.Scripts.* 与 gd_cubism 类型是实现细节。

线程规则

API调用线程
PostInvokeAsync任意线程
GetModelsGetModelTryGetModel任意线程
句柄身份、ActionsIsAvailable、异步等待任意线程
QueueUpdate、Parameter/Part Queue API任意线程
Pack 导入、注册、注销和提供方 Hook 注册Godot 主线程
SnapshotApplySet*、播放、动态值读取Godot 主线程

所有 API 事件都在 Godot 主线程触发。异步等待完成后的 continuation 不保证仍在主线程。

Live2DApi

运行时状态

成员说明
RuntimeApiVersion当前 API 能力版本
RuntimeVersion当前 Live2D Mod 版本
PackageFileExtension唯一支持的资源包后缀:.live2dpack
IsDispatcherReady主线程调度器是否就绪
IsMainThread当前代码是否位于记录的 Godot 主线程
RegisterProviderHook(ownerModId, hook)注册提供方四阶段生命周期 Hook,并回放已有状态

查询模型

  • GetModels():返回会话中全部稳定句柄的数组快照。
  • GetModels(ownerModId):按所有者过滤。
  • GetModel(modelId, scene):找不到时返回 null。
  • TryGetModel(...):无异常查询。

调度

  • Post(Action):不等待;异常写入日志。
  • InvokeAsync(Action, CancellationToken):返回完成、异常或取消状态。
  • InvokeAsync<T>(Func<T>, CancellationToken):在主线程计算并返回值。

调度器暂停时仍处理队列,每帧最多执行 512 个工作项。

Pack

  • ImportPack(path/data):持久导入玩家模型库,返回导入和重复跳过数量。
  • RegisterPack(ownerModId, path/data):将提供方拥有的只读资源注册进 Live2D 统一模型库,由 Live2D 管理设置和实例。
  • RegisterProviderHook(ownerModId, hook):注册角色专属行为入口,不转移模型配置或实例所有权。
  • 路径支持操作系统路径、res://user://;数据重载接受 ReadOnlyMemory<byte>

所有路径式导入和注册都要求 .live2dpack 后缀;其他后缀即使内容是 ZIP 也会拒绝。

res://user:// 与内存数据会先复制到操作系统临时文件,导入或注册结束后无论成功失败都会删除。 注册需要保留的资源会复制到会话缓存,不依赖该临时文件继续存在。Managed Pack 只持久保存用户配置,不复制提供方资源。

ILive2DPackHandle

成员说明
OwnerModId注册方 Mod ID
PackIdmanifest 的稳定 PackageId
NamePack 显示名称
IsRegistered是否仍处于注册状态
Models模型元数据与动作列表
Unregister注销提供方资源并保留玩家配置

标识符最多 128 个字符,不能包含控制字符。

ILive2DProviderLifecycleHook

阶段时机与用途
OnPackRegisteredPack 已登记、模型刷新前;读取资源元数据
OnModelAvailable场景模型已绑定;可以安全播放角色专属动作
OnModelUnavailable场景模型已解绑;取消尚未执行的异步行为
OnPackUnregistered提供方资源已从当前会话移除

Hook 按 ownerModId 隔离,回调在 Godot 主线程运行,单个 Hook 抛出的异常会记录到 Live2D 日志,不会中断其他 Hook。 晚注册时先回放已有 Pack,再回放当前可用模型。返回的 IDisposable 必须由提供方长期保存。

ILive2DModelHandle

身份与状态

ModelIdOwnerModIdPackIdModelKeyInstanceIdScene 描述稳定身份。 IsAvailable 表示底层场景实例是否存在。

场景切换或节点重建不会使句柄失效。不可用期间仍可读取身份与 ActionsSnapshot 必须在主线程读取, 此时返回最后一次已知状态。

  • BecameAvailable / BecameUnavailable:持续监听绑定变化。
  • WaitUntilAvailableAsync / WaitUntilUnavailableAsync:无订阅竞态的可取消等待。
  • Snapshot:当前变换、显示、播放和渲染快照。

状态更新

Apply(update) 应用部分更新;Update(configure) 创建更新并调用配置委托;两者都要求主线程。 QueueUpdate 可从任意线程提交并按字段合并。configure 委托在调用线程立即执行,因此只应填写更新数据,不应访问 Godot 节点。

Live2DModelUpdate 字段校验与行为
Position两个分量必须有限
Scale分量有限且非 0;负值可翻转
RotationDegrees必须有限
Opacity限制到 0..1
Visible根节点可见性
LayerGodot ZIndex
PlaybackSpeed负值按 0 处理
PhysicsEnabled / PoseEnabledCubism 物理和 Pose
MaskViewportSize0/负值使用有界自动值 1024;正值最高 2048
BlendMode必须是已定义枚举值
Filter整模型颜色滤镜
Mask模型局部坐标裁切

对应便捷方法包括 SetPositionSetScaleSetUniformScaleSetRotationSetOpacitySetVisibleSetLayer、播放设置和所有渲染设置。

播放

  • Actions:模型声明的 Motion/Expression,只读。
  • PlayAction / PlayMotion / StopMotion
  • SetExpression / ClearExpression
  • MotionFinished / MotionEvent

Snapshot.Playback 描述当前命令状态。

Parameter 与 Part

  • GetParameters / TryGetParameter / SetParameter(s) / QueueParameter(s)
  • GetParts / TryGetPart / SetPartOpacity/Opacities / 对应 Queue API。

未知 ID 抛出 KeyNotFoundException。批量同步写入先验证全部 ID。队列按不区分大小写的 ID 合并。

渲染范围

滤镜字段范围 / 默认值
TintRGBA 有限;白色
Brightness-1..1;0
Contrast0..4;1
Saturation0..4;1
Grayscale0..1;0
HueShiftDegrees任意有限角度;0
Invert0..1;0
Gamma0.01..10;1

蒙版类型为 NoneRectangleEllipseRoundedRectangle。启用时 Rect 宽高必须为正,CornerRadius >= 0。 实际裁切的椭圆和圆角边缘由合成着色器连续计算;SegmentsPerCorner 仅控制预览轮廓采样密度,不改变渲染边缘。

常见异常

异常常见原因
ArgumentException空白、过长或含控制字符的 ID
ArgumentOutOfRangeException非有限数值、非法范围或枚举
InvalidOperationException错误线程、未就绪、不可用、身份冲突或已注销
KeyNotFoundExceptionParameter/Part 不存在
InvalidDataException / IOExceptionPack 格式或文件访问失败
OperationCanceledException等待或调度被取消

需要观察后台异常时使用 InvokeAsyncPost 和 queued 状态流只记录执行期异常。

Last updated: