アプリ制作③C#の基本構造・要素・構文
このレッスンでは、C#の基本構造・要素・構文について見ていきます。Unity Editorは視覚的にわかりやすい形でオブジェクトを操作することができますが、やはりアプリ制作となるとプログラミングなしには限界があります。
コンピューター言語には、日本語や英語といった自然言語の文法のようなものがあります。これからC#言語を使っていくために、言語構造と構文の全体像を把握しておくと、話がわかりやすくなります。
プログラミングやコーディングには、抵抗のある人も多いと思います。私自身も最初はそう感じていました。できるだけわかりやすく、最低限の知識で最大限のことができるように、以下C#の基本について説明していきたいと思います。
Unityのスクリプト
C#とは?
Unityでは、C#(Cシャープ)が主要なプログラミング言語として使われます。この言語は、オブジェクト指向のプログラミング言語と言われていて、Unityでオブジェクトを動かしたり、オブジェクトに変更を加えたりするのに便利な言語です。
ゲームオブジェクト
Unityでは、アプリの空間内に存在するゲームオブジェクト(Game Object)を動かすことで、アプリを機能させます。ゲームオブジェクトにはさまざまな種類のものがありますが、アプリに使われる画像や3Dモデルなどが全てゲームオブジェクトです。
コンポーネント
ゲームオブジェクトには、コンポーネント(Component)と呼ばれるものを付けることができます。コンポーネントはゲームオブジェクトの性質や特徴を決定づけるものです。例えば、コンポーネントのないゲームオブジェクトに、イメージ(Image)コンポーネントを付けることで、ゲームオブジェクトに画像を表示させることができるようになります。
スクリプト
スクリプトも、コンポーネントの一つです。ゲームオブジェクトにC#で書かれたスクリプトのコンポーネントを付けることによって、そのゲームオブジェクトに特定の機能を与えることができます。例えば、あるゲームオブジェクトに、AからBまで移動することが書かれたスクリプトを付けると、そのゲームオブジェクトをAからBまで移動させることができます。
テンプレート
Unityで新しいスクリプトを追加して、ファイルをダブルクリックしてVisual Studioで開くと、以下のようなテンプレートが表示されます。でも、最初これを見ただけでは、一体何を意味しているのかよくわかりませんよね。
// ネームスペース
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// クラス
public class Example : MonoBehaviour
{
// メソッド
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
まずは3色で色分けしたそれぞれの部分に注目してみてください。色の違う部分は、それぞれ異なる種類のスクリプトの構成要素で、異なる役割を担っています。具体的に言うと、赤い部分はネームスペース(Namespace)、緑の部分はクラス(Class)、青はメソッド(Method)と呼ばれるものです。以下、それぞれがどんな役割をになっているのかを詳しく見ていきましょう。
C#の構成要素
話を簡単にするために、以下のようなスクリプトを例に、C#の構成要素についてお話ししていきたいと思います。
// ネームスペース
using System;
// クラス
class Person
{
// フィールド
public string Name;
public int Age;
// メソッド
public void Say()
{
print("Hello, my name is {Name} and I am {Age} years old.");
}
}
ネームスペース
ネームスペース(Namespace)は、上記の例では「using」で始まっている部分で、関連するクラスやメソッドをグループ化するために使用されるものです。スクリプトの中での最も大きな括りの構成要素といっても良いかもしれません。
// ネームスペース
using System;
ここで指定されたネームスペースに書かれているクラスやメソッドは、個別に定義することなく使うことができるので、既存のコードのパッケージ、あるいは辞書のような役割を果たします。逆にここで指定されていないネームスペースの中にあるクラスやメソッドを使おうとすると、その中身について定義するように求められると言う事になります。
クラス
クラス(Class)は、ネームスペースに続いて大きな括りを持つ構成要素で、扱うデータとそのデータを使った操作をまとめる括りです。例では、「Person」と言う名前のクラスが書かれています。
クラス内には、メンバーが存在します。学校のクラスにも生徒というメンバーがいるのと同じで、クラス内の構成要素のことをメンバーと呼びます。これにはフィールドやメソッドなどが含まれます。クラスは括弧{}の中に、クラスのメンバーであるフィールドやメソッドを書いて使います。
// クラス
class Person
{
// フィールド、メソッドなど
}
Unityのスクリプトは通常、MonoBehaviourクラスを継承して作成されます。Unityのスクリプトのテンプレートにもこの「MonoBehaviour」という記載があったと思います。このクラスには、Start()、Update()、Awake()などが含まれており、アプリがスタートしてからのゲームオブジェクトの挙動を制御しています。といってもややこしい話に聞こえると思うので、UnityのスクリプトではMonoBehaviourクラスを使うとだけ覚えておいてください。
フィールド
クラスの括弧の中では、まずフィールドを定義します。フィールドは、クラス内でデータを格納するための変数のことを指します。つまりフィールドはクラスのメンバーで、クラス内の異なるメソッドからアクセスできるデータの変数ということになります。
// フィールド
public string Name;
public int Age;
フィールドの定義には主に3つの要素が必要です。アクセス修飾子と、データ型、フィールド名です。
クラスのメンバーであるフィールドやメソッドには、アクセス修飾子と呼ばれるものを使用して、アクセス可能な範囲を指定することができます。上記の例で「public
」となっている部分がアクセス修飾子です。public
のほかにもprivate
やprotected
などがあります。public
の場合は、クラスの外からでもアクセスが可能なのに対して、private
だとクラス内でのアクセスのみが可能となります。
データ型はこのフィールドの種類が、文字列(string)なのか、整数(int)なのか、小数(float)なのか、特定の型を指定しない場合(var)なのかといったことを特定するものです。上記の例では、string
とint
がそれに該当します。
そして一番右側に書かれているのがそのフィールドの名前です。
メソッド
一方、メソッドはクラス内でのアクションを定義する関数のことを指します。メソッドとフィールドの関係は、y=xー1という関数と、xとyという変数の関係のようなものですね。
// メソッド
public void Say()
{
// メソッドの中身
}
例のコードだと、メソッドの中身が以下のようになっているので、
// メソッド
public void Say()
{
print("Hello, my name is {Name} and I am {Age} years old.");
}
このコードを実行すると、「Hello, my name is {Name} and I am {Age} years old.」という文がコンソールに打ち出されるということになります。print()
もメソッドの一つですが、こちらはネームスペース内ですでに定義されているメソッドを使っているため、定義がなくても自動的にコンソールに打ち出すことができます。
インスタンス化
この例では、Person
クラス内で2つのフィールド Name
と Age
が宣言されています。Name
フィールドは、ストリング(string
)と呼ばれるタイプのデータを格納するためのフィールドとなっています。ストリングは数字などではなく、文字列を表現するもので、人の名前などを書き入れることができます。一方、Age
フィールドの方は整数(int
)のデータを格納するためのフィールドとなっていて、ここでは人の年齢を表現しています。
このようなフィールドは、Person
クラスでインスタンス(Instance)と呼ばれるものを作成し、そのインスタンス内でデータを保持するために使用することができます。つまり、このクラスが名前と年齢を持つ「人」一般を表すものだとすると、具体的な個人がインスタンスということです。
例えば、この「人」を表すPerson
クラスから、年齢20歳のアリス(Alice)と年齢30歳のボブ(Bob)という二人の具体的な個人を作ることができます。
Person person1 = new Person();
person1.Name = "Alice";
person1.Age = 20;
Person person2 = new Person();
person2.Name = "Bob";
person2.Age = 30;
このようなインスタンスを作ってメソッドを実行すると、
「Hello, my name is Alice and I am 20 years old.」
「Hello, my name is Bob and I am 30 years old.」
というような文をコンソールに打ち出すことができるということになります。
値の代入
上記でフィールドは変数であると書きましたが、この変数に値を代入することも可能です。以下の例のように、名前にアリス、年齢に20を入れることで、「Hello, my name is Alice and I am 20 years old.」をコンソールに打ち出すことも可能です。変数に値を入れる際には、「=」を使ってください。
string Name = Alice;
int Age = 20;
C#の基本構文
ここまでで、C#の基本的な構成要素については理解いただけたと思います。続いて、C#を使う上で便利な基本構文をいくつかご紹介しておきます。
条件文
条件文は、その名の通り条件に基づいてコードの実行を制御するものです。以下のコードのように、if節で条件を指定し、条件に合う場合(条件が真の場合)と条件に合わない場合(条件が偽の場合)に分けて、コードを実行することができます。
if (条件)
{
// 条件が真の場合に実行されるコード
}
else
{
// 条件が偽の場合に実行されるコード
}
ループ
ループにはforループとwhileループがあります。forループは、複数あるものに対して、1から順番に同じコードを繰り返し実行する場合に使います。以下の例では、整数0から5に対して、同じコードを繰り返し実行させるコードになっています
for (int i = 0; i < 5; i++)
{
// コードを繰り返し実行
}
一方whileループは、条件文と似ていて、ある条件が真である間、同じコードを繰り返し実行するものです
while (condition)
{
// 条件が真の間、コードを繰り返し実行
}
アレイ
アレイ(Array)は、複数のデータを格納するためのデータ構造で、データを集めたグループのようなものですが、アレイを構成するためにはいくつかの条件があります。まず、アレイは最初に指定した要素数が保持されるため、要素の数を変更するには新しいアレイを作る必要があります。
また、アレイ内の要素はすべて同じデータ型である必要があります。例えば、整数型のアレイ、文字列型のアレイといったように、それぞれのデータ型のアレイを作る必要があります。以下の例では、要素数が5の整数型のアレイになっています。
int[] numbers = { 1, 2, 3, 4, 5 };
リスト
リスト(List)もアレイに似ていますが、構成要素の数を追加または削除することができます。アレイと同様リスト内の要素は同じデータ型である必要がありますが、要素の型は最初に指定する必要がなく、実行時に動的に変更することができます。以下の例では、都市のリストに要素を加えていっています。
var cities = new List<string>();
cities.Add("New York");
cities.Add("London");
cities.Add("Tokyo");
まとめ
お疲れ様でした!このレッスンでは、C#の基本構造・要素・構文について学んできました。プログラミングに馴染みのない人は、少し難しいと感じたかもしれません。でもあまり気にせず7割わかったと思ったら、次のセクションに進んでください。さまざまな角度からアプリ制作を学んでいるうちに、意味をなしてくる部分もあるので大丈夫ですよ。
小テスト
それではここで小テストです。
問題:以下のコードの赤、緑、オレンジ、青で示されたそれぞれの部分の名前と役割はなんですか?
//
using System;
//
class Shopping
{
//
public string Item;
public int Number;
//
public void Buy()
{
print("I need to buy {Number} {Item}.");
}
}