モデルの整合性を検証する
最終更新: 2025年10月14日
Cubism SDKは、モデルを読み込む前に、改ざんによってモデルに不正なデータが含められていないかを検証することができます。
不特定のMOC3ファイルが読み込まれることが想定される場合、csmInitializeModelInPlaceでcsmMocのオブジェクトを生成する前に、読み込ませるMOC3ファイルの整合性の確認を行うことを推奨します。
ただし、整合性の検証はパフォーマンスに影響する可能性がありますのでご注意ください。
モデルの整合性の検証には、 Cubism Coreの csmHasMocConsistency()(SDK for Javaは Live2DCubismCore.hasMocConsistency())を使用します。
詳細は「Core API リファレンス」をご覧ください。
Cubism SDK for Nativeの CubismMoc::Create() 、Cubism SDK for Webの CubismMoc.create() およびCubism SDK for Javaの CubismMoc.create() では、モデルの読み込み時にMOC3ファイルの整合性を検証します。
// Cubism SDK for Native
CubismMoc* CubismMoc::Create(const csmByte* mocBytes, csmSizeInt size, csmBool shouldCheckMocConsistency)
{
CubismMoc* cubismMoc = NULL;
void* alignedBuffer = CSM_MALLOC_ALLIGNED(size, Core::csmAlignofMoc);
memcpy(alignedBuffer, mocBytes, size);
if (shouldCheckMocConsistency)
{
// .moc3の整合性を確認
csmBool consistency = HasMocConsistency(alignedBuffer, size);
if (!consistency)
{
CSM_FREE_ALLIGNED(alignedBuffer);
// 整合性が確認できなければ処理しない
CubismLogError("Inconsistent MOC3.");
return cubismMoc;
}
}
...
return cubismMoc;
}
// Cubism SDK for Web
public static create(
mocBytes: ArrayBuffer,
shouldCheckMocConsistency: boolean
): CubismMoc {
let cubismMoc: CubismMoc = null;
if (shouldCheckMocConsistency) {
// .moc3の整合性を確認
const consistency = this.hasMocConsistency(mocBytes);
if (!consistency) {
// 整合性が確認できなければ処理しない
CubismLogError(`Inconsistent MOC3.`);
return cubismMoc;
}
}
...
return cubismMoc;
}
// Cubism SDK for Java
public static CubismMoc create(byte[] mocBytes, boolean shouldCheckMocConsistency) {
com.live2d.sdk.cubism.core.CubismMoc moc;
if (mocBytes == null) {
return null;
}
if (shouldCheckMocConsistency) {
// .moc3の整合性を確認する。
boolean consistency = hasMocConsistency(mocBytes);
if (!consistency) {
CubismDebug.cubismLogError("Inconsistent MOC3.");
return null;
}
}
...
return cubismMoc;
}
Cubism SDKのサンプルでは、デフォルトで読み込み時に整合性の検証を行っていますが、こちらは任意で無効化することができます。
モデル読込み時の整合性の検証を無効化するには、SDK for Nativeの LAppDefine::MocConsistencyValidationEnable、SDK for Webの LAppDefine.MOCConsistencyValidationEnable およびSDK for Javaの LAppDefine.MOC_CONSISTENCY_VALIDATION_ENABLE の値を変更します。
// Cubism SDK for Native
// MOC3の整合性検証オプション
const csmBool MocConsistencyValidationEnable = true;
// Cubism SDK for Web // MOC3の一貫性検証オプション export const MOCConsistencyValidationEnable = true;
// Cubism SDK for Java
/**
* MOC3の整合性を検証するかどうか。有効ならtrue。
*/
public static final boolean MOC_CONSISTENCY_VALIDATION_ENABLE = true;
Unityも同様に、デフォルトでは CubismMoc.CreateFrom() でモデルインポート時に整合性を検証します。
// Cubism SDK for Unity
public static CubismMoc CreateFrom(byte[] moc3, bool shouldCheckMocConsistency = true)
{
if (shouldCheckMocConsistency && !HasMocConsistency(moc3))
{
Debug.LogError("This Moc3 is Invalid. This model generation process is aborted and prefab is not created.\n" +
$"Please check Model's Moc version. This CubismCore supported latest Moc version is `{LatestVersion}`.");
return null;
}
var moc = CreateInstance<CubismMoc>();
moc.Bytes = moc3;
return moc;
}
新たに追加されたMOCバージョンの取得方法
Cubism 5.3 SDK for Native R5 beta2 および Cubism 5.3 SDK for Web R5 beta2 以降に追加した GetMocVersionFromBuffer() を使用することで、csmHasMocConsistency() に失敗した場合でもMOCファイルのバージョンを取得できます。
これはCubism 5 SDK for Native R4_1 および Cubism 5 SDK for Web R4 以前のSDKで、Cubism5.3以降の機能を含んだモデルを読み込んだ際に整合性の検証において不正と判断されてしまいMOCバージョンが取得できないため、新たに追加しました。