Version: 2019.2
カスタム製のシリアル化
UnityEvent

スクリプトのシリアル化に関連するエラー

シリアル化は、データ構造やオブジェクトの状態を、Unity が保存可能で後で再構築できる形式に変換する自動プロセスです。詳しい情報は スクリプトのシリアル化 を参照してください。

特定の状況では、スクリプトのシリアル化によってエラーが発生する可能性があります。これらのうちのいくつかに対する修正方を以下に説明します。

Unity スクリプティング API をコンストラクターやフィールドイニシャライザーから呼び出す

MonoBehaviour コンストラクターやフィールドイニシャライザーの中で GameObject.Find などのスクリプティング API を呼び出すと、「Find is not allowed to be called from a MonoBehaviour constructor (or instance field initializer), call in in Awake or Start instead.MonoBehaviour」(コンストラクターまたはインスタンスフィールドイニシャライザーから Find を呼び出すことはできません。代わりに Awake または Start 内で呼び出してください) というエラーが発生します。

これを修正するには、コンストラクターではなく MonoBehaviour.Start 内でスクリプティング API を呼び出します。

逆シリアル化中に Unity スクリプティング API を呼び出す

System.Serializable とマークされたクラスのコンストラクター内から GameObject.Find などのスクリプティング API を呼び出すと、「Find is not allowed to be called during serialization, call it from Awake or Start instead」(シリアル化中は Find を呼び出すことはできません。代わりに Awake または Start 内で呼び出してください) というエラーが発生します。

これを修正するには、シリアライズされたオブジェクトに関するスクリプティング API の呼び出しが、コンストラクターで行われないようにコードを変更します。

スレッドセーフ Unity スクリプティング API

スクリプティング API の多くは、上記の制限の影響を受けます。Unity スクリプティング API の一部のみがその例外で、どこからでも呼び出すことができます。該当する API は以下の通りです。

  • Debug.Log

  • Mathf 関数

  • 単純な自己完結型の構造体。例えば、Vector3Quaternion のような数学ライブラリで使用される構造体など。

シリアル化中のエラー発生のリスクを減らすために、自己完結型で、Unity からデータを取得または設定する必要がない API メソッドのみを呼び出してください。他に選択肢がない場合にのみこれらを呼び出すようにしてください。


• 2017–05–15 Page published

カスタム製のシリアル化
UnityEvent