コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【Unity】Unity A scripted object (probably XXXX?) has a different serialization layout when loading. (Read YY bytes but expected ZZ bytes)

概要

Unity A scripted object (probably XXXX?) has a different serialization layout when loading. (Read YY bytes but expected ZZ bytes)
Unity Did you #ifdef UNITY_EDITOR a section of your serialized properties in any of your scripts?

Unity プロジェクトを 2022.1.23f1 から 2022.3.16f1 にアップデートして
Android IL2CPP ビルドしたら、一部のプレハブを読み込んだ時に
上記のエラーが発生して特定の MonoBehaviour が動作しない現象に遭遇した

調べてみたところ、以下の条件に該当する MonoBehaviour が動作しなくなっていた

  • Assets フォルダではなく Packages フォルダ内の自作パッケージのフォルダに所属している
  • Auto Referenced がオフの .asmdef に所属している
  • クラスのアクセス修飾子が internal

やってみたけど効果が無かったこと

  • AssetDatabase.ForceReserializeAssets でプレハブをシリアライズし直し
  • EditorUtility.SetDirtyAssetDatabase.SaveAssetIfDirty でプレハブを再保存
  • EditPrefabContentsScope でプレハブを再保存
  • Preserve 属性を MonoBehaviour に付与

効果があったもの

link.xml を作成して該当の MonoBehaviour が所属する .asmdef が
IL2CPP ビルド時に strip されないようにしたら解決した

Preserve 属性を付与しても解決しなかった原因は不明

link.xml に .asmdef を記述する方法

例えば Kogane.Example.asmdef であれば以下のように記述する

<linker>
    <assembly fullname="Kogane.Example" preserve="all"/>
</linker>