【Unity入門】SerializeFieldとは?Publicとの違いと使い分けを初心者向けに解説

PR

本記事で解決できること

  • SerializeFieldとは?
  • SerializeFieldとPublicの違い、使い分け

Unityでゲーム開発をする際によく使用するSerializeFieldについて解説します!

Unityを学ぶ本や動画によって、public とSerializeFieldが同じように使われていて、何が違うのか特に意識せずに使っている人もいると思います。そこについても解説します。

PR

そもそもシリアライズ(Serialize)とは?

シリアライズ(Serialize)とは、プログラム内のデータを保存や送信できる形式に変換することです。

プログラム寄りの説明

  • プログラムでは、変数やオブジェクトの情報(数値や文字列、状態など)を扱います。
  • そのままではファイルやネットワークに保存・送信できないことがあります。
  • シリアライズを使うと、データを保存したり、他のシステムに送信したりできる形に変換できます。
  • Unityでは、SerializeFieldを付けることでInspector上で変数を編集できるようにしつつ、データとしても扱えるようにする仕組みです。

SerializeFieldとは?

SerializeFieldは、Unityで使われる属性(Attribute)の一つであり、変数やプロパティをUnityのInspectorウィンドウに表示可能にするためのものです。SerializeFieldを使うことで、プログラマーはゲームオブジェクトやコンポーネントのプロパティを直接編集することなく、簡単に調整できるようになります。

SerializeFieldの基本的な使い方

SerializeFieldを使用するには、Unityスクリプト内の変数やプロパティの前に[SerializeField]という属性を付けるだけです。例えば、以下のようなコードを考えてみましょう。

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    [SerializeField] float moveSpeed = 5f;

    [SerializeField] int playerHealth = 100;

    // 他のコード
}

この例では、moveSpeedplayerHealthという変数にSerializeFieldをつけています。これにより、UnityのInspectorウィンドウ上でこれらの変数の値を調整できるようになります。

SerializeFieldのメリットとは何か

SerializeFieldの最大のメリットは、プログラマーがコード内で変数を定義するだけで、その変数をInspector上で編集できるようになることです。これにより、値の調整やテストが非常に容易になります。

SerializeFieldとPublicの違い

異なる点

  • public 他のスクリプトから変更できる
  • SerializeField 他のスクリプトから変更できない
項目public[SerializeField]
Inspectorでの編集可能可能
他スクリプトからアクセス可能不可

ポイントは、publicは他のスクリプトからもアクセス可能で、SerializeFieldはInspectorからは見えるが他スクリプトからはアクセスできないことです。
必要がなければpublicを避け、SerializeFieldを使うのが推奨です。

実際に確認

public と SerializeField のパラメーターをそれぞれ用意します

public class test : MonoBehaviour
{
    public int PublicNum = 0;
    [SerializeField] int SerializeNum = 0;
}

別のスクリプトを用意し、参照できるかを確認してみると、SerializeFieldの参照ができないエラーが出てきます。

インスペクターでの編集はさせずに、他スクリプトからアクセスするには?

Unityで変数をInspectorに表示せずに他のスクリプトからアクセスしたい場合はどうしたら良いのか?
このようなケースでは、System.NonSerialized属性を使う方法が便利です。


1. System.NonSerializedとは?

System.NonSerializedは、シリアライズ(保存・Inspector表示)を無効化するために使います。

  • public変数に付けることで、他スクリプトからアクセス可能
  • しかし、[NonSerialized]をつけることで、Inspectorには表示されない
  • シーン保存時にも値は保持されない

2. 基本的な使い方

using UnityEngine;
using System;

public class Player : MonoBehaviour
{
    [NonSerialized] public int runtimeScore; // Inspectorには表示されず、他スクリプトからアクセス可能
}

別のスクリプトからアクセスする例:

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public Player player;

    void Start()
    {
        // 他スクリプトから値を参照・変更可能
        player.runtimeScore = 50;
        Debug.Log(player.runtimeScore); // 50と表示
    }
}
  • runtimeScoreはInspectorに表示されませんが、publicなので他のスクリプトから自由にアクセスできます

3. SerializeFieldとの違い

属性Inspector表示他スクリプトアクセス
SerializeField表示されるprivateなら不可
System.NonSerialized表示されないpublicならアクセス可能
  • SerializeField:Inspectorで編集したいprivate変数向け
  • System.NonSerialized:Inspectorには表示させず、publicとして他スクリプトからアクセスしたい変数向け

まとめ

1人で簡単なゲームを開発する分には、SerializeFieldとPublic、どちらを使っても大差ないように思いますが、複数人で開発をするときは、意識した方が良さそうです。

インスペクターの表示をさらに見やすく効率的に使いたい方は、こちらのアセットがおすすめです。