Version: 2023.1
言語: 日本語
コルーチン
属性

名前空間

プロジェクトが大きくなり、スクリプト数が増えるにつれてスクリプトクラス名が衝突する可能性が増大します。これはゲームの異なるパーツを別々に作業し、最終的に同じプロジェクトに統合する場合に当てはまります。例えば一人のプログラマがメインプレイヤーの制御コードを作成し、もう一人が敵キャラクターの制御コードを作成したとします。二人ともメインのスクリプトクラスを Controller と命名してプロジェクト統合したときに名前が衝突します。

ある一定の範囲までは、ネーミングルールを導入したり、衝突する都度に名前変更することで問題は避けられます(例.先の例ならばクラスは PlayerController および EnemyController という名前をつける、等)。しかし衝突するクラスが複数あったり、変数がその名前をつけて宣言されている場合は面倒です。各々のクラス名の使用箇所をひとつひとつ変更しないとコンパイルができません。

C# 言語には Namespace (名前空間) と呼ばれる機能を提供していて、堅牢な方法でこの問題が解決できます。名前空間はクラス名にプレフィックスをつけて使用されるクラスの集合です。詳細は、Microsoft の 名前空間 に関するドキュメントを参照してください。

以下の例では、クラス Controller1Controller2Enemy という名前空間のメンバーです。

namespace Enemy {
    public class Controller1 : MonoBehaviour {
        ...
    }
    
    public class Controller2 : MonoBehaviour {
        ...
    }
}

コードの中で、これらのクラスは各々 Enemy.Controller1Enemy.Controller2 との名前で使用されてます。これは名前空間の宣言は既存クラスの宣言の周りにブラケットをつけることができるため、クラスの名前変更をするよりよい方法です(すなわち、個別のクラスの名前をすべて変更する必要がないため)。さらに異なるソースファイルにあったとしても複数のブラケットの付いた名前空間をいつでもつけることができます。

名前空間のプレフィックスを繰り返し入力することを避けるにはファイルの先頭で using を追加します。

 using Enemy;

この行により Controller1Controller2 が見つかったところでは、各々 Enemy.Controller1Enemy.Controller2 にと解釈されます。もしスクリプトが別の名前空間から同じ名前のクラスを参照する必要がある場合(例えば Player )もプレフィックスを使い続けることができます。ただし、衝突するクラス名を含む二つの名前空間が using ディレクティブを使用して同時にインポートされた場合はコンパイラでエラーが発生します。

ノート: Unity には、名前空間と MonoBehaviour クラスまたは ScriptableObject クラスに関連する特定の制限があります。ファイル内に MonoBehaviour クラスまたは ScriptableObject クラスの定義がある場合、対象のファイル内で複数の名前空間を使用することはできません。

Unity では、コンソールに以下のような警告が表示されます。 MyClass クラスは、プリプロセッサーディレクティブで除外しても、同一ファイル内の複数の名前空間に存在することはできません。このような場合は、これらを別のファイルに移動してください。

つまり、ある名前空間に MonoBehaviour を定義するファイルが存在し、同じファイル内に別の名前空間の他のクラスが存在する場合、Unity は MonoBehaviour クラスを認識せず、ゲームオブジェクトで使用することができなくなるということです。この制限は Unity 2020.1 でインポートとコンパイルの速度を向上させるために導入されたため、この制限が導入される前に書かれた古い Asset Store パッケージは、結果として正しく機能しない場合があります。この課題に関連する問題を解決するには、各名前空間のクラスのコードを別々のファイルに分離してください。

コルーチン
属性