スクリプトを育てていく と、Inspectorの設定欄が増えてきます。数字の入力欄が7つ並んで、どれが明るさで、どれが待ち時間なのか分からなくなります。
しばらく経ってから開くと、自分でも迷います。他の人にPrefabを渡したときは、なおさらです。
この記事では、属性(Attribute)を使ってInspectorを読みやすくする 方法を解説します。コードの動きは変わりません。設定する人の見え方だけが変わります。
この記事でわかること
- Header・Tooltip・Rangeがそれぞれ何をするか
- Rangeは入力を制限するだけで、コードには効かないこと
- Inspectorに出す設定と、同期する変数の違い
- 属性を付けすぎない目安
変数と参照 を試した状態から始めます。
属性は、コードに付ける付箋
属性 は、変数やメソッドの上に付ける [ ... ] の記述です。処理そのものは変えず、「これはこう扱ってほしい」という指示を添えます。
コードに付箋を貼るイメージです。付箋の内容によって、Unityの見せ方が変わります。

よく使うのは4つです。
| 属性 | 何をするか |
|---|---|
[SerializeField] | private の変数をInspectorに出す |
[Header("見出し")] | その位置に見出しを入れて、まとまりを作る |
[Tooltip("説明")] | マウスを乗せたときに説明を出す |
[Range(最小, 最大)] | 入力欄をスライダーに変える |
どれも コードの動きは変えません。 設定する人の見え方だけが変わります。それでも効果は大きく、設定ミスがはっきり減ります。
実践:ライトの設定欄を整理する
ライトを操作するスクリプトに、属性を足していきます。完成すると、Inspectorが3つのまとまりに分かれて、明るさはスライダーで入力できるようになります。

1. 属性なしの状態を見る
まず、属性を最小限にしたコードから始めます。Assets/Scripts に LampSettings を作ります。
using UdonSharp;
using UnityEngine;
[UdonBehaviourSyncMode(BehaviourSyncMode.None)]
public class LampSettings : UdonSharpBehaviour
{
[SerializeField] private Light targetLight;
[SerializeField] private float dimIntensity = 0.2f;
[SerializeField] private float brightIntensity = 2f;
[SerializeField] private Color warmColor = new Color(1f, 0.85f, 0.6f);
[SerializeField] private Color coolColor = Color.white;
[SerializeField] private bool startBright;
private bool isBright;
private void Start()
{
isBright = startBright;
Apply();
}
public override void Interact()
{
isBright = !isBright;
Apply();
}
private void Apply()
{
if (targetLight == null) return;
targetLight.intensity = isBright ? brightIntensity : dimIntensity;
targetLight.color = isBright ? coolColor : warmColor;
}
}
Cubeに付けてInspectorを見てください。6つの項目が区切りなく並んでいます。どれが明るさで、どれが色なのか、名前を読まないと分かりません。
2. Headerでまとまりを作る
いちばん効くのが Header です。変数の上に置くと、その位置に見出しが入ります。
[Header("操作するライト")]
[SerializeField] private Light targetLight;
[Header("明るさ")]
[SerializeField] private float dimIntensity = 0.2f;
[SerializeField] private float brightIntensity = 2f;
[Header("色")]
[SerializeField] private Color warmColor = new Color(1f, 0.85f, 0.6f);
[SerializeField] private Color coolColor = Color.white;
[Header("起動時の状態")]
[SerializeField] private bool startBright;
Inspectorが4つのまとまりに分かれます。同じ種類の設定が並んでいる ことが、見ただけで分かるようになりました。
見出しの数は3〜4個までにします。1項目ごとに見出しを付けると、かえって読みにくくなります。
3. Tooltipで説明を添える
名前だけでは意味が伝わらない項目に、説明を足します。
[Header("明るさ")]
[Tooltip("消灯側の明るさ。0にすると完全に消えます")]
[SerializeField] private float dimIntensity = 0.2f;
[Tooltip("点灯側の明るさ。部屋の広さに応じて調整します")]
[SerializeField] private float brightIntensity = 2f;
Inspectorでその項目にマウスを乗せると、説明が出ます。
すべての項目に付ける必要はありません。間違えやすいもの、単位が分かりにくいもの だけに絞ります。「明るさ」に「明るさです」と書いても意 味がありません。
4. Rangeでスライダーにする
数値に上限と下限があるなら、スライダーにすると入力が速くなります。
[Header("明るさ")]
[Tooltip("消灯側の明るさ。0にすると完全に消えます")]
[Range(0f, 1f)]
[SerializeField] private float dimIntensity = 0.2f;
[Tooltip("点灯側の明るさ。部屋の広さに応じて調整します")]
[Range(0f, 8f)]
[SerializeField] private float brightIntensity = 2f;
Inspectorの入力欄がスライダーに変わります。ドラッグしながら、実際の明るさを見て決められます。
Playしながらスライダーを動かすと、部屋の明るさがリアルタイムで変わります。値を決めるのが一気に楽になります(Play中の変更は保存されないので、決めた値は停止後に入れ直してください)。
5. 確かめる
Inspectorを見て、4つとも変わっているか確認します。
| 見るところ | 期待する表示 |
|---|---|
| 項目名 | dimIntensity が Dim Intensity と自動で整形されている |
| まとまり | 「明るさ」「色」「起動時の状態」の見出しで区切られている |
| マウスを乗せる | 説明の吹き出しが出る |
| 明るさの欄 | 入力欄ではなくスライダーになっている |
4つとも、コードの動きは1行も変わっていません。 変わったのは、あとから設定する人の手間だけです。