こんにちは!
今回はUnity C#の「using namespace」で他のスクリプト(script)から参照しようとしたら、下のようにエラーが出て参照できなかったので、そのことについてシェアしたいと思います。

①現象
Unity Asset Store から2つのアッセットをダウンロード、自分のプロジェクトにインポートしました。
そして、一方のアッセット内のスクリプトから、もう一方のアッセット内のスクリプトの名前空間(namespace)を参照しようとしたら、上に書いたように
「型または名前空間の名前’***’が見つかりませんでした(usingディレクティブまたはアセンブリ参照が指定されていることを確認してください)。」
というエラーが出てきて参照できませんでした。
ネットで、
「unity namespace 参照できない」
「unity namespace 見つからない」
と検索しても良い記事が見つからず。。。
異なるフォルダにスクリプトがあるのが原因かと思い、
「unity namespace フォルダ違い」
「unity 他の階層のフォルダ スクリプト 参照できない」
「unity 異なる親フォルダ スクリプト 参照できない」
と検索しても見つからず、異なるアセットだからダメなのかと思い、
「unity アッセット複数入れたとき namespace」
「unity 他のアセット スクリプト 参照」
と検索しても見つからず、最終的にはやけくそで、
「型または名前空間の名前”が見つかりませんでした(usingディレクティブまたはアセンブリ参照が指定されていることを確認してください)。」
と検索しても欲しい答えは見つからず、テンションがガタ落ちしました。。。(/ω\)
仕方ないので、Unity上で自分でいろいろ試したら、「Plugins」というフォルダと「Assembly Definition」がクサかったので更に試行錯誤してみました。
結果、不具合の原因がある程度わかったので以下に書きました。
この記事の後半では、同じように苦労をしている方のために、具体的な解決方法も書きました。
②原因1 「Plugins」というフォルダの中にスクリプトがある場合
問題が起きた状況を再現するため、新しくUnityのプロジェクトを作成し、構成を図に示す通りにしました。

「Assets」の中に上から、
「Asset1」:インポートしたアッセットその1
「MyProject」:作業スペース
「MyScenes」:シーン保管場所
「MyScripts」:自作スクリプト保管場所
「Plugins」:「Asset2」をインポートした際に自動で作成されたフォルダ
「Asset2」:インポートしたアッセットその2
そして、フォルダ「MyScripts」の中には「Test1.cs」、「Test2.cs」の2つのスクリプトがあります。

フォルダ「Asset1」の中には「Test3.cs」があります。

フォルダ「Asset2」の中には「Test4_1.cs」、「Test4_2.cs」があります。

それぞれのスクリプトの中身はこんな感じ。





つまり、クラス「Test1」は名前空間「Namespace1」で分類され、
同じくクラス「Test2」は名前空間「Namespace2」、
クラス「Test3」は名前空間「Namespace3」、
クラス「Test4_1」とクラス「Test4_2」は名前空間「Namespace4」でそれぞれ分類されているという感じです。
上の画像からもわかるように、「Test1.cs」、「Test2.cs」、「Test3.cs」は問題なくすべての名前空間を参照できているのですが、
「Test4_1.cs」、「Test4_2.cs」は他の名前空間を参照できていません(赤の波線は参照できていないという意味)。
これは、「Plugins」というフォルダの中にスクリプトがあるためで、どうやらその中にあるスクリプトは自分を分類する名前空間以外の名前空間を認識できないみたいです。
もちろん「Test4_1.cs」は同じ名前空間である「Test4_2.cs」のクラスは参照できます。
③原因2 「Assembly Definition」がフォルダの中にある場合

プロジェクト内の構成は、基本「原因1」の時と同じですが、今度はフォルダ「Asset1」の中に「Assembly Definition」が入っています。
この場合だと「Test3.cs」から他の名前空間を参照できません。
下のようにコンソールにエラーが出てしまいます。

ちなみに、この状態であっても「Test1.cs」と「Test2.cs」からはすべての名前空間を参照できるようです。
④原因1に対する解決方法
「Plugins」というフォルダの中にスクリプトがある場合、参照したいスクリプトがあるフォルダに「Assembly Definition」を追加します。

今回はフォルダ「MyScripts」の中に「NewAssembly1」を追加しました。

ちなみに、赤丸内の名前が他の「Assembly Definition」と同じだとエラーになるので注意してください。
同じように、「Plugins」内にあるフォルダ「Asset2」にも「Assembly Definition」を追加します。

名前は「NewAssembly2」としました。
そして、フォルダ「Asset2」に追加した「Assembly Definition」の「Assembly Definition References」の「+」をクリックして、「NewAssembly1」を追加します。

インスペクターの一番下にある「Apply」を押すのも忘れずに。

Visual Studioからこんなメッセージが届いたら、「再読み込みをクリック」

これで、「Test4_1.cs」、「Test4_2.cs」から名前空間「Namespace1」、「Namespace2」を参照できるようになりました。

ただし、今度は「Test1.cs」から名前空間「Namespace3」、「Namespace4」が参照できなくなっています(名前空間「Namespace2」は同じフォルダにあるため問題ありません)。

これはフォルダ「MyScripts」の中に「Assembly Definition」の「NewAssembly1」を追加したためです。
どうやらこの方法を用いての参照は一方通行らしく、「NewAssembly2」から「NewAssembly1」を参照したため、その逆ができなくなってしまったということみたいです。
つまり、「Test1.cs」から名前空間「Namespace4」を参照するのはあきらめないといけません。
「Test1.cs」から名前空間「Namespace3」を参照したい場合はフォルダ「Asset1」に「Assembly Definition」(ここでは名前を「NewAssembly3」としました)を追加して「NewAssembly1」から「NewAssembly3」を参照すれば問題ありません。

⑤原因2に対する解決方法
フォルダ「Asset1」の中に「Assembly Definition」が入っている場合も 、「原因1」に対する解決方法と同じです。
「Test3.cs」から参照したいスクリプトがあるフォルダに「Assembly Definition」を作成、フォルダ「Asset1」内の「Assembly Definition」から新しく作成した「Assembly Definition」を参照するように設定すればOK!
一応これで説明は終了です。お疲れさまでした。
一方通行なのが苦しいですが、これでなんとか異なるアセットのスクリプトのクラスを参照できるようになりました。
今回の「Plugins」のように、Unityには特別な意味を持ったフォルダが存在するので注意です。
下のサイトが役立つと思いますので、参考にしてみてください。
なお、 「Assembly Definition」 について更に詳しく知りたいという方は下の記事が参考になるかと思います。私も勉強させていただきました。
