今回はアクセス修飾子と言うものを解説したいと思います。↑の動画でも解説していますので、ぜひご活用ください。
この記事は本のように順を追って解説しています。この記事は途中のページになります。
この記事を見ていて、現在の状況がわからない場合や忘れてしまった事などが出てきたら↓のリンクから目次ページへ飛べますので立ち戻って見てください。
<アクセス修飾子>
アクセス修飾子とは
以前の解説で、別のファイルからアクセスするためには公開する必要があり、公開するにはpublicと付ければ良いという話をしていました。
今回はこの公開範囲について解説していきたいと思います。
以前解説した時はpublicというのはclassの横についていました。
これはMonoBehaviourを継承しているため、Unity側からアクセスされるのでpublicになっていたんでしたね。
このpublicのように公開する範囲を決める文をアクセス修飾子と言います。
実はこれはメソッドや変数にもつけることができます。
隠れているアクセス修飾子<private>
メソッドや変数にアクセス修飾子をつける事ができると言いましたが、実はすでについています。見えないだけです。
よく使用されるので便利にするために「書かない」という省略系を取っているものがあります。
省略されているものを記述すると↓のようになります。
「private」とついているのがわかりますね。
これは公開しないという意味になります。同じファイルからのみアクセスすることができます。
あれ?StartとUpdateはUnity側から呼ばれているんじゃないの?って話なのですが、これらはちょっと特別な扱いになっています。そのため、「private」であるにも関わらずUnity側からアクセスされます。
その代わり「公開」はしていないため、Unity側とこのクラス内以外から呼び出すことはできません。
このように今まで何も書かずに来たところはprivateが入っているのと同じ状態になります。
<アクセス修飾子の種類>
とりあえず、
公開しない private
公開する public
この2種類さえわかっていれば最初のうちは大丈夫かなと思います。
しかし、今後突然別の種類が出てきても困るので、一応全部のアクセス修飾子について解説したいと思います。別に今は覚えなくても構いません。興味がある方は↓ボタンをクリックしてこんなものがあるんだと何となく頭の片隅においておいていただければと思います。
public
アクセス制限がないアクセス修飾子です。これが記述してあるとどこからでもアクセスできます。
protected
その型を継承した型からしかアクセスできないようになる修飾子です。
internal
同じアセンブリ(Unityにおけるアセンブリは特別に設定しない限り、同じプロジェクトのスクリプトと言う意味になります。)に書かれた型からのみアクセスできる修飾子です。
protected internal
protectedとinternalを掛け合わせたアクセス修飾子です。同じアセンブリに書かれてかつその型を継承した型からしかアクセスできない修飾子です。
private
その型をメンバに含んでいる場合にのみアクセスすることができます。
<アクセス修飾子を付けられる種類>
アクセス修飾子にはつけられるものとつけられないものがあります。つけられる修飾子の種類も違うので1つ1つみてみましょう。
名前空間
名前空間にアクセス修飾子はつける事ができません。扱いとしてはpublicと同じ扱いになります。
(メンバでない)型
public、internalをつける事ができます。
Unityにおいてinternalは意図的に特別な設定をしなければならない為。最初は考える必要はありません。意図的に何かしないとpublicとinternalはほぼ一緒です。
クラスのメンバ
public、protected、internal、protected internal、privateをつける事ができます。
目的に応じてアクセス修飾子をつけてください。
<デフォルトのアクセス修飾子>
何も書いていないと、自動的にデフォルトアクセス修飾子が割り当てられます。
(メンバではない)型
internalが割り当てられます。
クラスの子メンバ
privateが割り当てられます。
<公開範囲を指定する意味>
何故このようなアクセス修飾子を使って公開範囲を決めているかと言うと、プログラムを見やすくするためです。
左側のtestClassと言う奴にアクセスしようと別のファイルからtestClass「.」と打つとその中で呼び出せるものが表示されます。Visual Studioはこのように、次に何を書けばいいのかを表示してくれるのでとても便利です。
↑左側で様々なアクセス修飾子を使ってclassの中にclassを書いています。
これを右側のスクリプトでアクセスしようとするとA,B,Cは表示されているのにD,Eは表示されていません。
このように他のクラス等から参照しようとした時、使える範囲を限定的にできます。
スクリプトをたくさん書いていると以前書いた内容を忘れることが多々あります。そう言った時にきちんと整理整頓してあると、アクセスがやりやすくなります。
もし、チームで開発するかもしれない人は結構重要ですので覚えておいてください。他の人からアクセスされたら困るものは公開範囲をきちんと指定しましょう。
このように、公開範囲をきちんとすると、開発がやりやすくなると思いますので、覚えておくと便利かと思います。
Unityでは特別な意味を持つ<public>
さて、開発をやりやすくする為に公開範囲が大事なのはわかっていただけたと思うのですが、プログラミングをまだ全然書いてないのにこんなこと今覚えてもどう使うかわからないと言う人もいると思います。
では何故、今この公開範囲について解説したかと言うと、この中で「public」だけUnityでは特別な意味を持ってくるからです。
実はその他のアクセス修飾子でもできるのですが、ちょっとレベルの高い事をしないといけない為、今回はスルーして、後々解説したいと思います。
それはpublicのみ何も指定しなくても自動でシリアライズされると言う点です。
<シリアライズとは>
データのやりとりを可能にする
シリアライズというのは、ソフトウェア内部で扱っているデータをそのまま、保存したり送受信することができるように変換することです。
今まで、何かを書いてもスクリプト間のみでしかデータを使用できませんでした。Unityではこの「シリアライズ」をすることによって、様々な事に使用できるようになります。
どのようにすればシリアライズ化されるかというと、一番簡単なやり方が「public」にすることでシリアライズ化する事ができます
シリアライズ化できるものとできないもの
「public」によってのシリアライズ化はできるものとできないものがあります。
まず、int,float,double,char,string,boolなどの基本的な型はシリアライズ可能です。
構造体は基本的にシリアライズ化できません。しかしながら、Unityが定義したものの中には最初からシリアライズ化可能な物があります。
クラスは基本的にシリアライズ化できません。しかし、MonoBehaviourを継承しているもの、GameObject、コンポーネントはシリアライズ化可能です。また一部例外として最初からシリアライズ化可能なものもあります。
配列は、シリアライズ化可能な型の配列であればシリアライズ化可能です。
このようにできるものとできないものがあります。
できないものは工夫することでできるようになる場合もあります。
シリアライズ化されたものを見てみよう
何を言っているのかわからないと思うのでとりあえず、やってみましょう。
キーポイントは「publicにした変数はシリアライズ化される」です。
↑のようなスクリプトを書きました。
様々なアクセス修飾子をつけています。
publicになっている変数はaのみです。
これだけだとよくわからないのでゲームオブジェクトにこのスクリプトをアタッチしてみましょう。
すると↑のようになりました。
ゲームオブジェクトに貼り付けたスクリプトの下に「A」という奴が登場しています。
これはスクリプトでpublicにした「a」という変数がここに表示されています。
何故か、変数の頭文字が大文字になります。
他のアクセス修飾子の変数は表示されていませんね。publicだけが特別な事がわかります。
このように、変数をシリアライズ化すると、インスペクター上で値を編集する事ができるようになります。
インスペクターで編集できるメリット
さて、インスペクターに変数を表示する事ができましたが、インスペクターで変数の中身を編集する事ができるようになった為、様々な事ができるようになりました。
例えば、キャラクターを動かす為の計算に「speed」という変数を作ったとします。
これを計算の間にかましてあげる事によって、移動速度を調整する事ができるようにしたとします。
この時、speedを調整したい時、本来なら、いちいちスクリプトに書いた値を変更して保存して再生を押さないと確認できません。UnityとVisual Studioを行ったりきたりしないと行けなくなり手間がかかります。
これが、インスペクターからいじれるようになったことで、直接値を調整することができます。
ゲームを再生しながら値を調節してみたり、試してみたりする事ができるのです。
また、別のメリットとして、Debug.Logでログを表示し続けるとコンソール画面が埋め尽くされてよくわからない事があるので、インスペクターに現在の値を表示させて、値を見るといった使い方もできます。
インスペクターに変数を表示させて調節してみよう
とりあえず、試しにやってみましょうか。
↑のようなスクリプトを書きました。速さの変化をみたかったのですが、移動を早くするとカメラで追えなくなってしまうので回転の速度を変えてみたいと思います。
物体の回転を変えるにはQuaternionというものを使わないといけないのですが、現状ちょっと難しいので、真似して書いてもらえればOKです。
そして、シーン上にCubeを置いて、回転が見えやすいようにTransformのRotationのXを45,Zを45にしています。
この状態で再生して、シリアライズ化されてインスペクターに出てきているSpeedの値を調節してみます。
↑のように画面を見ながら回転速度を変える事ができます。
このように色々なものを調節するのに役立ちます。
ゲームを作って行く上で確認しながら調節する事が多々あると思いますので、覚えておいてください。