Unityのスクリプトの構造を知ろう【名前空間】

前回までclassや変数やメソッドなどが出てきてややこしかったと思いますが、今回はこれらの構造について解説して行こうと思います。

今回の話もややこしいのでなんとなーく理解していただければ大丈夫です。

この記事は本のように順を追って解説しています。この記事は途中のページになります。
この記事を見ていて、現在の状況がわからない場合や忘れてしまった事などが出てきたら↓のリンクから目次ページへ飛べますので立ち戻って見てください。

<スクリプトの構造について>

さて、今までUnityでC#を作ると最初から色々用意してくれていて、至れり尽くせりで中身の構造についてあまり気にしてなかったと思うのですが、今回はここをちゃんと解説しようと思います。

<名前空間>

とりあえず、大外の枠から解説していきたいと思います。まず、Unityでスクリプトを作成した時、上の方にusing〜という記述があったと思います。

using namespace

↑これですね。これは○○の機能を使いますよという意味でした。

この○○というのが名前空間と言われるものです。

この名前空間と言われるものは、まぁ、簡単に言うとフォルダみたいなもんです。

プログラムをたくさん書くとどこにどういった機能を載せたかわかんなくなる時があります。そのため、プログラムをフォルダ分けするのです。

といっても、実際にエクスプローラーやファインダーでフォルダーを掘る訳ではなく、プログラムがアクセスする場所を定義するみたいな感じですかね。

プログラムは実際に目に見えるフォルダーで分けても、自分達はわかりやすくなりますが、コンピュータにとっては関係ないのです。

例えば、

using UnityEngine;

として、Unityの機能を使えるようにしている訳ですが、Unityの機能ってメチャクチャたくさんあります。この名前空間がないと数ある機能にアクセスする際にいちいちその機能を指定しなければなりません。

UnityEngineと言う名前空間にフォルダに固めてくれてあるおかげで、using UnityEngine; と書くだけでUnityの一通りの機能を簡単に使える訳ですね。

ちなみに、「.」はフォルダの中のフォルダだと思ってください。例えば

using System.Collections.Generic;

と言うのは、Systemと言うフォルダの中のCollectionsと言うフォルダの中のGenericと言うフォルダに入っている機能を使うみたいな感じです。

名前空間を使ってみよう

では、この名前空間を自分で定義しようとするとこんな感じになります。

namespace

↑左側で名前空間を定義し、右側はそれをusingで使えるようにしています。

namespace ○○ と書くことでそれが名前空間になります。

左側のFolderA,FolderBと言うのがそれです。

また、この名前空間と言うのは、いくつでも囲うことができて、囲めば囲むほど階層が深くなっていきます。

これらにアクセスするには、右側のように

using FolderA.FolderB;

とすることで中身のクラスを参照することができます。

ちなみに、namespaceを書かないと、global namespaceと言う名前空間に自動的になります。このglobal namespaceはusing ○○と書かなくても最初から使える状態になっています、




namespaceで分けるメリット

何故、namespaceでこのように分けるのかと言いますとフォルダ分けして整理したいと言う点もあるのですが、名前が被らないようにすると言う利点があります。

よく使う単語と言うのは比較的被りやすいのですが、別のクラスと同じ名前にはできないというルールがあるため、スクリプトの名前を決める時に困ってしまいます。

こういった時も名前空間で分けておけば同じ名前のスクリプトが存在しても問題ありません

よくあるのが、例えば、どこかの誰かが便利なスクリプトをたくさん書いてくれていて、Unityに一括インポートしたとします。今度は別の誰かがまた違う便利なスクリプトをたくさん書いてくれていて、それをUnityにインポートした時、クラスの名前が被っていて、エラーになるといったことが起こります。

クラス名が被ると↓のようなエラーが起き、シーンの再生ができなくなってしまいます。

error namespace

こういった衝突を回避する意味でも名前空間を使用するのは便利です。

Point

・名前空間はプログラムのフォルダみたいなものだよ!
・名前空間はいくつでも階層を深くできるよ!
・これを使うことでプログラムの整理整頓ができるよ!
・同じ名前のクラスとぶつかる事を防げるよ!

<型>

以前から、classだとか型だとか色々言っていましたが、名前空間のに書かれているものは基本的に「」になります。

以前、オブジェクト指向は「設計図」と「実体」と例えられるよと言う話をしていましたが、この型が設計図にあたります

classというのは型の種類です。

実はclass以外にも型は色々ありますが、いっぺんに紹介すると覚えるのが大変なので今はclassだけわかっていれば大丈夫です。

この型には参照型と値型という2種類が存在することがあるということは以前↓の記事で紹介しました。

名前空間と型を図で表すとこんな感じでしょうか

Class structure

名前空間の中に型がある感じです。

名前空間を書かなかったら、global namespaceという名前空間になります。

型の中に型を入れられる点がなんかややこしいですが、慣れれば簡単です。

型の中の型にアクセスしたい場合は「.」で区切ることでアクセスできます

Aのクラス中にBというクラスを作るとA.Bとすればその中の機能が使えます。

このように型の中に存在するものをメンバと言います。

例えば、Aと言うクラスがあったとして、

・Aの中にある変数はAのメンバ変数
・Aの中にあるメソッドはAのメンバメソッド
・Aの中にあるクラスはAの内部クラス

と言います。

何故かクラスは内部クラスと言って「メンバクラス」と言うのはあまり聞かないです。もしかしたらメンバクラスと言っている人もいるかも

Point

・名前空間の中に書かれている設計図を「型」と言うよ!
・型には値型と参照型の2つのタイプが存在して、たくさん種類があるよ!
・型の中にあるものをメンバと言うよ!

<わからない事、質問等があれば>

このサイトの説明ではよくわからなかったとか、もっと知りたい事などがあれば

自分の Youtubeの動画にコメントで質問していただければ動画でお答えしようと思います。

文章同士のやり取りだと伝わりづらいし、ラリーに時間がかかりそうなので動画で回答します。

↓の動画が回答の一例になります。どの動画でもいいのでご遠慮なくコメントしてください

できたらチャンネル登録よろしくお願いします!




何やら概念的な話になってしまいましたが、これから特にメンバと言う用語はよく出てくるので覚えておいてください。次回はアクセス修飾子について解説したいと思います。




タイトルとURLをコピーしました