カテゴリー: 未分類

【Unity】Inspectorから値にアクセス可能にするためには。

はじめに

こんにちはsuzukiです。本日はUnityのインスペクターから値を編集するフィールドシリアライゼーションについて説明いたします。

上記のメリットとして、unityでrunしている最中に値の変更を行うことができたり、必要な設定をコード上以外からも編集できるため便利です。
利用する方法として、[SerializeField]を利用するか、publicの装飾子を利用するかとなります。
それぞれ利用パターンが異なるため整理します。

シリアライズ

これからを説明するにはシリアラライズが何かを説明すると、公式の説明では下記の様に説明されており
“シリアライゼーションは、データ構造やオブジェクトの状態を Unity が保存して後で再構成できる形式に変換する自動プロセスです。”
重要なことは上記を行うことにより、Unityのインスペクタからの値の更新を、runしているプログラムに適用できる様になります。

シリアライズ利用するため準拠するルールがあります。

  • public であるか、または SerializeField 属性をもっていること。
  • 静的でないこと。
  • const ではないこと。
  • 読み取り専用でないこと。
  • シリアラル化可能なフィールド型であること。
    • プリミティブなデータ型 (int、float、double、bool、string など) であること。
    • Enum 型 (32 バイト以下) であること。
    • 固定サイズバッファであること。
    • Unity の組み込み型 (例えば、Vector2、Vector3、Rect、Matrix4x4、Color、AnimationCurve) であること。
    • Serializable 属性をもつカスタム構造体であること。
    • UnityEngine.Object から派生するオブジェクトへの参照であること。
    • Serializable 属性を持つカスタムクラスであること。
    • 上記のフィールド型の配列であること。
    • 上記のフィールド型の List であること。

[SerializeField]

[SerializeField] は、その値がシリアライズ可能であることを表す属性です。
インスペクタから値の更新が可能になります
暗黙的にprivate装飾子がついている状態になるため、他のスクリプトからの値の参照ができません。

public

その値がシリアライズ可能であることを表すのはSerializeFieldと同様です
インスペクタから値の更新が可能になります
他のスクリプトから値に参照ができ、上書き等も可能です。

[System.NonSerialized] public

こちらはおまけ的な要素ですが、下記の二つの要素を合わせることで
 [System.NonSerialized]:その値がシリアライズ不可を表す属性
 public:他のスクリプトから値の参照ができる 
インスペクタに表示されず、他のスクリプトからアクセスを可能とします。

まとめ

まとめると下記の様な表になります。不要な参照はない方がいいので、それぞれの要不要を判断しながら適した内容を使っていければと思います。

装飾子 インスペクタからの参照 他のスクリプトからの参照
無・private 不要 不要
[SerializeField] 必要 不要
public 必要 必要
[System.NonSerialized] public 不要 必要

おすすめ書籍

suzuki

シェア
執筆者:
suzuki
タグ: Unity

最近の投稿

Goの抽象構文木でコードを解析する

はじめに Goでアプリケーショ…

4時間 前

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

4週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

1か月 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前