前回までclassや変数やメソッドなどが出てきてややこしかったと思いますが、今回はこれらの構造について解説して行こうと思います。
今回の話もややこしいのでなんとなーく理解していただければ大丈夫です。
↑の動画でも解説していますので、ぜひご活用ください。
この記事は本のように順を追って解説しています。この記事は途中のページになります。
この記事を見ていて、現在の状況がわからない場合や忘れてしまった事などが出てきたら↓のリンクから目次ページへ飛べますので立ち戻って見てください。
<スクリプトの構造について>
さて、今までUnityでC#を作ると最初から色々用意してくれていて、至れり尽くせりで中身の構造についてあまり気にしてなかったと思うのですが、今回はここをちゃんと解説しようと思います。
<名前空間>
とりあえず、大外の枠から解説していきたいと思います。まず、Unityでスクリプトを作成した時、上の方にusing〜という記述があったと思います。

↑これですね。これは○○の機能を使いますよという意味でした。
この○○というのが名前空間と言われるものです。
この名前空間と言われるものは、まぁ、簡単に言うとフォルダみたいなもんです。
プログラムをたくさん書くとどこにどういった機能を載せたかわかんなくなる時があります。そのため、プログラムをフォルダ分けするのです。
といっても、実際にエクスプローラーやファインダーでフォルダーを掘る訳ではなく、プログラムがアクセスする場所を定義するみたいな感じですかね。
プログラムは実際に目に見えるフォルダーで分けても、自分達はわかりやすくなりますが、コンピュータにとっては関係ないのです。
例えば、
using UnityEngine;
として、Unityの機能を使えるようにしている訳ですが、Unityの機能ってメチャクチャたくさんあります。この名前空間がないと数ある機能にアクセスする際にいちいちその機能を指定しなければなりません。
UnityEngineと言う名前空間にフォルダに固めてくれてあるおかげで、using UnityEngine; と書くだけでUnityの一通りの機能を簡単に使える訳ですね。
ちなみに、「.」はフォルダの中のフォルダだと思ってください。例えば
using System.Collections.Generic;
と言うのは、Systemと言うフォルダの中のCollectionsと言うフォルダの中のGenericと言うフォルダに入っている機能を使うみたいな感じです。
名前空間を使ってみよう
では、この名前空間を自分で定義しようとするとこんな感じになります。

↑左側で名前空間を定義し、右側はそれをusingで使えるようにしています。
namespace ○○ と書くことでそれが名前空間になります。
左側のFolderA,FolderBと言うのがそれです。
また、この名前空間と言うのは、いくつでも囲うことができて、囲めば囲むほど階層が深くなっていきます。
これらにアクセスするには、右側のように
using FolderA.FolderB;
とすることで中身のクラスを参照することができます。
ちなみに、namespaceを書かないと、global namespaceと言う名前空間に自動的になります。このglobal namespaceはusing ○○と書かなくても最初から使える状態になっています、
namespaceで分けるメリット
何故、namespaceでこのように分けるのかと言いますとフォルダ分けして整理したいと言う点もあるのですが、名前が被らないようにすると言う利点があります。
よく使う単語と言うのは比較的被りやすいのですが、別のクラスと同じ名前にはできないというルールがあるため、スクリプトの名前を決める時に困ってしまいます。
こういった時も名前空間で分けておけば同じ名前のスクリプトが存在しても問題ありません。
よくあるのが、例えば、どこかの誰かが便利なスクリプトをたくさん書いてくれていて、Unityに一括インポートしたとします。今度は別の誰かがまた違う便利なスクリプトをたくさん書いてくれていて、それをUnityにインポートした時、クラスの名前が被っていて、エラーになるといったことが起こります。
クラス名が被ると↓のようなエラーが起き、シーンの再生ができなくなってしまいます。

こういった衝突を回避する意味でも名前空間を使用するのは便利です。
・名前空間はプログラムのフォルダみたいなものだよ!
・名前空間はいくつでも階層を深くできるよ!
・これを使うことでプログラムの整理整頓ができるよ!
・同じ名前のクラスとぶつかる事を防げるよ!
<名前空間に書ける型>
名前空間でフォルダ分けしたところで、中に何が入れられるのでしょうか?
とりあえず、今までの解説で出てきた型でいうと
・class
・構造体
の2種類になります。
いわゆる「設計図から実体を作成する」と例えていたものを書く事ができます。
他にも書ける型は存在しますが、登場した際に解説したいと思います。
名前空間の中には設計図があると思っていただけたら大丈夫かなと思います。
ちなみに、名前空間を書かなかったら、global namespaceという名前空間になります。必ずどこかの名前空間に含まれるわけですね。
<クラスや構造体の中に書ける型>
さて、名前空間の中に設計図があって、というところまで解説しましたが、ではその中に書けるものを詳しく見てみましょう。
ちなみに、設計図の中に書けるものをメンバと言います。

まず、クラスや構造体の中に定義できる変数の事をフィールドと言います。もしくはメンバ変数と言います。
また、そのクラスや構造体の中に定義されたメソッドをメンバメソッドと言います。
ちょっとここがややこしいのですが、実は型の中に型を入れることができます。クラスの中にクラスや構造体を入れたり、構造体の中にクラスや構造体を入れることができます。
これらのことを「入れ子にされた型」といい、特にクラスの場合は内部クラスとも言います。
入れ子にされた型にアクセスしたい場合は「.」で区切ることでアクセスできます。
Aのクラス中にBというクラスを作るとA.Bとすればその中の機能が使えます。
・名前空間の中にクラスや構造体などの型を書く事ができるよ!
・クラスや構造体の中にあるものをメンバと言うよ!
何やら概念的な話になってしまいましたが、これから特にメンバと言う用語はよく出てくるので覚えておいてください。次回はアクセス修飾子について解説したいと思います。