附属 Mod 接口(API)
其他 mod 想用本 mod 的模型 / 界面,不需要碰原生库,只用 com.chillet.live2dmc.api
里的三个门面类(全部 @OnlyIn(Dist.CLIENT),版本号 Live2DMcApi.API_VERSION = "1")。
接入
dependencies {
// 把 live2dmc-1.0.0.jar 放进 libs/,只在编译期用
compileOnly files("libs/live2dmc-1.0.0.jar")
}
# mods.toml:软依赖(mandatory=false 时先判 Live2DMcApi.isAvailable())
[[dependencies.youraddon]]
modId = "live2dmc"
mandatory = false
versionRange = "[1.0.0,)"
ordering = "AFTER"
side = "CLIENT"
Live2DMcApi:模型 / 表情 / 参数 / 部件 / HUD / 渲染
| 方法 | 说明 |
|---|---|
modId() / isAvailable() |
本 mod 的 id / 是否就绪(模型没加载也是 true) |
hasModel() / statusLine() / hintLine() |
有没有模型 / 状态文案 / 首步提示 |
models() / currentModel() / currentModelLabel() |
模型列表(目录名)/ 当前模型 / 显示名 |
selectModel(String) / cycleModel() / rescanModels() / openModelFolder() |
换模型(会清空当前表情)/ 轮换 / 重扫目录 / 打开目录 |
expressions() / selectedExpressions() |
可用表情 id / 已勾选(可多个) |
setExpressions(List) / toggleExpression(String) / clearExpressions() |
设置 / 开关 / 清空表情,叠加生效 |
cycleMotion() / currentMotion() |
播放下一个动作 / 当前动作名 |
parameters() → List<Param> / parameter(String) |
参数表与当前值(Param{id,name,group,min,max}) |
setParameter(String,float) / hasParameterOverride(String) / resetParameters() |
实时覆盖参数 / 是否改过 / 全部还原 |
parts() → List<Part> / isPartVisible(String) / setPartVisible(String,boolean) / showAllParts() |
部件表(Part{id,name})与开关 |
offsetX() / offsetY() / setOffset(double,double) |
模型位置(拖动同款) |
scale() / setScale(double) / opacity() / setOpacity(double) |
缩放 / 不透明度 |
isHudEnabled() / setHudEnabled(boolean) |
桌面挂件(HUD)开关 |
hudAnchorX() / hudAnchorY() / setHudAnchor(double,double) / hudScale() / setHudScale(double) |
HUD 锚点(0~1 整屏比例)与大小 |
render(GuiGraphics, x, y, w, h) |
把模型画进屏幕矩形(任意 GUI/界面里都能用,返回是否画了) |
renderFollowMouse(GuiGraphics, x, y, w, h, mouseX, mouseY) |
同上,并按鼠标位置转头 |
isLightTheme() / setLightTheme(boolean) |
深/浅色主题(写配置) |
openConsole() / save() / resetDefaults() |
打开设置界面 / 立即落盘 / 恢复默认 |
| 示例(聊天框里叫角色笑一下,并把模型画到自绘界面里): |
if (Live2DMcApi.isAvailable() && Live2DMcApi.hasModel()) {
Live2DMcApi.setExpressions(List.of("Happy1", "Shy")); // 叠加,清空用 clearExpressions()
boolean drawn = Live2DMcApi.renderFollowMouse(graphics, x, y, 200, 260,
mouseX, mouseY);
}
模型目录、表达式列表、参数/部件都是运行时数据:models() 为空说明玩家还没放模型,
render(...) 返回 false 时不要报错(没有模型 / 原生库不可用都正常)。
Live2DMcUiApi:往设置界面加页签
页签里的控件就是本 mod 自带的 com.chillet.live2dmc.ui 控件库(自绘、无着色器、无贴图),
坐标是绝对屏幕坐标,用 bodyX()/bodyY() 作内容区左上角、bodyW()/bodyH() 作可用宽高:
Live2DMcUiApi.registerTab("youraddon", "你的页签", tab -> {
int x = tab.bodyX(), y = tab.bodyY(), w = tab.bodyW();
tab.add(new UiSlider(() -> "强度",
() -> myStrength, v -> myStrength = v, 0.0D, 100.0D, 1.0D)
.bounds(x, y, w, 19));
tab.add(new UiButton(() -> "点我", () -> doSomething(), UiButton.Style.PRIMARY)
.bounds(x, y + 24, w / 2 - 2, 20));
});
| 方法 | 说明 |
|---|---|
registerTab(String id, String title, Consumer<TabBuilder> build) |
注册页签(同 id 只保留第一个;构建抛异常只记日志,不影响界面) |
tabs() |
已注册页签(TabEntry{id,title,build}) |
openConsole() |
打开本 mod 的设置界面 |
notifyConsoleOpened() / notifyConsoleClosed() |
设置界面自己会调,一般不用管 |
页签标题建议自己用 I18n 本地化,并且尽量短("拓展"/"语音" 这类 2~3 个字最好): |
|
| 内置 5 个页签已经占掉大半宽度,标题过长会按段宽自动省略;页面内容区仍是完整宽度。 | |
| 页签在设置界面每次打开时重建,构建方法里读最新状态即可。 |
Live2DMcEvents:状态监听
Live2DMcEvents.register(new Live2DMcEvents.Listener() {
@Override public void onModelChanged(String model) { ... }
@Override public void onExpressionsChanged(List<String> selected) { ... }
@Override public void onConfigSaved() { ... }
@Override public void onConsoleOpened() { ... }
@Override public void onConsoleClosed() { ... }
});
全部方法都有空实现(只重写关心的即可)。监听器里的异常会被吞掉并记一条 warn,
不会打断本 mod;不再需要时 Live2DMcEvents.unregister(listener)。

