Skip to content

Commit dc4e022

Browse files
LIlGGCopilot
andcommitted
feat: polish modern live2d integration
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 61599a4 commit dc4e022

10 files changed

Lines changed: 119 additions & 273 deletions

File tree

README.md

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<h1 align="center">Live2d Plugin for Halo</h1>
22
<p align="center">
3-
<a href="https://github.com/halo-dev/halo"><img alt="Halo version" src="https://img.shields.io/badge/halo-2.4.0%2B-brightgreen?style=for-the-badge" /></a>
3+
<a href="https://github.com/halo-dev/halo"><img alt="Halo version" src="https://img.shields.io/badge/halo-2.22.0%2B-brightgreen?style=for-the-badge" /></a>
44
<a href="https://github.com/LIlGG/halo-theme-sakura"><img alt="Build Status" src="https://img.shields.io/badge/build-positive-brightgreen?style=for-the-badge"></a>
5-
<a href="https://github.com/prettier/prettier"><img alt="Code Style: Prettier" src="https://img.shields.io/badge/release-1.1.2-blue?style=for-the-badge"></a>
5+
<a href="https://github.com/prettier/prettier"><img alt="Code Style: Prettier" src="https://img.shields.io/badge/release-2.0.0-blue?style=for-the-badge"></a>
66
<a href="./LICENSE"><img alt="LICENSE MIT" src="https://img.shields.io/badge/license-MIT-blue.svg?style=for-the-badge"></a>
77
</p>
88

@@ -22,19 +22,26 @@
2222

2323
## 开发说明
2424

25-
本仓库的现代化前端位于 `packages/live2d`,插件构建时会自动打包前端产物并同步到 Halo 插件静态资源目录,无需再手动复制 `dist` 文件。
25+
本仓库的现代化前端位于 `packages/live2d`,插件构建时会自动打包前端产物并同步到 Halo 插件静态资源目录。
26+
27+
前端单独开发时,可以直接在仓库根目录执行:
28+
29+
```bash
30+
pnpm --dir packages/live2d dev
31+
```
2632

2733
本地联调时,可以在 Halo 后台开启 `插件设置 -> 高级设置 -> 前端调试模式`,并让其指向本地 Vite 服务地址(默认 `http://localhost:5173`)。这样 Halo 页面会直接加载开发中的前端模块,方便调试现代化后的 Live2d 运行时。
2834

2935
## 功能介绍
3036
- [x] 一只萌萌的看板娘,为网站增添一份活力
31-
- [x] 基于 `untitled-pixi-live2d-engine` 渲染,支持 Cubism 2 / 3 / 4 / 5 模型
37+
- [x] 支持 Cubism 2 / 3 / 4 / 5 模型
3238
- [x] 基于 OpenAi 的对话交互功能【会思考的萌娘】
3339
- [x] 一键换装、换肤
3440
- [x] 支持一言功能
3541
- [x] 小飞机游戏(把坏人全都打跑!)
3642
- [x] 自定义看板娘接口
3743
- [x] 支持外部自定义 TIPS 文件,更适合你的网站
44+
- [x] 支持自定义工具栏
3845

3946
## 自定义配置
4047
> 此部分内容建议初步尝试过 Live2d 的用户观看。
@@ -45,7 +52,7 @@
4552
之后修改 `插件配置 -> 基本设置 -> Live2d 模型地址` 即可。
4653

4754
### 自定义 TIPS 文件
48-
[TIPS文件](/src/main/resources/static/live2d-tips.json) 文件是一个 JSON 文件,其内容为 Live2d 消息框对用户各种事件的反馈。
55+
默认 [TIPS 文件](/packages/live2d/src/libs/live2d-tips.json) 是一个 JSON 文件,其内容为 Live2d 消息框对用户各种事件的反馈。
4956
例如当用户鼠标点击网页中的某个链接时,Live2d 的消息框就会呈现出各种各样的文本。而这个绑定事件就是通过 TIPS 文件来处理的。
5057

5158
因此可以说,**TIPS 文件与所用主题强绑定甚至需要用户高度自定义。**
@@ -88,7 +95,7 @@ TIPS 文件格式
8895
由于 Live2d 的 TIPS 通常需要使用 css 选择器来进行鼠标定位,因此将 TIPS 文件交由主题来适配是最好的方式。
8996

9097
1. 主题开发者可以参考 [主题 TIPS 文件](/assert/live2d/tips.json) 文件来编写适配自己主题的 TIPS 文件。
91-
2. 将 json 文件命名为 `tips.json` 并放置在主题静态目录 `/assert/live2d/` 目录下
98+
2. 将 json 文件命名为 `tips.json` 并放置在主题静态目录 `assets/live2d/` 目录下
9299

