テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

「同じNameSpaceで、同じクラス名の、異なるクラス」は実在した!

ここでクイズです

f:id:tsubaki_t1:20150726060830p:plain

以下の問いに答えよ

Test1.csとTest2.csがAssetsフォルダ直下とAssets/Pluginsフォルダ直下にそれぞれ1つずつあります。Assets/Pluginsフォルダ下のTest1コンポーネントをシーンから呼び出した場合、プログラムはどのように動作するでしょうか。

コードの内容は以下の通り

  • Test1はTest2のHogeメソッドを呼び出すクラスです。
  • HogeメソッドはAssetsフォルダ以下にあるTest2のコードでは「A」、Assets/Pluginsフォルダ以下にあるTest2のコードでは「B」とコンソールにログを出力します。

 さて、回答をどうぞ。

  1. 「AB」と表示される
  2. 「A」と表示される
  3. 「B」と表示される
  4. 動かない。エラーが出る。

 答え

 3。

問題

今個人的に未使用なアセットを削除する機能を作成している訳ですが、どうもおかしな挙動が発生するので原因を調べたところ、「同じNameSpace内の同じクラス名の異なるクラス」が実は利用できてしまう事に気づいてしましました。

通常、同一NameSpaceの同一クラスがある場合は「error CS0101: The namespace `global::' already contains a definition for ***」のような形でエラーが出るのですが、PluginsやStandard Assetsの中とそれ以外で同一のクラスがあった場合、エラーなしで使用出来てしまうみたいです。

f:id:tsubaki_t1:20150726060139p:plain

 

何故かと言えば、Standard AssetsやPluginsはAssembly-CSharp-firstpass.dllにビルドされますが他はAssembly-CSharp.dllにビルドされます。異なるアセンブリなので、こういった事が通るみたいです。これ一応C#的には可能みたいです。MSDNでそれっぽいのがチラチラと。

まぁ、コードエディタやシーン的には別物として扱われますが、正直追いにくくなるので避けましょう…って事で。

発覚理由

Unityのサンプルプロジェクトは、Standard Assetsを使用しているのですが、デモによってはStandard Assetsフォルダに入れてない事があり、これのせいでクラスの重複が起こりました。

で、プロジェクト内で使用していないアセットを削除するエディタ拡張を試作中 ソースコード解析は複数の同一型に対応出来てなかったので、コード解析がおかしな結果になってました。

この場合、同一のクラスだからと言って違うファイルを弄ってると変更が反映されないので、気を付けましょうまる。

 

…さて、どうやって区別しようかしら。

 

追記

プロジェクト内で使用していないアセットを削除するエディタ拡張を試作中 ですが、試したいって人は、@tsubaki_t1に 言ってもらえればアセットを渡します。