草莓兔兔-LIVE2D

给你的网站添加一个好看的LIVE2D看板娘


一声梧叶一声秋,一点芭蕉一点愁,三更归梦三更后。—— 水仙子·夜雨。


写在前面

Mizuki博客已经为我们提供了看板娘配置,但是由于部分功能的限制,现在的live2d 使用的 Pio 项目只支持 SDK2 模型,想换一个自己更喜欢的模型但是目前网络上流传的大多为 SDK3 以上,所以尝试着借助ai的神力修改了部分代码使得适用mizuki现在也能适配SDK3.

本文章借鉴了柊镜大佬的文章,并加以简化,绝对不是因为我懒😴
:spoiler[其实就是因为我很懒也很菜],在此表达感谢!!!

再对mikus表示感谢!感谢兄弟的耐心指导!

LIVE2D

Live2D是由日本Cybernoids公司(后更名为Live2D株式会社)开发的一款2D图像渲染技术及相应软件。它通过网格变形等技术,将静态的2D图像转化为可动态渲染的角色模型,使其能够展现丰富的表情和动作,同时保留原画的风格与质感。该技术广泛应用于手机游戏、主机游戏、虚拟主播(VTuber)、动画及应用程序等领域,已成为2D实时动画表现的业界标准工具。自2008年发布以来,其编辑器Cubism Editor及相关SDK支持多平台开发,被全球众多商业项目所采用.

[!IMPORTANT] IMPORTANT 本教程仅适用于Mizuki 8.2(1dcaa61)或更高版本.


Mizuki配置

这里依旧参考了Dreamer-Paul大佬的github项目,已经给大佬点上了⭐.

::github{repo=“Dreamer-Paul/Pio”}

  1. 本地克隆
git clone https://github.com/Dreamer-Paul/Pio.git  

或访问仓库下载发行版压缩包

  1. X:\xxx\Pio-master\Pio-master\static目录下所有文件替换到如下路径:X:\xxxx\xxxx\public\pio\static
  2. X:\XXX\XXX\src\components\features\pio\下的Pio.svelte的文件修改为: 以上为mizuki9.0及以上版本使用方法,若使用8.0-9.0的版本,Pio.svelte文件位于X:\xxx\src\components\widgets\Pio.svelte,直接替换即可
Pio.svelte
<script>
import { onDestroy, onMount } from "svelte";
import { pioConfig } from "@/config";

const pioOptions = {
    mode: pioConfig.mode,
    hidden: pioConfig.hiddenOnMobile,
    content: pioConfig.dialog || {},
    model: pioConfig.models || ["/pio/models/pio/model.json"],
};

// 从 config 获取 SDK 版本,如果没有则自动判断
const sdkVersion = pioConfig.sdkVersion || (pioOptions.model[0].includes("model3.json") ? 4 : 2);
const isModel3 = sdkVersion >= 3;

let pioContainer;
let pioCanvas;
let pioInitialized = false;

// 初始化函数
function initPio() {
    if (typeof window !== "undefined" && typeof Paul_Pio !== "undefined") {
        try {
            if (pioContainer && pioCanvas && !pioInitialized) {
                // 如果是 SDK4,手动初始化 Pixi 环境
                if (isModel3 && typeof window.initPioPixi === "function") {
                    window.initPioPixi(pioConfig.position || 'left');
                }

                // 实例化 Paul_Pio
                new Paul_Pio(pioOptions);
                pioInitialized = true;
                console.log(`Pio initialized successfully (SDK${sdkVersion})`);
            }
        } catch (e) {
            console.error("Pio initialization error:", e);
        }
    } else {
        setTimeout(initPio, 100);
    }
}

