@seayoo-web/pixi-live2d 0.1.0 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,10 +4,10 @@
4
4
 
5
5
  ## 特性
6
6
 
7
- - **零 Vue 依赖**:纯 TypeScript 实现,可用于任何框架(React, Vue, Vanilla JS)。
8
- - **自动缩放**:内置适配 1920x1080 设计稿的响应式缩放逻辑。
9
- - **简单易用**:只需传入 Canvas 元素和模型路径即可。
10
- - **交互支持**:内置点击交互与动作播放方法。
7
+ - **零框架依赖**:纯 TypeScript 实现,可用于任何框架(ReactVueVanilla JS)。
8
+ - **多实例**:每个 `Live2DViewer` 持有独立的 PIXI 应用与 WebGL context,可在页面多处同时渲染、互不干扰。
9
+ - **响应式缩放**:按 canvas 容器尺寸适配设计稿(默认 1920×1080),并可选监听窗口 resize 自动调整。
10
+ - **交互支持**:内置点击播放动作、指针跟随等交互。
11
11
 
12
12
  ## 安装
13
13
 
@@ -15,92 +15,106 @@
15
15
  pnpm add @seayoo-web/pixi-live2d
16
16
  ```
17
17
 
18
- ## 在你的项目中使用:
18
+ ## 使用
19
19
 
20
20
  ### 基础用法
21
21
 
22
22
  ```typescript
23
23
  import { Live2DViewer } from "@seayoo-web/pixi-live2d";
24
24
 
