はじめに
今回はPreferBinarySerialization
という属性(Attribute
)について紹介したいと思います。
PreferBinarySerializationとは?
PreferBinarySerialization
をScriptableObject
の派生クラスに適応することで、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
を採用するようになりそう)
補足
UnityCsReference
でPreferBinarySerialization
の定義が見れますが、詳細はc++
の方に書かれているので分からないですね。残念。
[RequiredByNativeCode] [AttributeUsage(AttributeTargets.Class)] public sealed class PreferBinarySerialization : Attribute { }