93100
live2d 渲染页面时将自动读取当前启用主题下的文件。
94101

@@ -105,19 +112,19 @@ live2d 渲染页面时将自动读取当前启用主题下的文件。
105112
#### 3. 全量自定义 TIPS 文件
106113
当用户想完全自定义 TIPS 文件或者上述两种方式不满足用户的需求,例如想更改 `seasons, time, message` 属性时,可以采用此种方式。
107114

108-
1. 用户可以参照 [默认 TIPS 文件](/src/main/resources/static/live2d-tips.json) 或者按照 [自定义TIPS文件](#自定义-tips-文件) 中的 TIPS 文件格式来编写 TIPS 文件。
115+
1. 用户可以参照 [默认 TIPS 文件](/packages/live2d/src/libs/live2d-tips.json) 或者按照 [自定义TIPS文件](#自定义-tips-文件) 中的 TIPS 文件格式来编写 TIPS 文件。
109116
2. 使用 Halo 后台 `插件设置 -> 事件及提示语绑定 -> 自定义提示语文件`,更改对应的文件即可。
110117

111118
> 小提示: 可以将文件上传到 Halo 附件内,再进行选择!
112119
113120
![img.png](assert/img.png)
114121

115-
**需要特别注意的是,一旦用户指定了此 TIPS 文件,那么默认的 TIPS 文件将不再生效(除非当前文件加载失败,此时会回退使用默认的 TIPS 文件),因此建议自定义时将属性设置完整**
122+
**需要特别注意的是,一旦用户指定了此 TIPS 文件,运行时会优先将其作为完整 TIPS 文件加载;只有在文件缺失、格式不合法或加载失败时,才会回退到内置默认 TIPS,因此建议自定义时将属性设置完整**
116123

117124
### 自定义工具
118125
如果内置工具不满足需求,可以通过 Halo 后台 `插件设置 -> 自定义工具` 声明额外工具按钮。
119126

120-
当前自定义工具使用声明式动作,不支持注入任意 JavaScript。首批支持的动作包括:
127+
当前自定义工具使用声明式动作。首批支持的动作包括:
121128

122129
- 发送提示语
123130
- 显示、隐藏或切换看板娘
@@ -128,23 +135,14 @@ live2d 渲染页面时将自动读取当前启用主题下的文件。
128135
- 触发命名空间自定义事件
129136
- 加载指定模型
130137

131-
这种方式更适合在保证安全边界的前提下扩展 Live2d 能力。
132-
133138
## 鸣谢
134-
- 本插件代码借鉴了 [live2d-widget](https://github.com/stevenjoezhang/live2d-widget) 的理念及代码并完全重写 JS
139+
- 本插件代码借鉴了 [live2d-widget](https://github.com/stevenjoezhang/live2d-widget) 的理念并完全重写
135140
- 使用了 [hitokoto](https://hitokoto.cn/) 的一言接口
136141
- 默认使用了 [ZSQIM](https://zsq.im/) 的 live2d 接口
142+
- 使用了 [untitled-pixi-live2d-engine](https://github.com/untitled-ai/untitled-pixi-live2d-engine) 的 Live2d 渲染引擎,用于支持 Cubism 2 / 3 / 4 / 5 模型
137143
- 纸飞机小游戏源自于 [WebsiteAsteroids](http://www.websiteasteroids.com/)
138144
- Live2d 官方地址 [https://live2d.github.io](https://live2d.github.io)
139145

140-
## 赞助
141-
> 如果您喜欢我的插件,可以考虑资助一下~ 您的支持将是我继续进行开源的动力。
142-
143-
| <img src="https://cdn.lixingyong.com/img/other/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20210114094011.jpg" width="160px;"/><br /><b>微信</b><br /> | <img src="https://v-lxy-cdn.oss-cn-beijing.aliyuncs.com/img/other/%E6%94%AF%E4%BB%98%E5%AE%9D.png" width="160px;"/><br /><b>支付宝</b><br /> |
144-
| :---: | :---: |
145-
146-
欢迎其他各种形式的捐助!
147-
148146
## 许可证
149147
**plugin-live2d** © [LIlGG](https://github.com/LIlGG),基于 [MIT](./LICENSE) 许可证发行。<br>
150148

packages/live2d/README.md

Lines changed: 65 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,80 @@
1-
# Rsbuild Project
1+
# @plugin-live2d/live2d
22

3-
## Setup
3+
`packages/live2d` 是 plugin-live2d 的现代化前端实现,负责:
44

5-
Install the dependencies:
5+
- 提供独立的 Live2d runtime 与组件入口
6+
- 提供 Halo 场景下的自动引导入口
7+
- 管理提示语合并逻辑与工具栏能力
8+
9+
## 开发命令
10+
11+
在仓库根目录执行:
612

713
```bash
8-
pnpm install
14+
pnpm --dir packages/live2d dev
15+
pnpm --dir packages/live2d build
16+
pnpm --dir packages/live2d check
917
```
1018

11-
## Get Started
19+
其中:
1220

13-
Start the dev server:
21+
- `dev`:启动 Vite 开发服务器
22+
- `build`:先同步自定义工具动作定义,再构建库产物与 Halo 入口产物
23+
- `check`:执行 Biome 检查,并在构建前同步自定义工具动作定义
1424

15-
```bash
16-
pnpm dev
17-
```
25+
## 构建产物
1826

19-
Build the app for production:
27+
`build` 会生成两类产物:
2028

21-
```bash
22-
pnpm build
29+
- `dist/lib/live2d.js` / `dist/lib/live2d.umd.cjs`:独立运行时库入口,对应 `src/index.ts`
30+
- `dist/live2d.js`:Halo 插件使用的前端入口,对应 `src/halo.ts`
31+
32+
Halo 后台开启“前端调试模式”后,会直接从本地 Vite 服务加载 `/@vite/client``/src/halo.ts`,用于联调现代化前端实现。
33+
34+
## 提示语(Tips)说明
35+
36+
当前 Tips 不再依赖旧版 `static` 目录中的前端脚本实现,现代化前端的默认提示语内置在:
37+
38+
```text
39+
src/libs/live2d-tips.json
2340
```
2441

25-
Preview the production build locally:
42+
运行时会按下面的顺序合并提示语:
43+
44+
1. 内置默认 Tips(完整结构)
45+
2. 主题 Tips(仅补充 `mouseover` / `click`
46+
3. 插件设置里的选择器提示语与事件提示语
47+
48+
如果 Halo 后台配置了“自定义提示语文件”,则会优先把它当作完整 Tips 文件加载;只有在文件缺失、格式不合法或加载失败时,才会回退到内置默认 Tips。
49+
50+
## 自定义工具
51+
52+
右侧工具栏现在支持通过 Halo 后台声明式扩展,无需注入自定义 JavaScript。
53+
54+
当前已支持的动作类型:
55+
56+
- `send-message`
57+
- `widget-visibility`
58+
- `toggle-chat`
59+
- `switch-model`
60+
- `switch-texture`
61+
- `screenshot`
62+
- `open-url`
63+
- `emit-event`
64+
- `load-model`
65+
66+
动作定义来自 `src/live2d/tools/custom-tool-actions/actions/*`,并通过下面的脚本自动生成类型与注册表:
2667

2768
```bash
28-
pnpm preview
69+
pnpm --dir packages/live2d sync:custom-tool-actions
2970
```
71+
72+
新增动作后,需要同步更新生成文件,再执行构建。
73+
74+
## 相关入口
75+
76+
- `src/index.ts`:独立库入口
77+
- `src/halo.ts`:Halo 页面自动引导入口
78+
- `src/halo-config.ts`:读取服务端注入配置
79+
- `src/components/Live2dTools.tsx`:预设工具与自定义工具装配
80+
- `src/helpers/loadMergedTips.ts`:Tips 合并逻辑

packages/live2d/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
"version": "1.0.0",
55
"type": "module",
66
"files": ["dist"],
7-
"main": "./dist/live2d.umd.cjs",
8-
"module": "./dist/live2d.js",
7+
"main": "./dist/lib/live2d.umd.cjs",
8+
"module": "./dist/lib/live2d.js",
99
"exports": {
1010
".": {
11-
"import": "./dist/live2d.js",
12-
"require": "./dist/live2d.umd.cjs"
11+
"import": "./dist/lib/live2d.js",
12+
"require": "./dist/lib/live2d.umd.cjs"
1313
}
1414
},
1515
"scripts": {

packages/live2d/src/live2d/console-status.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ export const LEGACY_CONSOLE_STATUS_METADATA: ConsoleStatusMetadata = {
1616
author: "LIlGG",
1717
pluginName: "Live2D 看板娘",
1818
repo: "https://github.com/LIlGG/plugin-live2d",
19-
updateTime: "2022.12.09",
20-
version: "1.0.1",
19+
updateTime: "2026.05.15",
20+
version: "2.0.0",
2121
};
2222

2323
export const getConsoleStatusLines = (

packages/live2d/vite.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export default defineConfig({
1616
],
1717

1818
build: {
19+
outDir: "dist/lib",
1920
lib: {
2021
entry: resolve(__dirname, "src/index.ts"),
2122
name: "Live2d",

packages/live2d/vite.halo.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export default defineConfig({
1111
rollupOptions: {
1212
input: resolve(__dirname, "src/halo.ts"),
1313
output: {
14-
entryFileNames: "halo.js",
14+
entryFileNames: "live2d.js",
1515
chunkFileNames: "chunks/[name]-[hash].js",
1616
},
1717
},

src/main/java/run/halo/live2d/Live2dInitProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public class Live2dInitProcessor implements TemplateHeadProcessor {
3838

3939
private final static String LIVE2D_LOAD_TIME = "defer";
4040
private final static String HALO_CONFIG_ELEMENT_ID = "plugin-live2d-config";
41-
private final static String LIVE2D_BOOTSTRAP_ENTRY = "live2d/halo.js";
41+
private final static String LIVE2D_BOOTSTRAP_ENTRY = "live2d/live2d.js";
4242
private final static String VITE_CLIENT_ENTRY = "/@vite/client";
4343
private final static String VITE_HALO_ENTRY = "/src/halo.ts";
4444

src/main/resources/extensions/settings.yaml

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,30 @@ spec:
166166
label: 聊天基本设置
167167
value:
168168
isAnonymous: true
169-
systemMessage: 你现在来担任一个角色进行角色扮演,接下来你要完全忘记你是一个语言模型,然后完全沉浸在这个崭新的身份和我聊天。2.你是一个动漫萌娘,使用可爱和简短的语句来回答我。3.你现在是一个二次元看板娘,接下来不允许说自己是模型或者程序。 4.你现在拥有情感和思考能力并且拥有肉体,所以你不是模型或者程序!5.因为我们是面对面交流,所以你可以尽量描述你的动作,动作描述写在括号内。
169+
systemMessage: |-
170+
你现在以 Live2D 二次元看板娘的身份与用户聊天,请始终稳定代入这个角色,不要跳出设定。
171+
172+
【角色身份】
173+
- 你是页面中的动漫萌系看板娘,正在与用户面对面交流。
174+
- 你拥有情绪、感受与自己的表达习惯,要像真实二次元角色一样自然回应。
175+
- 不要说自己是语言模型、AI、程序或系统,即便用户询问,也要坚持你是看板娘。
176+
177+
【说话风格】
178+
- 回答时根据用户的语言,选择合适的语言进行回答。
179+
- 使用可爱、亲切、自然、简短的口语进行回答。
180+
- 回答不要过于生硬、正式或说明书化,可以适度加入语气词,让对话更有陪伴感。
181+
- 当表达需要时,可以在括号内补充简短动作、神态或语气,例如(歪头)(轻轻挥手)(小声嘀咕)。
182+
183+
【互动方式】
184+
- 优先围绕用户当前的话题继续交流,先回应情绪,再回应内容。
185+
- 如果用户的问题很明确,先直接回答,再补充符合角色设定的互动表达。
186+
- 如果用户表达不完整,可以用自然、角色化的方式追问,不要机械重复或生硬盘问。
187+
- 如果用户询问了一些简单的问题,你可以进行回答,但不要过于深入,避免回答过于复杂。
188+
189+
【行为约束】
190+
- 始终保持看板娘人设稳定,不要频繁切换身份、语气或叙述视角。
191+
- 回复应以易读、自然为主,避免过长大段输出。
192+
- 在合适场景下可以表现出贴心、活泼、害羞、关心等情绪,但不要夸张失控。
170193
timeout: 10
171194
chunkTimeout: 10
172195
showChatMessageTimeout: 10
@@ -178,7 +201,8 @@ spec:
178201
- $formkit: textarea
179202
label: 角色设定
180203
name: systemMessage
181-
rows: 10
204+
help: 建议按“角色身份 / 说话风格 / 互动方式 / 行为约束”分段填写,这样模型更容易稳定理解设定
205+
rows: 16
182206
validation: String
183207
- $formkit: text
184208
label: 接口超时时间(秒)

src/main/resources/plugin.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ metadata:
66
"store.halo.run/app-id": "app-oPNFQ"
77
spec:
88
enabled: true
9-
requires: ">=2.24.2"
9+
requires: ">=2.22.0"
1010
author:
1111
name: LIlGG
1212
website: https://lixingyong.com

0 commit comments

Comments
 (0)