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 10

【Unity】何となく使ってるアクセス修飾子を調べた

Last updated at Posted at 2024-12-09

はじめに

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

今まで、アクセス修飾子をつける時に多分こういう感じなんだなと考えていて、つける時にもやもやしていました。そこで、アドベントカレンダー走ってるし、アウトプットしちゃえ!というノリで作った記事です。

アクセス修飾子って何...?

クラスやメソッド、変数の前につけるpublicprivateのことをアクセス修飾子といいます。

public class Test : MonoBehaviour
{
    private void Start()
    {
        
    }

    private void Update()
    {
        
    }
}

Microsoftの公式ページにはこう書かれています。

アクセス修飾子は、メンバーまたは型の宣言されたアクセシビリティを指定するときに使用されるキーワードです。

なるほど、型に対するセキュリティやルール見たいな感じですね。アクセス修飾子が5つあるらしいので、それぞれの違いを調べて見ます。

それぞれのアクセス修飾子の違い

・public

アクセス制限なし!どのクラスからでも参照可能!

僕も初めて作ったゲームではpublicしか付けてませんでした。後は制作期間が短いゲーム制作とかも...

色々な記事にも書いてあったりしますが、ゲーム開発に慣れてきたら何でもかんでもpublicにするのは止めましょう!半年~1年立った後にゲームをブラッシュアップするぞ~ってなった時に地獄を見ます(2敗)

・protected

継承されていればアクセスできる。していなければアクセスできないという考え方で良いと思います。

下にprotectedを使ったクラスと利用するクラスを用意して、いつも通りアクセスして見ますが...クラス参照はできても、変数は参照出来ません。

public class TestProtected : MonoBehaviour
{
    protected int _num = 999;
}

public class Test : MonoBehaviour
{
    private TestProtected _testProtected;

    private void Start()
    {
        _testProtected = GetComponent<TestProtected>();
        
        // この下がエラーになる
        _testProtected._num += 1;
    }
}

TestクラスにTestProtectedを継承すると、アクセスできるようになります!

public class TestProtected : MonoBehaviour
{
    protected int _num = 999;
}

public class Test : TestProtected
{
    private void Start()
    {
        // 継承なので変数をそのまま利用できる
        _num += 1;
    }
}

思い返してみれば、protectedを利用したこともなければ継承もあまり使っていないのでは........

・internal

同じアセンブリ内ならアクセスできる!それ以外ならアクセスできない!

正直に言うとinternalに関しては、最近使いだしたばかりなので、アセンブリが~とか良く分かりません。何でも、コンパイル単位でアクセスが許可される~~~という。

Unityでこのアクセス修飾子だけを付けても意味がないです。Assembly Definitionと一緒に使うことで利用できるようになります。中間言語が~~など様々なことがありますが、また今度別記事にてアウトプットします。

・protected internal

protectedとinternalの組み合わせです。

・private

どこからもアクセスできない。使えるのは定義したクラスのみ
C#では、アクセス修飾子を何も宣言しなかった場合、デフォルトでprivateになります。

// 何も宣言しなければデフォルトでprivateになる
int _num;

動作確認でクラスを作ってましたが、class自体もアクセス修飾子が無ければデフォルトでpublic見たいです。interfaceもデフォルトでpublicなので同じですね。

・private protected

privateとprotectedの組み合わせです。

・file

宣言された型は現在のソース ファイルでのみ表示されます。 ファイル スコープ型は一般にソース ジェネレーターに使用されます。

C#のバージョン11から追加された見たいです。全く分かりません。

まとめ

使ったこともあるけど、ほとんど使ったことがないアクセス修飾子ばかり!!!
fileに関してはC#バージョン11見たいなので、ゲーム開発で使うのはまだなさそう。

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?