はじめに
こんにちは、えきふるです!
さて、私のようにプログラム初学者だと、Unity等でゲーム開発をしていて
「C#でこんな事をやりたいけど、実装の仕方がわからん…」
という時はとにかく検索をするかと思います。
検索をしているとたまに、
「このコードを使用する場合はスクリプト冒頭に「using XXX」をおまじないとして書いておいてくださいね☆」
なんて記載があるじゃないですか、でもえきふるはいつも思うのです。
そんなバカな…プログラムでおまじないが通用するなんて…
ということで、ずっとモヤモヤしているのも嫌なので、この機会にC#の全体の基本構造に関してまとめて、「おまじない」を消滅させてスッキリしたいと思います!
全体構造
C#ソースコードの全体的な構造としては下記のようになっています。
これは普段から制作してれば何となく感覚は掴めている気がしますね。
ネームスペースの中にクラス、クラスの中にメソッド、メソッドの中に処理コードを記載、
という風な階層構造になっていますね。
また、VisualStudioでC#スクリプトを作成するとデフォだと下記みたいになっていました。
(これが基本的な構造なのかな?)
※コードのコメントにそれぞれ該当するプログラム構造の名前を入れてあります。
using System; // usingディレクティブ
namespace test // ネームスペース(名前空間)
{
class Program // クラス
{
static void Main(string[] args) // メソッド
{
Console.WriteLine("Hello World!"); //処理
}
}
}
ちなみにUnityでC#スクリプトを作成するとデフォルトではNameSpace(名前空間)の記述は無く、いきなりクラスの記述になっていますね。
ネームスペースが必要になったら記載してね、という事だと私は思っています。
using UnityEngine;// usingディレクティブ
public class Sample : MonoBehaviour // クラス
{
void Start() // メソッド
{
}
void Update() // メソッド
{
}
}
NameSpace(名前空間)があると出来ることなども下記に記載していますので、早速個別の内容を見ていきましょう!
個別構造
それでは、それぞれ個別の領域はどういう意味なのか見ていきましょう!
usingディレクティブ
次の項目で説明をする「ネームスペース」に存在する外部のクラス、メソッドを宣言しています。
外部のネームスペースを記述する際にはソースコードに
「これはどこどこのネームスペースのメソッドです。」
という記載をしなければいけませんが、このusingディレクティブを使用することで省略することが出来るようになります。
例えば
using UnityEngine;
と冒頭部分に記載すると、このソースコード内ではUnityEngineというネームスペース内で定義されているクラスをネームスペースの記載無しで使用することができるということです。
よく分からないかもだけど、ネームスペースに関しては下記で更に説明しているので安心してね
NameSpece(ネームスペース・名前空間)
ネームスペースとは1つのプログラムの中に同じ名前のクラスを共存可能にする仕組みです。
クラスの数が多くなったりした際、階層的に名前を管理する時に使ったりするようです。
イメージ的には同姓同名の「駅古太郎」と言う人が同じ組織に2人いたとして、
東京出身の駅古太郎
大阪出身の駅古太郎
みたいに定義してあげれば、異なる人として認識できるので共存ができるという感じです。
この「〜出身の」みたいな部分をプレフィックスなんて言ったりしますね。
3DCGでもネームスペースって使うよね
Unityで使用する場合は下記のような形で記載できます。
この場合、Apple、OrangeクラスはネームスペースFruit(またはYaoya)のメンバーと呼ばれます。
namespace Fruit {
public class Apple : MonoBehaviour {
...
}
public class Orange : MonoBehaviour {
...
}
}
namespace Yaoya {
public class Apple : MonoBehaviour {
...
}
public class Orange : MonoBehaviour {
...
}
}
上記の駅古太郎の話と合わせるとネームスペースの概念は下記のようなイメージになります。
また、これらのクラスを使用するときの記載は
NameSpace.クラス名
で使用することができます。例えばFruit.Appleみたいな感じです。
ただ、毎回毎回こうやってプレフィックスを入力するのは面倒ですよね。
そこでプログラムファイルの先頭でusingを記述するということをします。
例えば
using Fuirt;
こうやって記載することでApple Orangeという記載は自動的にFruit.Apple、Fuirt.Orangeとして認識されます。
おっと、ここで先ほど話をしたusingの正体がわかってしまいましたね。
なお、同じクラス名を含むネームスペースをusingディレクティブを使って同時に使用するとそれぞれが衝突してコンパイルエラーになります(そりゃそうだ。)
※Unityのユーザーマニュアルでも詳しい説明があるのでぜひ参考にしてみてくださいね!https://docs.unity3d.com/ja/2018.3/Manual/Namespaces.html
class(クラス)
メソッド等のプログラムを使いやすい単位でまとめているエリアの事で、オブジェクト指向における「設計図」という言われ方もよく見かけます。
イメージ的には、クラスにカレーの調理方法が書いてあり、材料(=データ)を放り込むとレシピ(=クラス)にそって調理され、カレーが出来上がる(=実体化、インスタンス)という感じでしょうか。
クラスは
キャラクターの移動に関するメソッドをまとめた「キャラ移動クラス」
ダメージUIに関するメソッドをまとめた「ダメージUIクラス」とかそんな感じのまとめ方になるのかなと思います。
なお、C#ではクラス名とファイル名は同じにするのが慣習らしいですね。
Unityだと同じにしないとそもそもエラーになるよね
Unityの場合ファイル名と、クラス名の右側に: MonoBehaviour
と記述のあるクラスの名前が違うとエラーが出るようですので、複数クラスを同じソースコードで記述する場合はこの辺りに注意する必要がありそうです。
method (メソッド・関数)
メソッドは外部からのデータを受け取り、処理して実行結果を出力する、「まとまり」の事です。
例えば
void Update()
{
Debug.Log("test");
}
上記のメソッドだと、毎フレームDebug.Log();の()内に指定した内容をUnityのコンソールに出力しますよ、というまとまりになりますよね。
おまけ:エントリーポイント
プログラムで最初に呼び出される処理のことをエントリーポイントと言うらしい。
C#の場合通常はMainメソッド、
UnityC#の場合はAwakeメソッドが実行としては一番早いのかなと思いますが、ゲームのプレイを行なった際には先にComponentが呼ばれたりすると思うので、本当の意味でのエントリーポイントを見つけるのはなかなか難しそうです。
とてもシンプルなまとめ
・処理をまとめたものがメソッド
・メソッドをまとめたものがクラス
・同じ名前のクラスを区別するためのものがネームスペース
・ネームスペースはソースコード冒頭にusingの記載をする事で省略できる
なんかわかった気がするふる〜!
※認識違いがあったらぜひコメント等で教えてくださいね!
コメント