0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Hamster OutputAdvent Calendar 2024

Day 17

【Unity】とりあえずAssemblyDefinitionFilesを使ってみる

Last updated at Posted at 2024-12-25

はじめに

この記事はHamster Output Advent Calendar 2024の17日目の記事です!

本記事はとりあえず、AssemblyDefinitionFilesの使い方を簡単に書いた記事です。名前だけ聞いたことがある方や、気になってるけど使い方が分からない方はぜひ...自分も最近使い始めたばかりなので、詳細に詳しいわけではありませんが...

参考にしたリンク

何ができるか

・どこからでも参照ができなくなる

Unityでクラスを作ると、どのクラスからでも参照することができますがAssemblyDefinitionを利用すると、参照を明示的に設定する必要があるので、知らない間にチームメンバーにクラスを参照される...っていう事故を減らせます。(場合によるかも...?)

・循環参照ができなくなる

AとBというクラスがあった時に、AがBを参照して、BがAを参照するみたいなことを循環参照とか言ったりしますが、AssemblyDefinitionを利用するとこれができなくなります。

・コンパイルが早くなる(実はあまり分かっていない)

↓ Unityでのこれが多少早くなるらしいです。
image.png

とりあえず使ってみる

・準備と確認

AppleとHumanのフォルダーを作ります。

image.png

作ったフォルダーにAssemblyDefinitionをそれぞれ作ります。Create → Scripteing → AssemblyDefinition

今回、名前はフォルダーと同じ名前を付けました。

image.png

そして、AssemblyからAutoReferencedの設定を外します。この設定をオフにすると毎回コンパイルする対象から外れるのと、AssemblyDefinitionを設定していないクラスからの参照ができなくなります。
image.png

ついでに、AppleとHumanのMonoBehaviourのスクリプトを作り、中にpublicメソッドのLogを用意します。HumanもAppleと内容が一緒です。

public class Apple : MonoBehaviour
{
    private void Start()
    {

    }

    public void Log()
    {
        Debug.Log("Apple");
    }
}

ここまでできたら、AppleクラスからHumanクラスを参照して見ようと思います。名前を入力して検索一覧を確認するとHumanが存在しないことが分かります。つまりどこからでも参照できた...というのができなくなっています。もちろんHumanからAppleを探しても同じ内容になります。

image.png

・参照してみる

AppleのAssemblyDefinitionをクリックしてインスペクタから参照の設定を行います。Assembly Definition Referenscesという項目の+をクリックしてHumanのAssemblyDefinitionを追加します。
image.png

最後に、下側にあるApplyを押します。
image.png

そして、Appleクラスからもう一度Humanを参照して見ると...検索一覧にHumanクラスが表示されるようになりました。
image.png

GUIから参照の設定を行う必要があるので少し手間がかかりますが、参照している部分が分かるようになる利点もあります。

image.png

・循環参照をするとどうなるか

先ほどAppleのAssemblyDefinitionでHumanを参照したようにHumanからAppleを参照して見たいと思います。そうすると下のエラーが出てきます...

こんな感じのエラーが出ます。
image.png

翻訳すると循環参照するな!というエラーが出てますね。Humanか、AppleのどちらかのAssemblyから片方の参照を消せばこのエラーは解決できます。
image.png

・internalアクセス修飾子の出番もある

Assemblyを切り分けるとinternalというアクセス修飾子が効力を発揮するようになります。Assemblyの参照を行うと、そのファイルの中にあるクラスを全て参照することができますが、internalをつけると、同じファイル内の参照であれば、public、違うファイルからの参照だとprivateになるということができるので、参照させたいクラスを決めることができます。

例えば、Humanクラスのアクセス修飾子をpublicからinternalに変えると、

internal class Human : MonoBehaviour

Appleクラスから参照することができなくなります。
image.png

・namespaceの設定

RootNamespaceに名前を付けると、クラスを作成した時に自動でnamespaceを追加してくれます。
image.png

・デメリット

UIやInputSysytemなど、今まで使ってた機能を参照する時にAssemblyを設定する必要があるのでこの部分はかなり面倒です。

ゲーム開発で使う場合、○○がない...?あれ?見たいなヒューマンエラーがよく起きます。

Assemblyを分けすぎると地獄を見る

Assemblyを分けていないクラスからアクセスできなくなる

どんな時に使うべきか

チームでゲーム開発をする時に参照関係や依存関係を考えたい時とかがおすすめです。

いきなり開発に入れると躓くと思うので、事前に少し触ってから導入することをおすすめします(一敗)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?