사용자 데이터 정보
업데이트: 2023/01/26
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의 존재 범위입니다.