モデルの整合性を検証する

最終更新: 2024年3月26日

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;
}
この記事はお役に立ちましたか?
はいいいえ
この記事に関するご意見・
ご要望をお聞かせください。