UnityのC#のアクセス修飾子とシリアル化
UnityのC#のアクセス修飾子とはアクセスレベルを調整するためのものである。例えばpublicであれば、特に何か制限することもなく公開できる。他からのアクセスが可能だ。
この記事を読む前に、C#でのスクリプトの開き方、基本的な構文の作り方、変数、演算子がわからない場合は先に以下の記事で確認してほしい。
UnityのC#の書き方
UnityのC#の変数・演算子
また、Unityの基礎知識や操作などがわからない場合は先に以下の記事を確認してほしい。
Unityの基礎まとめ
この記事ではアクセス修飾子の詳細やpublicを使ったシリアル化について紹介していく。
Unityのアクセス修飾子目次
アクセス修飾子の種類アクセス修飾子はどうついているのか?
シリアル化(シリアライズ)について
目次にもどる
アクセス修飾子の種類
アクセス修飾子には以下のようなものがある。public
どこからでもアクセスすることができる。
private
同じクラス内のみアクセスできる。
protected
同じクラスと継承したクラス内でアクセスできる。
internal
同じクラスとアセンブリ(特殊な設定をしてない場合、同じプロジェクトのスクリプトと考えればいい)からのみアクセスできる。
protected internal
同じアセンブリと別アセンブリの継承クラスでアクセスできる。
private protected
同じクラスと同じアセンブリの継承クラスのみアクセスすることができる。
簡単に6種類紹介したが、初心者のうちは、どこからでもアクセスできるpublicとアクセスが同じクラスのみに限られるprivateがわかればそれほど困ることはない。
目次にもどる
アクセス修飾子はどうついているのか?
例えば、アクセス修飾子の一つであるpublicは新しいスクリプトを開いた際にクラスに既に記述されている。d.jpg)
このクラスはあらかじめUnity上で定義されているクラスであるMonoBehaviourを継承(元にする)するため、unityからアクセスされる。よって、公開して他からのアクセスが可能となるpublicがついている。
実はクラスだけでなく、メソッドや変数などにもアクセス修飾子がついている。省略されているので見えていないだけである。
各要素のアクセス修飾子について紹介していく。
名前空間
usingによって名前空間(クラスを種類ごとに分けて管理するための機構)の呼び出しを行っている。アクセス修飾子をつけることはできない。アクセス権はpublicと同様。
型(メンバ以外)
型はクラスや構造体などを指す(後述するメンバ以外となっており子クラスなどは含まない)。publicまたはinternalをつけることが可能。型に何も書いていない場合はintenalが省略されてつく(特殊な設定をしてなければpublicとほぼ同じと考えていい)。
メンバ
メンバとは、クラスや構造体の中にある型を構成する内部要素を指す。具体的にはメソッド、子クラス、変数など。public、protected、internal、protected、internal、privateをつけることが可能。メンバに何も書いていない場合はprivateが省略されてつく。
目次にもどる
シリアル化(シリアライズ)について
アクセス修飾子のpublicを利用することでシリアル化(シリアライズ)が可能である。シリアル化とは簡単に言えば、データの送受信を行える形にして、スクプリト間以外に反映させることである。
例として以下のようにスクリプトに記述してみよう。
.jpg)
クラス内メソッド外に記述。
public int a;
Startメソッドに記述。
Debug.Log(a);
そしてスクリプトをゲームオブジェクトにアタッチしてみる。するとインスペクター欄に追加されたスクプリトに以下のような記述が増えている。
.jpg)
public int a;としたのにAと大文字になるのが不思議だが、スクプリト外から数値の操作が可能な欄ができた。
何もせずに再生すると0のログが出力される。
次に例えばAを5にしてみよう。この状態で再生すると5のログが出る。
このようにシリアル化することで、スクリプトを開かずとも値の調整が可能となる。aの値をゲームオブジェクトの動作に使用することで、スクプリトを開かずシーンビューを見て動作を見ながら数値を変えて動作テストするといったことが可能となりとても便利だ。
なお、以下のように記述してもシリアル化(シリアライズ)が可能。
publicと異なるのは他のクラスからの書き換えができなくなる点。
例えば、一つのゲームを共同開発している場合を想定してほしい。publicでシリアル化してしまうと、別の人が別のスクリプトからでもアクセス可能であり、変数を書き換えられてしまう可能性がある。また1人で開発していても書き換えしていいのか悪いのか忘れてしまう場合もあるだろう。
よって、インスペクター欄からのみ変更できればいいという場合は[SerializeField]を使っていくのがおすすめだ。