유저 데이터 정보

업데이트: 2022/12/08

Cubism3.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의 존재 범위입니다.

이 기사에 관한 의견 및 요청사항을 보내 주시기 바랍니다.