【Unity入門】名前空間とusingを自作してみる

2021年10月13日

名前空間とは

名前空間とは、クラス名を同じにしてはいけない空間のことです。

言い換えると、名前空間が違っていれば、同じ名前のクラスを作ることができます。

例えば、敵を制御するクラスとプレイヤーを制御するクラスの名前をどちらも『Controller』にした場合、

名前が衝突してエラーが出てしまいます。

これは、どちらもglobal namespeceという同じ名前空間に記述されているからです。

しかし、片方をEnemyという名前空間の中に作り、

もう片方をPlayerという名前空間の中に作れば、

名前空間が異なるので、Controllerが二つあっても問題ありません。

名前空間を作るには

namespace 名前空間の名前
{
    class クラスの名前
    {

    }
}

と記述します。

クラスを使うときは

名前空間.クラス

と記述します。

例えば、インスタンスを作るときであれば、

名前空間.クラス 変数名 = new 名前空間.クラス();

と記述します。

クラスを使う時にはglobal namespaceを考慮して、

global.名前空間.クラス

といったように書く必要はありません。

必要ないというより、global namespaceは省略されることが想定されているので、できません

このように記述するとエラーが出てしまうので気をつけてください。

実際に使ってみる

準備

それでは、名前空間を使ってみましょう。

まずは、以前作成した、『C# Basics』というプロジェクトを開いてください。

『C# Basics』を開いたら名前空間を使うシーンを作りましょう。

Scenesフォルダの中に作成します。

ProjectウィンドウでScenesフォルダを選択しましょう。

選択した状態で『+』ボタンを押します。

色々と出てくるので、『Scene』をクリックしましょう。

すると、Scenesフォルダの中に新しくSceneが作成されます。

Sceneの名前を『Name Space』に変更しておきましょう。

今回は『Name Space』の中でクラスを作りたいので、Sceneを移動します。

『Name Space』をダブルクリックしましょう。

すると、Sceceを移動することができます。

Hierarchyウィンドウを見ると、現在のSceneが『Name Space』に変わっていますね。

次に名前空間を使うためのスクリプトを作っておきましょう。

Scriptsフォルダを選択してください。

選択した状態で『+』ボタンを押しましょう。

色々と出てくるので『C# Scripts』を選択します。

すると、新しくスクリプトが作成されます。

名前が確定してしまう前に『NameSpaceScript』と変更します。

名前を変更したら、スクリプトを編集していきましょう。

NameSpaceScriptをダブルクリックしてください。

すると、VIsual Studioが起動して、NameSpaceScriptを編集できるようになります。

スクリプトはScene上にあるオブジェクトに追加することで呼び出されるので、適当に追加しておきましょう。

NameSpaceScriptをMain Cameraにドラッグ&ドロップします。

すると、Main CameraにNameSpaceScriptが追加されます。

名前空間を使ってみる

それでは、実際に名前空間を使ってみましょう。

今回はControllerというクラスを二つ作り、基本的には同じ名前のクラスは二つ作れないことを確認した後に、それぞれを名前空間の中に記述したら問題ないことを確認してみましょう。

まずは、Controllerクラスを二つ作ってみましょう。

class Controller
{

}

class Controller
{

}

と記述しましょう。

すると、基本的には同じ名前のクラスは二つ作れないので、エラーが出てしまいますね。

次に、それぞれを名前空間の中に入れたら、問題ないことを確認していきます。

それぞれ、EnemyとPlayerという名前空間の中に記述するように書き換えます。

先ほどの記述を

namespace Enemy
{
    class Controller
    {

    }
}


namespace Player
{
    class Controller
    {

    }
}

と書き換えましょう。

このように書き換えると、同じ名前のクラスであっても別の名前空間なので、エラーが出なくなりますね。

次にそれぞれのクラスのインスタンスを作ってみましょう。

NameSpaceScriptのStart関数の中に

Enemy.Controller enemyController = new Enemy.Controller();

Player.Controller playerController = new Player.Controller();

と記述します。

コードについて説明しておきましょう。

名前空間を使うときはクラスの前に名前空間を記述します。

Enemyという名前空間のControllerというクラスを使いたい場合は、Enemy.Controllerと記述します。

また、Playerという名前空間のControllerというクラスを使いたい場合は、Player.Controllerと記述します。

usingを使ってみる

名前空間は使うときに省略することができます。

その場合はスクリプトの最初の方で『using』を使います。

usingは

using 省略したい名前空間;

と記述します。

例えば、Controllerの前のEnemyを省略したい場合は

スクリプトの上の方に

using Enemy;

と記述します。

このように記述すれば、Enemyを省略することができます。

試しに、Controllerの前のEnemyを

消してみましょう。

Enemyを消したとしてもエラーが出ることはありませんね。

今回、『using』を扱ったので、今まで触れてこなかった

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

について説明しておきます。

まず、

System.Collections;
System.Collections.Generic;

というのはC#側の名前空間です。

どちらもコレクションという文法事項に関するクラスが記述されている名前空間です。

コレクションというのは複数の値を格納できるデータ構造のことです。

似たようなものとして配列がありました。

コレクションと配列の主な違いとしては、コレクションの方が柔軟だという点です。

配列はインスタンス作成時に要素数を決め、後から変えることができません。

一方でコレクションの場合は、後から要素数を変えることができます。

System.Collections.Generic

型が厳密なコレクションのクラスが記述された名前空間です。

一方で、

System.Collections

型が緩めのコレクションのクラスが記述された名前空間です。

次に

UnityEngine

Unity側の名前空間です。

Unityによって用意されているクラスは、ほとんどがUnityEngineという名前空間の中に記述されています。

MonoBehaviourも

UnityEngineの中に記述されています。