【Unity】SerializeFieldとは?変数をインスペクターから操作できるようにする

SerializeFieldとは? Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「UnityのSerializeFieldってなに?」

「SerializeFieldを付けるとどうなるの?」

というお悩みの方に向けた内容となっています。

Unityでは、変数を宣言する際に[SerializeField]という属性を付けて宣言することがあります。

このSerializeFieldとは、その変数をシリアライズ可能にして、インスペクターウィンドウから変数の値を設定・変更することができるようになります。

特に、privateで宣言している変数をインスペクターウィンドウから値を操作したい場合に、SerializeFieldが使われます。

そこで、このページでは、UnityのSerializeFieldについて、どういうものなのか、また使い方までをまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

SerializeFieldとは?

まずは、SerializeFieldがどういうものなのか紹介していきます。

変数の値をインスペクターから操作できるようにする属性

SerializeFieldとは、宣言した変数をインスペクターウィンドウから操作するための属性のことです。

このSerializeFieldの属性が付いている変数は、以下のようにインスペクターウィンドウのスクリプトからその変数の値を設定することができるようになります。

Unityでは、変数の値をインスペクターウィンドウから表示したり変更したりするような場合、シリアライズという処理が行われています。

シリアライズとは、プログラム内の複雑なデータをバイナリデータやテキストデータなどに変換する処理を行っているもので、これによりデータを永続的に保存できるようにしています。

そのため、SerializeFieldを付けて宣言した変数は、シリアライズの処理が行われてインスペクターウィンドウで操作できるようになり、その値はシーンなどに保存され、ゲームを起動した際に変更した値で処理が行われるようになります。

「public」でなく「private」の変数でも操作可能になる

SerializeFieldを付ける場合、主にアクセス修飾子で「private」が付いている変数を、インスペクターウィンドウから操作したい場合に使います。

アクセス修飾子とは、外部のクラスからそのメンバ変数にアクセスできるかどうかを決めている修飾子のことです。

通常、外部のクラスからでもアクセスできる「public」を付けている変数は、シリアライズ対象となるため、SerializeFieldを付けなくてもインスペクターウィンドウから操作できるようになっています。

しかし、外部のクラスからはアクセスできない「private」が付いている変数は、そのままではシリアライズされません。

そこで、変数にSerializeFieldを付けてあげることで、シリアライズ対象となりインスペクターウィンドウから操作できるようになります。

このようにSerializeFieldは、外部からのアクセスを防ぐprivateな変数をインスペクターウィンドウから操作する際に、非常に便利な属性となっています。

SerializeFieldの使い方

ここからは、SerializeFieldの使い方について紹介していきます。

変数の宣言の前に[SerializeField]を付ける

SerializeFieldの属性を付ける際は、以下のようにメンバ変数(フィールド)を宣言する前に[SerializeField]と記述してあげます。

using UnityEngine;

public class Test : MonoBehaviour
{
    [SerializeField] float speed = 0.5f;  // メンバ変数を宣言する前で[SerializeField]と記述する
}

すると、スクリプトをアタッチしているオブジェクトを選択すると、その変数がインスペクターウィンドウに表示されて、設定や変更ができるようになります。

また、[SerializeField]と書くのは、変数宣言と同じ行でなくても、前の行に書いてもシリアライズ対象にすることができます。

using UnityEngine;

public class Test : MonoBehaviour
{
    [SerializeField]
    float speed = 0.5f;  // 前の行に[SerializeField]と記述しても対象となる
}

なお、static(静的)const(定数)を付けた変数、およびメソッド内で宣言したローカル変数には、SerializeField属性を設定することはできません。

キャラクター毎の能力値設定などで便利

キャラクターの能力値などを設定する変数で、SerializeFieldを付けておくと非常に便利になります。

例えば、以下のようにSerializeField属性を付けて、キャラクターの能力毎の変数を宣言したスクリプトを準備しておきます。

using UnityEngine;

public class Test : MonoBehaviour
{
    [SerializeField]
    int hp;

    [SerializeField]
    int mp;

    [SerializeField]
    float speed;
}

そして、このスクリプトをゲーム内に登場するキャラクターのオブジェクトにアタッチしておきます。

すると、インスペクターウィンドウからそれぞれのキャラクターの能力値を簡単に設定して、変更することができるようになります。

まとめ

このページでは、Unityで使えるSerializeField属性について、どういうものなのか、また使い方までをまとめていきましたが、いかがでしたでしょうか?

SerializeFieldとは、シリアライズ可能な変数として、インスペクターウィンドウから操作できるようにする機能を持っています。

SerializeFieldを使うことで、外部からのアクセスを防ぐprivateな変数でもインスペクターから操作できるようになるため、非常に便利です。

例えば、キャラクターの能力値を設定したり、ステージの動きなどの制御をインスペクターから操作できるようになります。

最後までお読みいただきまして、ありがとうございました!

コメント