【Unity/C#】属性(Attribute)とは?

Unity/C#

Unityの属性(Attribute)は、クラスやメソッド、プロパティに特定のメタデータや機能を追加するための仕組みです。Unityでは、C#の標準的な属性(Attribute)に加えて、エディタでの動作や表示をカスタマイズするための特定の属性(Attribute)も提供されています。この記事では、Unityでよく使われる属性(Attribute)について、その役割や使い方を解説します。

ちなみにAttributeはアトリビュートと読みます。


1. 属性(Attribute)とは?

属性(Attribute)は、クラス、メソッド、フィールドなどに追加するメタデータの一種です。C#では、[ ]の中に属性(Attribute)を記述します。例えば、以下のように使用します。

[Serializable]
public class PlayerData
{
public string playerName;
public int score;
}

上記の例では、[Serializable]属性(Attribute)PlayerDataクラスに付与され、これによりUnityのシリアライズシステムがこのクラスのインスタンスを保存できるようになります。


2. 代表的な属性(Attribute)

2.1 [SerializeField]

[SerializeField]は、プライベートフィールドでもUnityのインスペクタに表示させたい場合に使用します。通常、パブリックフィールドのみがインスペクタに表示されますが、セキュリティやカプセル化の観点から、プライベートフィールドにしたい場合があります。このような場合、[SerializeField]を使ってフィールドをシリアライズ可能にします。

public class Example : MonoBehaviour
{
[SerializeField]
private int playerHealth;
}

2.2 [HideInInspector]

[HideInInspector]は、パブリックフィールドをインスペクタ上で非表示にしたい場合に使用します。フィールドはパブリックですが、エディタ上での操作は避けたい場合に便利です。

public class Example : MonoBehaviour
{
[HideInInspector]
public int hiddenValue;
}

2.3 [Range(min, max)]

[Range]は、スライダーを使って数値を設定できるようにする属性(Attribute)です。主に浮動小数点数や整数型の変数に適用され、エディタ上での入力を直感的に行うことができます。

public class Example : MonoBehaviour
{
[Range(0, 100)]
public int speed;
}

2.4 [Tooltip(“説明”)]

[Tooltip]は、フィールドに説明を追加できる属性(Attribute)です。インスペクタ上でフィールドにマウスを乗せると、指定したツールチップが表示されます。エディタ内での説明を充実させることで、コードの意図を明確に伝えることができます。

public class Example : MonoBehaviour
{
[Tooltip("プレイヤーの最大体力を設定します。")]
public int maxHealth;
}

2.5 [Header(“セクション名”)]

[Header]は、インスペクタ内で特定のフィールドを視覚的に区切るためのラベルを表示する属性(Attribute)です。多数のフィールドがある場合、コードや設定のセクションを視覚的に整理できます。

public class Example : MonoBehaviour
{
[Header("Player Settings")]
public string playerName;
public int playerAge;
}

2.6 [ContextMenu(“メニュー項目名”)]

[ContextMenu]は、エディタ上でスクリプトの特定のメソッドを右クリックメニューから実行できるようにする属性(Attribute)です。開発中にエディタ上で手動操作を行いたい場合に便利です。

public class Example : MonoBehaviour
{
[ContextMenu("Reset Player Data")]
void ResetData()
{
// プレイヤーデータのリセット処理
}
}

3. その他の属性(Attribute)

3.1 [RequireComponent]

[RequireComponent]は、指定したコンポーネントが同じオブジェクトに必ず存在するようにする属性(Attribute)です。たとえば、あるスクリプトを付けたゲームオブジェクトに特定のコンポーネント(例:RigidbodyAudioSource)を必須としたい場合に使用します。Unityエディタでスクリプトをオブジェクトにアタッチする際に、自動的に指定されたコンポーネントも追加されます。

[RequireComponent(typeof(Rigidbody))]
public class PlayerController : MonoBehaviour
{
void Start()
{
Rigidbody rb = GetComponent<Rigidbody>();
}
}

3.2 [ExecuteInEditMode]

[ExecuteInEditMode]は、通常は再生モード中にのみ実行されるMonoBehaviourメソッド(UpdateStartなど)をエディタモード中にも実行可能にする属性(Attribute)です。この属性(Attribute)を使用することで、開発中にシーンの中で即座に変更を確認でき、デバッグやデータ調整が容易になります。

[ExecuteInEditMode]
public class Example : MonoBehaviour
{
void Update()
{
// エディタモード中でもUpdateが実行される
Debug.Log("This runs in both play and edit mode.");
}
}

3.3 [DisallowMultipleComponent]

[DisallowMultipleComponent]は、同じコンポーネントを複数回追加できないように制約を設ける属性(Attribute)です。たとえば、特定のコンポーネントが一つのオブジェクトに複数回存在することが意味をなさない場合、この属性(Attribute)を利用します。

[DisallowMultipleComponent]
public class SingletonComponent : MonoBehaviour
{
// このコンポーネントは1つのオブジェクトに1つだけ追加できる
}

3.4 [SelectionBase]

[SelectionBase]は、シーンビューでのオブジェクト選択時に、子オブジェクトではなく常に親オブジェクトを選択するようにする属性(Attribute)です。複雑な階層を持つオブジェクトの操作を簡単にするために役立ちます。

[SelectionBase]
public class MainObject : MonoBehaviour
{
// 子オブジェクトではなく、このオブジェクトを選択する
}

4. カスタムアトリビュートの作成

Unityでは、独自の属性(Attribute)を作成することも可能です。カスタムアトリビュートを作成する際には、System.Attributeを継承して新しいクラスを定義します。

using UnityEngine;

public class CustomAttribute : PropertyAttribute
{
public string label;

public CustomAttribute(string label)
{
this.label = label;
}
}

これを用いることで、さらに独自の機能をスクリプトやエディタ上に追加できます。


5. まとめ

Unityの属性(Attribute)は、エディタでの作業効率を向上させるための強力なツールです。コードに属性(Attribute)を追加することで、インスペクタでの表示や編集方法を細かく制御できるようになります。

これにより、開発プロセスを最適化し、他のチームメンバーとのコミュニケーションも円滑になります。また、個人で制作する場合でもアップデートの際にとても有効です。

「動けばいい」という概念から脱却し、「誰が見てもわかりやすい」という更なる高みを一緒に目指しましょう!

ゲ制最高!

コメント

タイトルとURLをコピーしました