はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】ScriptableObjectをテキスト形式ではなくバイナリ形式で保存する(PreferBinarySerialization)

はじめに

今回はPreferBinarySerializationという属性(Attribute)について紹介したいと思います。

docs.unity3d.com

PreferBinarySerializationとは?

PreferBinarySerializationScriptableObjectの派生クラスに適応することで、ScriptableObjectバイナリとして保存することができます。
docs.unity3d.com

[CreateAssetMenu]
[PreferBinarySerialization]
public class SampleScriptableObject : ScriptableObject
{
    public int value;
    [SerializeField] private float value2;
}

↓ PreferBinarySerializationなし

%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!114 &11400000
MonoBehaviour:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_GameObject: {fileID: 0}
  m_Enabled: 1
  m_EditorHideFlags: 0
  m_Script: {fileID: 11500000, guid: 05d3d05a6469d426199d103308a7b555, type: 3}
  m_Name: SampleScriptableObject
  m_EditorClassIdentifier: 
  value: 0
  value2: 0

↓ PreferBinarySerializationあり(無理矢理VSCodeで開く)

p2021.3.0f1����r�m��9��)���%\��$R�<Ԟ5qH�&m��J�7����������E����.��(a����.����r���	�.�
�4�v�A��A.�
A��]�A��K�h������.��H��������1�1�����@���Q�j�H�3�������1�1�����@�����Q�j����=��CPPtr<EditorExtension>m_FileIDm_PathIDPPtr<PrefabInstance>valuevalue2@�p�y�P=
�F�Mb��3�z[U�y�SampleScriptableObject
メリット
  • 読み書きのパフォーマンス向上
  • ストレージ容量の削減(要検証,手元で試したら逆に増えた?)
  • 人間が読めなくなる
デメリット
  • 人間が読めなくなる
  • Git管理が難しい(基本どっちかの.assetを採用するようになりそう)

補足

UnityCsReferencePreferBinarySerializationの定義が見れますが、詳細はc++の方に書かれているので分からないですね。残念。

github.com

[RequiredByNativeCode]
[AttributeUsage(AttributeTargets.Class)]
public sealed class PreferBinarySerialization : Attribute
{
}