【Unity】アクセス修飾子とは?他のクラスからのアクセス許可を決める

アクセス修飾子 Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「アクセス修飾子ってなに?」

「アクセス修飾子にはどういうものがあるの?」

というお悩みの方に向けた内容となっています。

Unityでのゲーム作りでは、C#を使ってプログラミングを記述していきますが、このC#にはアクセス修飾子というものがあります。

アクセス修飾子とは、他のクラスからメンバ変数やメンバメソッドにアクセスできるかどうかを決める修飾子のことです。

このアクセス修飾子を使って、メンバ変数に意図しない値が入ることを防いだり、他のクラスで使わせたいものだけをアクセスさせるといったことができるようになります。

そこで、このページでは、Unityで使うことができるアクセス修飾子について、どんなものなのか、使い方やアクセス修飾子の種類についてまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

アクセス修飾子とは?

まずは、アクセス修飾子がどういうものなのか、どうして必要なのかを簡単にまとめていきます。

他のクラスからメンバにアクセスできるかどうかを決める

アクセス修飾子とは、クラス内で宣言したメンバ変数メンバメソッドに対して、他のクラスからアクセスできるかどうかを決めています。

もう少し具体的に言うと、他のクラスからアクセスできるメンバ変数やメンバメソッドは、

変数名.メンバ変数
変数名.メンバメソッド

と、書いてあげることでそのメンバにアクセスすることができ、別のクラス内で変数のデータやメソッドの処理を行うことができます。

反対に、他のクラスからアクセスできないメンバ変数やメンバメソッドは、上記のように記述してもアクセスすることができず、コンパイルエラーとなってしまいます。

そのため、このアクセス修飾子を使ってメンバ変数やメンバメソッドを定義することで、他のクラスから呼び出せるかどうかを決めています。

なお、別のクラスで呼び出す方法などについては、以下のクラスの記事でも紹介しています。

アクセス修飾子を使う目的

このアクセス修飾子を使う目的として、

という2つの目的があり、これらを行うことをカプセル化と呼びます。

使わなくて良い変数やメソッドを隠す

アクセス修飾子で、メンバ変数やメンバメソッドにアクセスできなくさせることで、必要のないメンバを隠すことができます。

簡単に言うと、クラス内だけで使っている変数やメソッドなどは、外部からアクセスさせる必要がなく、アクセス修飾子で見せないようにしておきます。

こうすることで、利用させたい機能だけをアクセスさせることができ、分かりやすくなります。

特に、チームを組んでゲームを制作していく場合などでは、知らぬ間に使われていたということがないように、アクセス修飾子を付けておくことが多いです。

メンバ変数に意図しない値が入ることを防ぐ

もう一つの目的として、メンバ変数に自分が意図していない値が入れられてしまうことを防ぐという目的があります。

メンバ変数がアクセス可の状態だと、他のクラスからその変数を変更することができてしまい、それによりゲーム内でバグエラーが起きてしまう可能性が出てきます。

このような事象を未然に防ぐために、アクセス修飾子で元の変数には直接アクセスできないようにしておくことができます。

アクセス修飾子の書き方

アクセス修飾子を書く際は、メンバ変数の宣言やメンバメソッドを定義する前に書いていきます。

例えば、他のクラスからのアクセスをさせないようにメンバ変数を宣言する場合は、

private int hp;

上のように、変数の宣言の前に「private」と記述することになります。

また、どのクラスからもアクセスできるようにするメンバメソッドを定義する場合は、

public void Attack()
{
	// 処理 //
}

上記のように、メソッドの定義の前に「public」と記述することで、他のクラスからもアクセスできるメンバメソッドになります。

なお、このアクセス修飾子を付けないで、メンバ変数を宣言したりメンバメソッドを定義した場合は、「private」が付いている扱いとなり、他のクラスからアクセスすることが出来なくなっています。

アクセス修飾子の種類

