关于用户数据

最終更新: 2023年1月26日

在Cubism 3.1或更高版本中,可以使用将字符串信息添加到图形网格的“用户数据”功能。

.userdata3.json文件中显示的字符串数据可以在程序上作为链接到图形网格的信息获取,
在对图形网格进行各种处理时,它可以用作鉴别材料。

例如,您可以按如下方式使用它。

  • 您可以通过附加“Skin”和“Hair”等标签,并在使用标签进行渲染时更改色调来自定义角色。
  • 描述操作透明度等参数,并通过网格平均座标到光源等的距离等来操作参数,表达反射。
  • 仅向带有标签的网格附加粒子。

创建副本

在.userdata3.json文件中描述用户数据,并由CubismModelUserData类处理。
导入是通过以下函数完成的。

  • Native(C++)的CubismModelUserData::Create函数
  • Web(TypeScript)的CubismModelUserData.create函数
  • Java的CubismModelUserData.create函数
// C++
csmString path = _modelSetting->GetUserDataFile();
path = _modelHomeDir + path;

buffer = CreateBuffer(path.GetRawString(), &size);

CubismModelUserData* _modelUserData = CubismModelUserData::Create(buffer, size);

DeleteBuffer(buffer, path.GetRawString());
// TypeScript
let path: string = _modelSetting.getUserDataFile();
path = _modelHomeDir + path;

fetch(path).then(
    (response) => 
    {
        return response.arrayBuffer();
    }
).then(
    (arrayBuffer) =>
    {
        let buffer: ArrayBuffer = arrayBuffer;
        let size: number = buffer.byteLength;

        let _modelUserData: CubismModelUserData = CubismModelUserData.create(buffer, size);
        deleteBuffer(buffer, path);
    }
);
// Java
String path = modelSetting.getUserDataFile();
path = modelHomeDir + path;

buffer = createBuffer(path);

CubismModelUserData modelUserData = CubismModelUserData.create(buffer);

访问

使用以下任意函数访问用户数据。

  • Native(C++)的CubismModelUserData::GetArtMeshUserDatas函数
  • Web(TypeScript)的CubismModelUserData.getArtMeshUserDatas函数
  • Java的CubismModelUserData.getArtMeshUserData函数

返回一个包含CubismModelUserDataNode结构的动态数组,因此可以像访问通常数组一样访问它。

在Java的情况下,会返回一个包含CubismModelUserDataNode类的List,因此可以像访问通常List一样访问它。

// C++
const csmVector<const CubismModelUserData::CubismModelUserDataNode*>& ans =
    _modelUserData->GetArtMeshUserDatas();

for ( csmUint32 i = 0; i < ans.GetSize(); ++i)
{
    CubismIdHandle handle = ans[i]->TargetId;
}
// TypeScript
const ans: csmVector<CubismModelUserData.CubismModelUserDataNode> = _modelUserData.getArtMeshUserDatas();

for(let i: number = 0; i < ans.getSize(); ++i)
{
    let handle: CubismIdHandle = ans[i].targetId;
}
// Java
final List<CubismModelUserDataNode> ans = modelUserData.getArtMeshUserData();

for(int i = 0; i < ans.size(); i++){
  CubismId handle = ans.get(i).targetId;
}

放弃

您还需要在模型释放时放弃CubismModelUserData类。

// C++
CubismModelUserData::Delete(_modelUserData);
// TypeScript
CubismModelUserData.delete(_modelUserData);

在Java中,由于垃圾回收负责释放,因此无需放弃。

显示Userdata范围

在Live2D Cubism SDK for Native的Cocos2d-x范例中,通过将LAppDefine.cpp中的DebugDrawRectEnable设置为true,
HitArea和Userdata图形网格所在的位置将显示为一个矩形。

红色是HitArea,脖子的围巾上的蓝色矩形是Userdata存在的范围。

请问这篇文章对您有帮助吗?
关于本报道,敬请提出您的意见及要求。