@white-matrix/live2d-lib v0.0.1
live2d-lib
live2d-lib 是一个基于 Cubism 4.x SDK 的 live2d 加载 API
✨特点
- 支持 
CDN和ESModule - 使用新版本 
Cubism 4.x - 支持 
TypeScript - 支持自定义渲染位置
 - 支持事件监听
 
🌈安装
npm install live2d-lib -D
# yarn
yarn add live2d-lib -D
# pnpm
pnpm add live2d-lib -D🛠️使用
CDN
<script src="https://unpkg.com/live2d-lib"></script>
<script>
  window.onload = () => {
    Live2dWidget.init({
      canvas: {
        width: 460,
        height: 600,
      },
      source: {
        path: '/live2d/models',
        models: [ 'hijiki', 'tororo' ]
      },
    })
  }
</script>ESModule
import Live2dWidget from 'live2d-lib'
Live2dWidget.init({
  canvas: {
    width: 460,
    height: 600,
  },
  scale: 1,
  debug: false,
  target: document.querySelector('#sample'),
  source: {
    path: '/live2d/models',
    models: [ 'hijiki', 'tororo' ]
  },
})- 说明
 
live2dcubismcore.min.js 不支持 ESMdule,为避免二次编译时 __dirname 等 node 模块报错,
ESModule 格式文件中对其采用静态资源引入的方式,live2d-lib 安装完成后会自动将资源拷贝至项目根目录的 public 目录中(e.g.,public/live2d/core/live2dCubismCore.min.js);
iife 格式文件中依旧使用捆绑模式。
🔑 API
- 场景加载
 
Live2dWidget.init(options: LAppDefineOptions)| 参数名 | 参数说明 | 可选 | 默认值 | 
|---|---|---|---|
| canvas | canvas 元素的宽高,为 auto 时使用窗口大小 | true | {width: 280,height: 360} | 
| scale | 视觉效果缩放比 | true | 1.0 | 
| debug | 是否打印交互信息 | true | false | 
| target | 模型要渲染的的位置 | true | document.body | 
| cubismCorePath | Cubism Core for Web | true | /live2d/core/live2dCubismCore.min.js | 
| source | 模型资源的路径 | false | {path:'',models:[]} | 
source 不提供默认参数值,参数内容为:
path- 存放资源的目录,npm包的resources文件夹中提供了一些官方模型。models- 资源的目录名称,目录名称必须与文件名称前缀相同。
const options: LAppDefineOptions = {
  source: {
    path: '../resources',
    models: [ 'hijiki', 'tororo' ]
  }
}模型的资源路径会通过 path.join() 处理,上方示例中模型路径会拼接为 ../resources/hijiki/hijiki.model3.json。
- 场景切换
 
// 上一场景
Live2dWidget.scene.prevScene()
// 下一场景
Live2dWidget.scene.nextScene()- 事件监听
 
支持对头部、身体、左右区域(例如:左右胳膊)点击事件监听。(需要模型支持重叠检测)
Live2dWidget.on(type: HitArea, callback: ()=>void)- 参数类型定义
 
- LAppDefineOptions
 
interface CanvasOptions {
  width: number;
  height: number;
}
interface SourceOptions {
  path: string;
  models: string[];
}
export interface LAppDefineOptions {
  canvas?: CanvasOptions | 'auto';
  scale?: number;
  debug?: boolean;
  target?: HTMLElement;
  cubismCorePath?: string;
  source: SourceOptions;
}- HitArea
 
export enum HitArea {
  Head = 'Head',
  Body = 'Body',
  Left = 'Left',
  Right = 'Right',
  Other = 'Other'
}- MotionGroup
 
export enum MotionGroup {
  Idle = 'Idle', // 空闲
  TapBody = 'TapBody', // 当轻拍身体时
  TapLeft = 'TapLeft', // 当轻拍身体左侧时(左胳膊)
  TapRight = 'TapRight', // 当轻拍身体右侧时(右胳膊)
  Tap = 'Tap' // 当点击重叠检测区域之外时
}🎯 重叠检测
请阅读官网文档:重叠检测的设置准备
重叠检测图形网格的 ID 命名时保证不唯一即可,name 需要使用 HitArea 提供的除了 HitArea.Other 之外的值,HitArea.Other 用于处理非重叠检测区域的点击操作;
点击 Head 区域将执行脸部表情,对应的内容不在 Motions 中配置而是在 Expressions;如果需要在点击重叠检测区域之外时播放动作,请在 Motions 中配置 Tap 字段;
HitAreas 与 Motions 的对应关系如下:
HitArea.Body -> MotionGroup.TapBody
HitArea.Left -> MotionGroup.TapLeft
HitArea.Right -> MotionGroup.TapRight
非检测区域(HitArea.Other) -> MotionGroup.Tap
xxx.model3.json 配置示例如下:
{
  "FileReferences": {
    "Expressions": [
      {
        "Name": "Angry.exp3.json",
        "File": "expressions/Angry.exp3.json"
      }
    ],
    "Motions": {
      "Idle": [
        {
          "File": "motion/00_idle.motion3.json"
        }
      ],
      "TapBody": [
        {
          "File": "motion/02.motion3.json"
        }
      ],
      "TapLeft": [
        {
          "File": "motion/06.motion3.json"
        }
      ],
      "TapRight": [
        {
          "File": "motion/01.motion3.json"
        }
      ],
      "Tap": [
        {
          "File": "motion/01.motion3.json"
        }
      ]
    }
  },
  "HitAreas": [
    {
      "Id": "HitAreaBody",
      "Name": "Body"
    },
    {
      "Id": "HitAreaLeft",
      "Name": "Left"
    },
    {
      "Id": "HitAreaRight",
      "Name": "Right"
    }
  ]
}2 years ago