アクセス修飾子の種類として、主に使われるものが以下の3種類となっています。

public:すべてのクラスからアクセス可能

「public」は、他のクラスも含めてすべてのクラスからアクセスできるアクセス修飾子になっています。

例えば、Test1のクラス内でpublic修飾子を付けてメンバ変数testHPを宣言して、Test2のクラス内でそのメンバ変数を呼び出した場合、アクセスできてその変数を変更することもできます。

using UnityEngine;

public class Test1 : MonoBehaviour
{
    public int hp = 100;	// publicを付けて変数を宣言
}
using UnityEngine;

public class Test2 : MonoBehaviour
{
    Test1 test1 = new Test1();  // Test1のインスタンスを作成する

    void Start()
    {
        Debug.Log(test1.hp);    // hpの変数を取得して表示

        test1.hp = 50;  // hpの変数を50に書き換える
        Debug.Log(test1.hp);    // 再度hpの変数を表示
    }
}

このように、publicは別のクラスからでもアクセスでき、メンバ内を変更することもできます。

protected:同じクラスと派生クラスからのアクセス可能

「protected」は、そのクラスと派生クラスからのみアクセスできるアクセス修飾子です。

派生クラスとは、そのクラスを継承させたクラスのことで、protectedを使うことでその派生クラスからのみアクセスさせるようにできます。

例えば、先ほどと同じようにTest1のクラス内でprotected修飾子を付けてメンバ変数を宣言して、全く別のクラスであるTest2でメンバ変数にアクセスしてみます。

using UnityEngine;

public class Test1 : MonoBehaviour
{
    protected int hp = 100;	// protectedを付けて変数を宣言
}
using UnityEngine;

public class Test2 : MonoBehaviour
{
    Test1 test1 = new Test1();  // Test1のインスタンスを作成する

    void Start()
    {
        Debug.Log(test1.hp);    // hpの変数を取得して表示
    }
}

すると、Test2は派生クラスでは無いためアクセスできず、コンパイルエラーとなってしまいます。

次に、Test1を継承させた派生クラスのTest3でもう一度メンバ変数にアクセスしてみます。

using UnityEngine;

public class Test3 : Test1	// Test1のクラスを継承
{
    void Start()
    {
        Debug.Log(hp);    // hpの変数を取得して表示
    }
}

こちらは問題なくアクセスすることができました。

このように、protectedは継承先のクラスでメンバ変数やメンバメソッドにアクセスできる修飾子となっています。

なお、継承については以下の記事でも詳しく解説していますので、参考にしてみてください。

private:同じクラスのみアクセス可能

「private」は、同じクラスのみアクセス可能で、他のクラスからはアクセスできないようにするアクセス修飾子です。

例えば、Test1のクラス内でprivate修飾子を付けてメンバ変数を宣言して、別のTest2のクラスでアクセスしようとすると、アクセスできずコンパイルエラーとなります。

using UnityEngine;

public class Test1 : MonoBehaviour
{
    private int hp = 100;   // privateを付けて変数を宣言
}
using UnityEngine;

public class Test2
{
    Test1 test1 = new Test1();  // Test1のインスタンスを作成する

    void Start()
    {
        Debug.Log(test1.hp);    // hpの変数を取得して表示
    }
}

このように、privateを使うことで他のクラスからアクセスできないようにすることができます。

まとめ

このページでは、Unityで使うことができるアクセス修飾子について、どのようなものなのか、役割や使い方についてまとめていきましたが、いかがでしたでしょうか?

アクセス修飾子とは、メンバ変数やメンバメソッドを他のクラスからアクセスできるようにするかどうかを決めているものです。

アクセス修飾子の目的には、

という2つの目的があります。

「public」「protected」「private」などのアクセス修飾子を使って、メンバにアクセスできるかどうかを決めていきましょう。

最後までお読みいただきまして、ありがとうございました!

コメント