public void OnBeforeSerialize ();


Unity がオブジェクトをシリアライズする前にコールバックを受信するためにこのメソッドを実装します。

In contrast to many other programming environments where you often creates Unity は頻繁にオブジェクトを作成し、あらかじめ定めた値でエディターのフィールドを設定します。

オブジェクトのフィールドに設定するためのプロセスと、それらを取得することをそれぞれデシリアライズとシリアライズと呼びます。 Unity's serializer is able to serialize many different kinds of fields, but not all of them. In those cases it can be convenient to get a callback before Unity will read from your fields, or after it has written to them, to allow you to do some custom steps. A typical use case for this would be if you have an object graph that you know how to serialize, but Unity does not. can serialize. You can do the reverse in the OnAfterDeserialize method.

インターフェースは例のような MonoBehaviour の上でを使用できますが、カスタムのクラスや構造体にも使用できます。

このインターフェースは非常に注意して使用する必要があります。Unity のシリアライザーは普段メインスレッド以外で実行されており、ほとんどの Unity API はメインスレッド上からの呼び出しにのみ対応しているからです。また、コードを Unity のシリアライズコードに挟まれて実行すると(コールバックは延期されません)、Unity が読み取りや書き込みをしているオブジェクトを修正することで、Unity のシリアライザーを酷く困惑させる可能性があります。このインターフェースは、上記のように Unity にはシリアライズできないものを自分自身で扱う場合にのみ使用することを強く推奨します。 while most of the Unity API can only be called from the main thread. Your code is also running confuse Unity's serializer by modifying the very objects Unity is reading from and writing to. serializing something yourself that Unity doesn't know how to.

もう1つの注意すべきことは、シリアライズは考えているよりも高頻度で起こることです。MonoBehaviour が実行時に Instantiate() で複製されたものを取得する場合、デシリアライズとシリアライズがなされます。オブジェクトが自身のゲームオブジェクトを参照するフィールドを持つとして、ゲームオブジェクトを複製した際にフィールドで古いオブジェクトではなく、新しいゲームオブジェクトを参照したい場合を考えます。これらの「内部参照」を更新するために Unity はシリアライゼーションシステムを使用します。Unity はすべてのフィールドを読み取り「複製されたもの」への参照を探し、新しい値をフィールドに書き込みます。Unity がシリアライズできないカスタムクラスでも内部参照の更新をできるようコールバックもまた更新時に実行されます。 had a field that pointed to its own gameObject, when that gameObject gets cloned, you'd want the field to point to the new gameObject, not the old one. In order to update these "internal references", Unity uses the serialization system. Unity reads all your fields, finds references to "things that were cloned", and then writes the new values in your fields. The callbacks will also be invoked for this updating phase, allowing you to make the updating of internal references to also work in your custom classes that Unity cannot serialize.

Currently only classes will receive the callbacks. Structs will not.

シリアライゼーションのコールバックを使用して Dictionary をシリアライズします。

using UnityEngine;
using System;
using System.Collections.Generic;

public class SerializationCallbackScript : MonoBehaviour, ISerializationCallbackReceiver { public List<int> _keys = new List<int>(); public List<string> _values = new List<string>();

//Unity doesn't know how to serialize a Dictionary public Dictionary<int,string> _myDictionary = new Dictionary<int,string>() { {3, "I"}, {4, "Love"}, {5, "Unity"}, }; public void OnBeforeSerialize() { _keys.Clear(); _values.Clear();

foreach( var kvp in _myDictionary ) { _keys.Add( kvp.Key ); _values.Add( kvp.Value ); } }

public void OnAfterDeserialize() { _myDictionary = new Dictionary<int, string>();

for(var i = 0; i != Math.Min( _keys.Count, _values.Count ); i++ ) _myDictionary.Add( _keys[i], _values[i] ); }

void OnGUI() { foreach( var kvp in _myDictionary ) GUILayout.Label( "Key: " + kvp.Key + " value: " + kvp.Value ); } }