// 核心:资源加载器
async function loadPioAssets() {
    if (typeof window === "undefined") return;

    const loadScript = (src, id) => {
        return new Promise((resolve, reject) => {
            // 检查是否已存在(避免 Swup 重复加载)
            const existing = document.querySelector(`script[src="${src}"]`);
            if (existing || document.querySelector(`#${id}`)) {
                console.log(`[Pio] Script already loaded: ${src}`);
                resolve();
                return;
            }
            const script = document.createElement("script");
            script.id = id;
            script.src = src;
            script.onload = () => {
                console.log(`[Pio] Loaded: ${src}`);
                resolve();
            };
            script.onerror = (e) => {
                console.error(`[Pio] Failed to load: ${src}`, e);
                reject(e);
            };
            document.head.appendChild(script);
        });
    };

    try {
        if (isModel3) {
            // === SDK 4 加载流程 (严格顺序) ===

            // 1. 加载 Live2D Cubism Core (必须第一个)
            await loadScript(
                "https://cubism.live2d.com/sdk-web/cubismcore/live2dcubismcore.min.js",
                "cubism-core"
            );

            // 2. 加载 PixiJS (必须第二个)
            await loadScript(
                "https://cdn.jsdelivr.net/npm/pixi.js@5.3.6/dist/pixi.min.js",
                "pixi-js"
            );

            // 3. 确认 PIXI 存在
            if (typeof PIXI === 'undefined') {
                throw new Error("[Pio] PIXI not loaded!");
            }
            console.log("[Pio] PIXI version:", PIXI.VERSION);

            // 4. 加载 Pixi-Live2D-Display
            await loadScript(
                "https://cdn.jsdelivr.net/npm/pixi-live2d-display/dist/cubism4.min.js",
                "pixi-live2d-display"
            );

            // 5. 加载本地适配器
            await loadScript("/pio/static/pio_sdk4.js", "pio-sdk4-adapter");

            // 6. 加载 UI 逻辑
            await loadScript("/pio/static/pio.js", "pio-main");

        } else {
            // === SDK 2 加载流程 ===
            await loadScript("/pio/static/l2d.js", "l2d-lib");
            await loadScript("/pio/static/pio.js", "pio-main");
        }

        // 全部加载完成后,初始化
        setTimeout(initPio, 100);

    } catch (err) {
        console.error("Failed to load Pio assets:", err);
    }
}

onMount(() => {
    if (!pioConfig.enable) return;
    if (pioConfig.hiddenOnMobile && window.matchMedia("(max-width: 1280px)").matches) return;

    setTimeout(loadPioAssets, 0);
});

// 清理(可选,防止 Swup 切换时出问题)
onDestroy(() => {
    pioInitialized = false;
});
</script>

{#if pioConfig.enable}
<div class={`pio-container ${pioConfig.position || 'left'}`} bind:this={pioContainer}>
    <div class="pio-action"></div>
    <canvas
        id="pio"
        bind:this={pioCanvas}
        width={pioConfig.width || 280}
        height={pioConfig.height || 250}
        style="width: {pioConfig.width || 280}px; height: {pioConfig.height || 250}px;"
    ></canvas>
</div>
{/if}

<style>
    #pio { display: block; }
</style>
  1. 将您下载好live2d模型解压后放至X:\XXX\XXX\public\pio\models文件夹内,
  1. config.ts文件内,找到并修改以下内容(671-693行):
// Pio 看板娘配置
export const pioConfig: import("./types/config").PioConfig = {
	enable: true, // 启用看板娘
	models: ["/pio/models/wwa/wwa.model3.json"], // 默认模型路径
	position: "left", // 模型位置
	width: 280, // 默认宽度
	height: 400, // 默认高度
   其他内容···

[!warning] 默认模型路径必须与XXX.model3.json文件名一致,否则无法正常显示。
如需改变文件的命名方式,必须在文件内修改XXX.model3.jsonXXX.vtube.json内文件引用的命名。


LIVE2D模型下载


本文采用 CC BY 4.0 协议发布
So-Novel/EchoMusic 更新日志(二)

随机推荐

评论区

♪ 音乐
加载中...
--
0:00 0:00
你好呀~