25
- // 方式 1: 传入 Canvas ID
26
- const viewer1 = new Live2DViewer("live2d-canvas", {
25
+ // 方式 1:传入 canvas 元素的 id
26
+ const viewer = new Live2DViewer("live2d-canvas", {
27
27
  modelPath: "https://cdn.example.com/live2d/model.json",
28
28
  });
29
29
 
30
- // 方式 2: 传入 HTMLCanvasElement 并配置初始参数
31
- const canvasElement = document.getElementById("my-canvas") as HTMLCanvasElement;
32
- const viewer2 = new Live2DViewer(canvasElement, {
30
+ // 方式 2:传入 HTMLCanvasElement 并配置初始参数
31
+ const canvas = document.getElementById("my-canvas") as HTMLCanvasElement;
32
+ const viewer2 = new Live2DViewer(canvas, {
33
33
  modelPath: "https://cdn.example.com/live2d/model.json",
34
-
35
- // 初始位置和缩放
36
34
  x: 0,
37
35
  y: 0,
38
36
  scale: 0.2, // 模型缩放比例
39
-
40
- // 设计稿尺寸 (用于自动计算适配比例)
41
- designWidth: 1920,
37
+ designWidth: 1920, // 设计稿尺寸(用于自动计算适配比例)
42
38
  designHeight: 1080,
43
-
44
39
  autoResize: true,
45
-
46
- onModelLoaded: (model) => {
47
- console.log("模型加载成功:", model);
48
- },
49
- onModelError: (error) => {
50
- console.error("模型加载失败:", error);
51
- },
40
+ onModelLoaded: (model) => console.log("模型加载成功:", model),
41
+ onModelError: (error) => console.error("模型加载失败:", error),
52
42
  });
53
43
  ```
54
44
 
55
- ### API 说明
45
+ ### 多实例
56
46
 
57
- #### `new Live2DViewer(canvas, options)`
47
+ 每个实例使用各自的 canvas,可同时存在于页面不同位置、互不干扰:
58
48
 
59
- - `canvas`: `HTMLCanvasElement | string` - 用于渲染的 Canvas 元素或其 ID
60
- - `options`: `Live2DViewerOptions` - 配置项
49
+ ```typescript
50
+ const left = new Live2DViewer("canvas-left", { modelPath: "/a/model.json", scale: 0.2 });
51
+ const right = new Live2DViewer("canvas-right", { modelPath: "/b/model.json", scale: 0.2 });
61
52
 
62
- | 属性 | 类型 | 默认值 | 说明 |
63
- |Data Type|Type|Default|Description|
64
- |---|---|---|---|
65
- | `modelPath` | `string` | (必填) | Live2D 模型配置文件 (.json) 的路径 |
66
- | `scale` | `number` | - | 初始缩放比例 |
67
- | `x` | `number` | 0 | 初始 X 轴偏移 |
68
- | `y` | `number` | 0 | 初始 Y 轴偏移 |
69
- | `designWidth` | `number` | 1920 | 设计稿宽度(用于适配计算) |
70
- | `designHeight` | `number` | 1080 | 设计稿高度(用于适配计算) |
71
- | `autoResize` | `boolean` | `true` | 是否监听窗口 resize 事件并自动调整模型大小 |
72
- | `onModelLoaded` | `(model) => void` | - | 模型加载完成后的回调函数 |
73
- | `onModelError` | `(error) => void` | - | 模型加载失败的回调函数 |
74
-
75
- #### 实例方法
76
-
77
- - **`startMotion(group: string, no: number)`**
78
- 播放指定分组的动作。
53
+ // 卸载时分别销毁,各自释放 WebGL context
54
+ left.destroy();
55
+ right.destroy();
56
+ ```
79
57
 
80
- ```typescript
81
- viewer.startMotion("TapBody", 0);
82
- ```
58
+ > 浏览器对同页 WebGL context 数量有上限(通常约 16 个),请按需创建并在不用时调用 `destroy()`。
83
59
 
84
- - **`setScale(scale: number)`**
85
- 设置模型的缩放比例(基于自动计算的基础比例)。
60
+ ### 自定义 Cubism Core 地址
86
61
 
87
- ```typescript
88
- viewer.setScale(0.2);
89
- ```
62
+ 库默认从内置 CDN 加载 Live2D Cubism Core。可通过 `cubismCoreUrl` 覆盖,或在创建实例前手动预加载:
63
+
64
+ ```typescript
65
+ // 预加载(可选),多次调用会自动去重
66
+ await Live2DViewer.loadCubismCore("https://your-cdn.com/live2dcubismcore.js");
67
+
68
+ const viewer = new Live2DViewer("canvas", {
69
+ modelPath: "/model.json",
70
+ cubismCoreUrl: "https://your-cdn.com/live2dcubismcore.js",
71
+ });
72
+ ```
90
73
 
91
- - **`resize()`**
92
- 手动触发一次重新计算布局(通常在容器大小变化但窗口大小未变时使用)。
74
+ ## API
93
75
 
94
- ```typescript
95
- viewer.resize();
96
- ```
76
+ ### `new Live2DViewer(canvas, options)`
77
+
78
+ - `canvas`: `HTMLCanvasElement | string` —— 用于渲染的 canvas 元素或其 id
79
+ - `options`: `Live2DViewerOptions` —— 配置项
80
+
81
+ | 属性 | 类型 | 默认值 | 说明 |
82
+ | --- | --- | --- | --- |
83
+ | `modelPath` | `string` | (必填) | Live2D 模型配置文件 (.json) 的路径 |
84
+ | `scale` | `number` | `1` | 模型初始缩放比例 |
85
+ | `x` | `number` | `0` | 初始 X 轴偏移 |
86
+ | `y` | `number` | `0` | 初始 Y 轴偏移 |
87
+ | `designWidth` | `number` | `1920` | 设计稿宽度(用于适配计算) |
88
+ | `designHeight` | `number` | `1080` | 设计稿高度(用于适配计算) |
89
+ | `autoResize` | `boolean` | `true` | 是否监听窗口 resize 自动调整模型大小 |
90
+ | `interactive` | `boolean` | `true` | 是否响应指针移动进行跟随;设为 `false` 会同时禁用模型自然晃动 |
91
+ | `enableTapBody` | `boolean` | `true` | 是否在点击时触发 `TapBody` 动作 |
92
+ | `cubismCoreUrl` | `string` | 内置 CDN | Cubism Core 库的加载地址 |
93
+ | `onModelLoaded` | `(model) => void` | - | 模型加载完成后的回调 |
94
+ | `onModelError` | `(error: Error) => void` | - | 模型加载失败的回调 |
95
+
96
+ ### 实例方法
97
+
98
+ - **`startMotion(group, no, priority?, startTime?)`** —— 播放指定分组的动作。`priority` 默认 `1`;`startTime`(秒)默认 `0`,大于 0 时从该时间点开始播放。返回 `Promise<boolean>`。
97
99
 
98
- - **`destroy()`**
99
- 销毁实例,清理 PIXI 应用及事件监听。
100
100
  ```typescript
101
- viewer.destroy();
101
+ await viewer.startMotion("TapBody", 0);
102
102
  ```
103
103
 
104
+ - **`expression(name)`** —— 播放指定表情(名称或索引)。
105
+ - **`waitForMotionFinish()`** —— 返回 `Promise<boolean>`,当前动作播放结束后 resolve;无模型时立即 resolve `false`。
106
+ - **`setScale(scale)`** —— 设置模型缩放比例并刷新布局。
107
+ - **`setXY(x, y)`** —— 设置模型偏移并刷新布局。
108
+ - **`resize()`** —— 手动按当前 canvas 尺寸重新计算布局(容器尺寸变化但窗口未变时使用)。
109
+ - **`lockHeadAngle()`** —— 禁用模型的自然晃动(呼吸、身体/头部摇摆等)。注意:尽管命名含 head,实际会关闭**全部**自然动作。
110
+ - **`destroy()`** —— 销毁实例:移除监听、销毁模型,并释放该实例的 PIXI 应用与 WebGL context(不会移除你传入的 canvas)。销毁后该实例不可复用。
111
+
112
+ ### 静态方法
113
+
114
+ - **`Live2DViewer.loadCubismCore(url?)`** —— 预加载 Cubism Core 库,全局按需去重、只真正加载一次;加载失败会抛出明确错误。
115
+
104
116
  ## 注意事项
105
117
 
106
- 本库依赖 `pixi.js` v6 版本(与 `pixi-live2d-display` 兼容),请确保项目中未安装冲突的 PIXI 版本。
118
+ - 本库依赖 `pixi.js` v6(与 `pixi-live2d-display` 兼容),请确保项目中未安装冲突的 PIXI 版本。
119
+ - 模型适配以 **canvas 的显示尺寸** 为基准,请通过 CSS 给 canvas 设定期望的宽高。
120
+ - `interactive: false` 在禁用指针跟随的同时会关闭模型的自然晃动(等同调用 `lockHeadAngle()`)。