スクリプトのファイル名とクラス名を一致させない?

C#でスクリプトを書くときは通常クラスごとにファイルを一つ作るでしょう。公式の解説にもあるようにメニューからスクリプトを作り、名前が選択されているときにリネームするのが便利な作り方です。

Assets->Create->C# Scriptと選べば、プロジェクトブラウザー上にNewBehaviourScriptというスクリプトが追加されます。以下のように追加したタイミングではファイル名が変更できるようになっています。この瞬間だけ名前を変えることで、ファイルの中身にある文字列も一緒に変わります。

うっかりEnterキーなどを押してNewBehaviourScriptのままになってしまった場合は、ファイルのリネームとクラスのリネームは別々に行えば問題ありません。意外と面倒なので、ファイルを消してやりなおした方がおそらく楽です。

Test.csというファイル名に変更した場合は以下のようなスクリプトができます。

classのところがTestになっていて、ファイル名と一致しています。
ファイル名とクラス名が一致しているとゲームオブジェクトにアタッチできるということが重要です。 なぜそうなのかというとUnityのルールだからです。(C#ではファイル名とクラス名が一致しなくても良いようです。)
ゲームオブジェクトにアタッチするというのはスクリプトを簡単に呼び出すことができ、Unityでは以下のようにドラッグ&ドロップするだけです。

GameObjectにTestというコンポーネントが新たに設定されているのがわかると思います。


ファイル名とクラス名が一致しない場合どうなるかというと、アタッチできません。そのようなスクリプトにはインスペクタ―上に以下のような注意書きが載ります。MonoBehaviourを継承し、かつファイル名とクラス名が一致していないという注意です。これは問題ない場合もあります。(static classとかpartial classとか)

この注意書きが出ているスクリプトをアタッチしてみると、警告ダイアログが出ます。

警告にも書いてあるようにアタッチできないスクリプトということがわかりました。ただし、GUIではできないというのが今回の本題です。

GUIでの操作は駄目でしたが、スクリプトからファイル名とクラス名が一致しないスクリプトをアタッチすることができます。やり方はAddComponentを使うことです。

まずファイル名とクラス名が一致しないMonoBehaviourを継承したクラスを用意します。以下の例はファイル名がNotSame.csであり、クラス名がNotSameScriptというクラスだけのスクリプトです。

このクラスをアタッチするために次のようなTest.csを用意しました。

Testスクリプトにはゲームオブジェクトの参照が渡せます。渡した参照のゲームオブジェクトにNotSameScriptをアタッチすることになります。

こうしてアタッチすると正しく動きます。StartとUpdateしか試していませんが、動いていました。

上のように本来アタッチできないスクリプトをアタッチしたところ、アイコンが微妙に変わりました。下の図はアタッチできるTestスクリプトの場合です。コンポーネントの名前の左のアイコンとScriptという枠が違います。