Unityで変数をインスペクターに表示するか制御する方法

Unityでは、変数をインスペクターに表示するかどうかを制御することができます。また、外部スクリプトからのアクセス可否についても適切に設計することで、コードの保守性と可読性を向上させることが可能です。この資料では、変数の表示・非表示を管理する方法とその実践例を説明します。


方法1: [HideInInspector] 属性を使用してインスペクターに非表示にする

[HideInInspector] 属性を使用することで、public 修飾子の変数をインスペクターに表示しないように制御できます。この場合、外部スクリプトからのアクセスは可能です。

サンプルコード

using UnityEngine;

public class Example : MonoBehaviour
{
    [HideInInspector]
    public int hiddenValue; // インスペクターには表示されないが、外部スクリプトからアクセス可能

    public int visibleValue; // インスペクターに表示される
}

特徴

  • インスペクター: 非表示
  • 外部スクリプトからのアクセス: 可能
  • 用途例: 開発中にインスペクターでの編集を避けたいが、他のスクリプトから利用する変数に適用。

方法2: private 変数 + [SerializeField] 属性で制御する

private 修飾子の変数に [SerializeField] を付与すると、外部スクリプトからのアクセスを禁止しつつ、インスペクターには表示可能になります。

サンプルコード

using UnityEngine;

public class Example : MonoBehaviour
{
    [SerializeField]
    private int serializedValue; // インスペクターには表示されるが、外部スクリプトからはアクセス不可

    private int privateValue; // インスペクターにも表示されず、外部スクリプトからもアクセス不可
}

特徴

  • インスペクター: 表示可能([SerializeField] 使用時)
  • 外部スクリプトからのアクセス: 不可
  • 用途例: 外部からの直接操作を避けたいが、Unityエディタでの編集を許可する変数に適用。

方法3: プロパティを使用して制御する

プロパティを使用すると、変数のインスペクター表示を避けつつ、外部スクリプトから条件付きで値を取得・設定できます。

サンプルコード

using UnityEngine;

public class Example : MonoBehaviour
{
    private int hiddenValue; // インスペクターには表示されない

    public int HiddenValue
    {
        get => hiddenValue; // 値を取得
        set => hiddenValue = Mathf.Clamp(value, 0, 100); // 値を制限して設定
    }
}

特徴

  • インスペクター: 非表示
  • 外部スクリプトからのアクセス: 可能(プロパティ経由)
  • 用途例: 値の変更に制限や条件を設けたい場合。

比較表

方法インスペクター表示外部スクリプトアクセス用途例
[HideInInspector]非表示可能他スクリプトから操作するが表示を隠したい
private + [SerializeField]表示不可Unityエディタ内でのみ利用する変数
プロパティ非表示可能(制御可能)値の操作に条件やロジックを追加したい

実践例: [HideInInspector] の活用

以下は、敵キャラクターのスクリプトで一時的なカウンターを隠しつつ、外部スクリプトからアクセスする例です。

サンプルコード

using UnityEngine;

public class Enemy : MonoBehaviour
{
    [HideInInspector]
    public int internalCounter; // カウンターはインスペクターに表示されないが、外部スクリプトから操作可能

    public int health = 100; // インスペクターに表示される

    void Update()
    {
        internalCounter++;
        if (internalCounter >= 100)
        {
            Debug.Log("Action triggered!");
            internalCounter = 0;
        }
    }
}

注意点

  1. デバッグ時の確認
    [HideInInspector] を使用するとインスペクターで変数を確認できなくなるため、Debug.Log やブレークポイントを利用してください。
  2. シリアライズの影響
    変数がシリアライズされている場合、ゲームオブジェクトの状態保存に影響を与える可能性があります。

これらの方法を適切に組み合わせることで、開発プロジェクトの柔軟性と効率を高めることができます。必要な要件に応じて最適な方法を選択してください。

Unity

Posted by hidepon