Version: Unity 6.0 (6000.0)
言語 : 日本語
スクリプトの作成
スクリプトの検査

スクリプトの名前設定

スクリプトファイル名や、ファイル内で宣言されるクラス名は慎重に選択する必要があります。適切なファイル名を使用し、名前空間でクラスを整理すると、コンパイラーがクラスをエラーなしで識別できるようになります。

スクリプトファイル名

スクリプトの作成時に入力したファイル名は、その中で定義するクラス名にも使用されます。スクリプトファイル名は、その中で定義するクラス名と一致させることを推奨します。

Unity のビルトインの型 MonoBehaviour と型 ScriptableObject から派生したスクリプトでは、ファイル名が一致しなくても、スクリプトで定義されたクラス型を解決できますが、いくつかの制限があります。

  • スクリプトで複数のクラスが定義されている場合、Unity はファイルと同じ名前のクラスを選択します。
  • C# の partial キーワードを使用して、複数のファイルで単一の MonoBehaviour 派生クラスを定義する場合、partial クラスと同じ名前のファイルのみを コンポーネント として使用できます。

ノート: クラス名が特定のファイルと明確に一致しない場合、Unity は警告を表示します。

クラス名と名前空間

同じ名前のクラスがプロジェクトの異なる部分で宣言されている場合、名前の競合が発生します。名前の競合が発生する可能性は、プロジェクトのスケールと協力者の数に応じて増加します。例えば 1 人の開発者がメインプレイヤーキャラクターの制御コードを作成し、別の開発者が敵キャラクターに使用する同等の制御コードを作成したとします。両方の開発者がメインクラス Controller の呼び出しを選択した場合、コンパイラーはコード内の Controller の使用がどのクラスを参照しているかを判断できません。

クラス名の競合を避けるために、C# プログラミングではクラスを名前空間の下に整理することをお勧めします。名前空間はクラスの集合体であり、クラス名の前に付けられた名前空間は、そのクラスを完全に明確に参照する方法を提供します。詳細については、名前空間 に関する Microsoft のドキュメントを参照してください。

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

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

これらのクラスは、完全な名前を使用することでコード内で明確に参照できます。完全な名前とは名前空間とクラス名を合わせたものであり、この場合はそれぞれ Enemy.Controller1Enemy.Controller2 です。名前空間宣言は、既存のクラス宣言を囲んで追加できるため、すべてのクラス名を個別に変更する必要はありません。クラスがどこにあっても (別のソースファイルにあっても)、クラスを囲んで名前空間宣言を追加することができます。

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

using Enemy;

これにより、コンパイラーは、このファイル内の Controller1 および Controller2 への参照をそれぞれ Enemy.Controller1 および Enemy.Controller2 として解決します。スクリプトが別の名前空間にある同じ名前のクラスも参照する必要がある場合 (例えば Player)、名前空間のプレフィックスを指定しなければなりません。競合するクラス名を含む 2 つの名前空間が同じファイルの using ディレクティブを使用してインポートされた場合、コンパイラーエラーが発生します。

複数の名前空間の制限

Unity には、名前空間、MonoBehaviour、ScriptableObject クラスに関する特定の制限があります。ファイルに MonoBehaviour または ScriptableObject クラスの定義が含まれている場合、そのファイル内で複数の名前空間を使用することはできません。

Unity はコンソールに以下の警告を表示します。

Class MyClass can not exist in multiple namespaces in the same file, even if one is excluded with preprocessor directives. Please move these to separate files if this is the case.

MonoBehaviour を 1 つの名前空間で定義するファイルがあり、同じファイル内 で他のクラスが別の名前空間で定義されている場合、Unity は MonoBehaviour クラスを認識しないため、ゲームオブジェクトに使用できません。この制限は、インポートとコンパイルのスピードを向上するために Unity 2020.1で導入されました。そのため、この制限が導入される前に作成された一部の古いアセットストアパッケージが、結果として正しく機能しない場合があります。この問題を修正するには、各名前空間のクラスのコードを別のファイルに分けてください。

追加リソース

スクリプトの作成
スクリプトの検査