Unityの便利な属性一覧

## はじめに
Unityには、スクリプトをより便利に、そして効率的に書けるようにするための属性（Attribute）が用意されています。これらの属性を活用することで、インスペクターでの操作性を向上させたり、エディタ拡張を簡単に実現できます。

この記事では、Unityでよく使用される属性について、それぞれの機能を簡単にまとめた一覧をご紹介します。開発の参考にぜひご活用ください！

---

## 一覧
以下は、Unityでよく使われる属性の説明をカテゴリごとにまとめたものです。

| カテゴリ               | 属性名                   | 説明                                                                                     |
|-------------------------|--------------------------|------------------------------------------------------------------------------------------|
| シリアライズとインスペクター関連 | `[SerializeField]`        | プライベートなフィールドをインスペクターで編集可能にする。                                |
|                         | `[HideInInspector]`      | `public`フィールドをインスペクターで非表示にする。                                       |
|                         | `[NonSerialized]`        | フィールドがシリアライズされないようにする。                                             |
| データ検証と制限        | `[Range(min, max)]`      | 数値の範囲を制限してスライダーをインスペクターに表示する。                               |
|                         | `[Min(value)]`           | フィールドの最小値を指定する（インスペクターでも値を制限）。                             |
|                         | `[Max(value)]`           | フィールドの最大値を指定する（インスペクターでも値を制限）。                             |
|                         | `[Multiline]`            | `string`型に適用し、インスペクターで複数行入力が可能なエリアを表示する。                |
|                         | `[TextArea(min, max)]`   | `string`型に適用し、指定したサイズでテキスト入力フィールドをインスペクターに表示する。   |
| スクリプトとエディタ関連 | `[ExecuteInEditMode]`    | スクリプトがエディタモードでも実行されるようにする。                                     |
|                         | `[ExecuteAlways]`        | 常にスクリプトを実行する（エディタモード・プレイモード問わず）。                         |
|                         | `[RequireComponent]`     | 指定したコンポーネントを自動的に追加する。                                               |
|                         | `[AddComponentMenu]`     | コンポーネントメニューで表示する際の位置や名前を変更する。                                |
|                         | `[DisallowMultipleComponent]` | 同じスクリプトが複数回アタッチされないよう制限する。                               |
|                         | `[DefaultExecutionOrder]`| スクリプトの実行順序を指定する。                                                        |
|                         | `[HelpURL]`              | コンポーネントのインスペクターにヘルプリンクを追加する。                                 |
| 描画とデバッグ          | `[Gizmo]`                | シーンビューでカスタムのギズモを描画する際に使用。                                       |
|                         | `[ContextMenu]`          | インスペクターのコンポーネントメニューにカスタムメソッドを追加する。                     |
|                         | `[ContextMenuItem]`      | インスペクター上のフィールドに関連するメニュー項目を追加する。                          |
|                         | `[Tooltip]`              | インスペクターのフィールドにマウスオーバーしたときに表示される説明文を設定する。         |
| その他特殊な属性        | `[Obsolete]`             | 非推奨のメソッドやクラスをマークし、警告メッセージを表示する。                           |
|                         | `[Header]`               | インスペクターでセクションのタイトルを追加する。                                          |
|                         | `[Space]`                | インスペクターで指定した高さ分のスペースを追加する。                                      |
|                         | `[FormerlySerializedAs]` | 名前変更前のフィールド名を保持して、既存のシリアライズデータとの互換性を維持する。      |
|                         | `[HideFlags]`            | オブジェクトの表示/隠蔽フラグを設定する（エディタ専用）。                                |

## 使用例
ここでは、Unityの属性の中からいくつかをピックアップし、実際にどう使うのかをコードで説明します。

### **1. `[SerializeField]` を使ったプライベート変数のインスペクター表示**
`[SerializeField]`を使えば、プライベートな変数をインスペクター上で編集可能にできます。これにより、カプセル化を維持しつつ値を外部から調整できます。

```csharp
using UnityEngine;

public class Player : MonoBehaviour
{
    [SerializeField]
    private int health = 100; // インスペクターで編集可能だが、外部スクリプトからは直接アクセス不可

    [SerializeField]
    private GameObject weapon; // インスペクターでオブジェクトを割り当て可能
}
```

### **2. `[Range]` を使ったスライダーの表示**
`[Range]`を使うと、指定した数値範囲内でインスペクター上にスライダーを表示できます。

```csharp
using UnityEngine;

public class Enemy : MonoBehaviour
{
    [Range(0, 100)]
    public int speed = 50; // スライダーで0～100の範囲内で値を設定可能

    [Range(0f, 1f)]
    public float attackRate = 0.5f; // 0～1の範囲でスライダー表示
}
```

### **3. `[Tooltip]` を使った説明の追加**
`[Tooltip]`を使うことで、フィールドにマウスオーバーしたときに説明を表示できます。チームメンバーや他の開発者に意図を伝えるのに便利です。
```csharp
using UnityEngine;

public class Enemy : MonoBehaviour
{
    [Range(0, 100)]
    public int speed = 50; // スライダーで0～100の範囲内で値を設定可能

    [Range(0f, 1f)]
    public float attackRate = 0.5f; // 0～1の範囲でスライダー表示
}
```

## さいごに
Unityの属性は、エディタ操作の効率化やコードの簡潔化に非常に役立ちます。特にプロジェクトが大規模になるほど、適切な属性を使うことで作業がスムーズになります。

この記事で紹介した属性一覧を参考に、あなたのプロジェクトで活用してみてください。もし他に便利な属性や使用例があれば、コメントで教えていただけると嬉しいです！