【Unity】独自クラスがシリアライズされない

問題

独自クラス側にSerializableを設定した上で

using System;
using UnityEngine;

[Serializable]
public class Training : MonoBehaviour
{
    [SerializeField] private string title;
    [SerializeField] private string myAnswer;
    [SerializeField] private string resultTxt;
    [SerializeField] private string resultImg;
    [SerializeField] private string resultGif;
    [SerializeField] private string time;
    [SerializeField] private string correctOrWrong;
    [SerializeField] private string studentId;
}

参照側で、SerializeFieldもちゃんと設定しても(図2

図2.ちゃんとSerializeFieldも書いた

Inspectorで値がシリアライズされない場合がある(図3)。

図3.Inspectorの様子

図4のようになっていて欲しかったのだが・・・

図4.Inspectorの様子(目標)

(・_____・)ああああああああああああああ

図5.ああああああああ


解決

UnityにおけるSerializeの仕組みには罠があって、まず前提としてMonoBehaviourを継承したスクリプトはパブリックフィールドのシリアライズ対象にならない(図6)。

図6.MonoBehaviourを継承したスクリプト

なぜかというと、MonoBehaviourを継承したクラスは、Inspectorでオブジェクトにアタッチして使うことが想定されているためである。C++側のコードを見ていないのであくまで推測だが、”MonoBehaviour” クラスの継承元の “Object” のレベルで Unity独自のシリアライズ処理を施しているのではないかと思う。

そのため、クラスのフィールドをシリアライズしたい場合、MonoBehaviourの継承を消した上で参照を入れれば良い。

図7.Object継承の削除

作成者: rarafy

2013年くらいからUnityを触っているかもしれません。 特に書くこともありませんが、趣味は部屋の掃除です。

コメントする

メールアドレスが公開されることはありません。