渋谷ほととぎす通信

「Unityをわかりやすく」初心者のためのゲーム作りブログ

Unityエラー「The same field name is serialized multiple times in the class or its parent class」の対処

Unityエラー「The same field name is serialized multiple times in the class or its parent class」の対処

こんにちは、Unityエンジニアのオオバです。

お悩みさん
お悩みさん
  • Consoleウィンドウに表示されるエラーを直したい
  • 「The same field name is serialized...」というエラーがよくわからない
  • オオバ
    オオバ
    本記事ではこれらの悩みを解決します。

    Unityで開発していると、原因のわからないエラーが登場しますよね。自分は特に悪いことをしているつもりはなくてもです。今回はそんなエラーの1つを紹介します。

    本記事で紹介するエラーはこちら。

    Unityエラー「The same field name is serialized multiple times in the class or its parent class」の対処_0

    The same field name is serialized multiple times in the class or its parent class. This is not supported: Base(MonoBehaviour) _hoge
    UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

    Unityエディタ、ビルドした実機ともに正常に動作はしますが、エラーが出ている状態は気持ち悪いです。最後まで読んでこのエラーを撲滅しましょう。

    👉DOTweenの教科書を読んでUnityアニメーションをプログラミングしてみよう!

    原因は親子クラス内の同名シリアライズ変数

    結論から話すと、このエラーの原因は継承先のクラスに宣言したシリアライズ変数の名前です。親子ともに同名の変数を宣言することでこのエラーは起きてしまいます。以下の2つのソースコードを見ていきましょう。

    // 親クラス  
    class Parent : MonoBehaviour  
    {
        [SerializeField] int _hoge;  
    }
    
    // 子クラス  
    class Child : Parent  
    {
        [SerializeField] int _hoge;  
    }
    

    Parentクラス、Childクラスともに「hoge」という同名の変数が定義されています。
    Unityではこの状態はエラーになります。
    継承元、継承先どちらの変数をシリアライズ(保存)すればよいのか判断できないため_ です。

    片方のシリアライズでもエラーは起きる

    原因は親子クラス内の同名シリアライズ変数で解説したとおり、シリアライズする同名変数によってエラーが起きますが、親子片方だけでも同様のエラーが起きてしまいます。具体的には次のソースコードです。

    // 親クラス  
    class Parent : MonoBehaviour  
    {
        int _hoge;  
    }
    
    // 子クラス  
    class Child : Parent  
    {
        [SerializeField] int _hoge;  
    }
    

    Parent(親クラス)のシリアライズは外しているにも関わらずエラーになります。

    以上の現象を次の票にまとめてみました。

    • パターンAパターンBパターンCパターンD
      親クラスのシリアライズ有無ありありなしなし
      子クラスのシリアライズ有無ありなしありなし
      結果エラーエラーエラー正常

    結論、 [SerializeField] を親子どちらも設定しない同名変数は正常に動作します。それ以外はすべてエラーです。

    エラーの場所を特定する方法

    The same field name is serialized multiple times in the class or its parent class のエラーがどういう原因なのかわかったところで、エラーの直し方を2つ紹介します。

    その1.ソースコードの全文検索

    Consoleウィンドウのエラーログをクリックするとソースコードにジャンプしてくれれば楽なのですが、今回のケースではコードジャンプしてくれません。エラー文をよく見てみましょう。最後の部分です。

    This is not supported: Base(MonoBehaviour) _hoge このように「_hoge」変数がエラーを起こしているということを教えてくれます。直し方は原始的ですが、お使いのエディターから全文検索して「_hoge」を検索してして変数名を修正しましょう。

    つまりこのエラーは サクッと修正できないエラー なのです。したがってこのエラーがConsoleウィンドウに表示されたら優先的に直すことをおすすめします。アプリ自体は動くから大丈夫とたかを括っていると、後で大変なことになります。

    プロジェクト規模によっては探すのも大変ですし、変数名を変更するのも地味に面倒くさいです。ぜひ、日々目を光らせてエラーを撲滅してみてください。

    その2.Inspectorウィンドウのフィールド重複

    2つ目の方法は、Inspectorウィンドウです。具体的には同じフィールド名が複数Inspectorに表示されてしまうのです。↓↓下図参照。

    Unityエラー「The same field name is serialized multiple times in the class or its parent class」の対処_1

    Hogeというフィールドが2つ並んでいます。これはまさに親子クラス内でシリアライズした同名変数が複数存在することを意味しています。

    つまり、このような 同名フィールドがInspectorウィンドウに表示されていることが不正な状態 ですので、見つけ次第変数名の変更を検討してみてください。

    Unity2020以降は実機ビルドは成功する

    Unityのバージョンによってエラーの扱いが変わってきています。

    The same field name is serialized multiple times in the class or its parent class エラーは、Unity2020以降は実機ビルドに成功します。Unity2019以前のバージョンでは実機ビルドに失敗していました。Unityのバージョンアップによってエラー自体が内部で握りつぶされたのかもしれません。

    ただし、エラーの出ている状態はシステムとして不健全です。前述の内容を参考にエラーが出ていない状態を目指しましょう。

    まとめ

    本記事では The same field name is serialized multiple times in the class or its parent class というUnityのエラーについて解説してきました。簡単に内容をまとめます。

    The same field name is serialized...の直し方

    ①親子でシリアライズした同名変数は定義しない

    ②直し方はソースコード全文検索

    ③直すのに時間がかかるためエラーが起きたらすぐ直す

    こんな感じです。

    開発にエラーはつきものです。一発でエラーを出さずに開発するほうがむしろ難しいと思います。だからこそエラーと共存する事が大事。エラーが出てテンションは下がってしまうかもしれませんが、エラーを解消するためにはエラー文を読むのが最短です。

    エラーを受け止めて、しっかり読み込み、エラーを解消していきましょう。

    この記事があなたのゲーム開発に少しでもお役に立てたら嬉しいです。

    「Unity初心者大学」というUnity初心者向けのYouTube始めました!!
    ぜひチャンネル登録をお願いします!

    最後まで読んでいただきありがとうございました!
    すばらしいUnityライフをお過ごしください。

    オススメ記事
    検証環境
    • Unity2021.3.5f1