はじめに
おはようございます。第1回です。
今日やること
- 本講座で作るゲームの紹介
- スクリプト・オブジェクトの作成
- オブジェクトにスクリプトを適用する
- サンプルコードを実行する
前回のおさらい
前回(第0回)ではUnityのセットアップを行いました。
エディタの日本語化をする際にプロジェクトの作成を一緒に行いましたが、今回からはそのとき作ったものと同じ「2D(Built-In Render Pipeline)」のプロジェクトでゲームの制作を行っていきます。
プロジェクト名はブロック崩しの原点?とも言える「Atari Breakout」より、「Breakout」という名前にしておきます。(もちろん他の名前でも良いです)
また、前回の資料の最後に載せていたエディタの使い方も貼っておきます↓
名前 | 役割 |
---|---|
①ヒエラルキー | シーン上に配置されたゲームオブジェクトの一覧が表示される |
②シーン | ゲームオブジェクトなどを配置する編集画面 |
③ゲーム | 動作テスト中のゲームを表示する画面 |
④インスペクター | ゲームオブジェクトなどの設定を確認・変更する |
⑤プロジェクト | プロジェクトに含まれる各種ファイルが表示される |
⑥コンソール | エラーメッセージなどを表示する画面 |
本講座で作るゲームの紹介
本当は前回に伝えておくべきだったんですが、本講座で作っていくゲームを先に紹介しておきます。
本講座では「ブロック崩し」を作っていきます。
↑こんな感じのやつを作ります
有名なのでどんなゲームか知っている方も多いかもしれませんが、下にある四角形(プレイヤー)を左右に動かして、ボールを跳ね返すゲームです。
ボールが下の床に触れるとゲームオーバーで、上のブロックにボールを当てて全て壊すとゲームクリアとなります。
画面サイズの変更
作り始める前に、ゲームの画面サイズを変えておきます。
「ゲーム」ビュー上部の「スケール」の左のプルダウンメニューから、画面サイズを「Full HD(1920x1080)」に変更します。
今回作るゲームはPCで動作するゲームなので(言い忘れてました)、アスペクト比は16:9のFull HDにしておいたほうが良いです。
この設定が終わったら、真ん中の画面は「シーン」ビューに戻しておきましょう。
スクリプトの作成&VSがインストールされているか確認
まず、プレイヤー用のスクリプトを作成するついでに、前回のセットアップで入れたVisual Studioが正しくインストールされているか確認します。
スクリプトを作成します。スクリプト(Script)はプログラムのファイルのことです。
画面下のプロジェクトウィンドウから、プロジェクトに含まれるファイル類を管理することができます。
「Assets」というフォルダが開かれていると思うので(AssetsにはScenesというフォルダのみ存在しているはずです)、ここで右クリックして「作成」→「フォルダー」をクリックします。
するとフォルダが作成されるので、名前を「Scripts」に変更しましょう。これはスクリプトを保存する用のフォルダとなります。
ダブルクリックでScriptsフォルダを開いて、その中でもう一度右クリック→「作成」→「C# スクリプト」をクリックします。
名前を入力します。名前は「Player」としておきます。ブロック崩しでいうプレイヤーは左右に動かせる四角形のやつです。
作ったスクリプトファイルをダブルクリックで開いてみましょう。
このようにスクリプトファイルがVisual Studioで開かれたら、Visual Studioは正しくインストールされています。
もし正しくインストールできていなければ、第0回の「モジュール追加画面が出なかった場合」の項目を参考にしてインストールしてください。(少し時間がかかります)
スクリプトの編集
先程作った「Player」スクリプトを編集していきます。
見て分かる通り、スクリプトファイルには既になにか書き込まれています。
それぞれの部分を軽く説明しておきます。(C#の用語がいくつか出てきていますが現時点で完全に理解する必要はないです)
①:usingで外部クラスを読み込んでいます。(おまじない的なやつです。無視して構いません)
②:Playerクラスの定義です。デフォルトでMonoBehaviourというクラスを継承するようになっています。
③:Startメソッドです。こちらはこのスクリプトが読み込まれたときに呼び出されます。
④:Updateメソッドです。こちらはまだ使いません。
Start, Updateメソッドの1行前に「//」から始まる文が入っていますが、これはコメントといってプログラムに直接関係しない部分です。メモ書きのようなものです。
とりあえず、Start()の中にこのように記述してください。
public class Player : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Debug.Log("Hello World!");
}
// Update is called once per frame
void Update()
{
}
}
これで、ゲーム開始時に「Hello World!」とログに表示されるようになります。
Debug.LogはUnity側で用意されている関数で、コンソールログに文字を表示するために使います。
書けたら、スクリプトを上書き保存しましょう。Ctrlキーを押しながらSキーを押すか、左上の保存ボタンをクリックして保存できます。(Ctrl+Sのショートカットは多用するので覚えておきましょう)
ちなみに、保存されていない場合は開いているファイルの名前の末尾に*(アスタリスク)が付きます。(今回の場合、「Player.cs*」と表示されていればまだ保存されていません)
スクリプトは一旦完成ですので、Unityエディタに戻りましょう。
オブジェクトの作成
次に、オブジェクトを作成します。
Unityにおけるオブジェクト(ゲームオブジェクト, Game Object)とは、*シーンに配置する物体すべてを指す用語で、ゲームのキャラクターだけでなく、背景やテキスト、ボタンなどのユーザーインターフェースの部品、表示範囲を決めるカメラなどさまざまな種類があります(参考文献[1] p.20より)。
*シーン(Scene)・・・簡単に言えばゲーム内の1画面のデータです。「タイトル画面」「ゲームメイン画面」「クリア画面」など必要に応じて追加できます(参考文献[1] p.18より)。
ヒエラルキーウィンドウ(左側の窓)の何も無い所(灰色の所)で右クリック→「2D オブジェクト」→「スプライト」→「正方形」の順にクリックします。
すると白い正方形が表示されます。これがゲームオブジェクトです。
シーンビューの操作方法
次にシーンビューでの操作方法について説明します。
左上のツールバーから様々なツールを選択することができます。一番上の手のアイコンのツールはハンドツールで、これを選択した状態でドラッグすると表示範囲を動かすことができます。
また、他のツールを使用している状態でも「右クリックでドラッグ」で同様に表示範囲を動かすことができます。(つまり、ハンドツールはあまり使いません)
2Dゲームの作成でよく使うツールを2つ紹介しておきます。
1つ目は移動ツールです。その名の通り、オブジェクトを移動することができます。
緑、赤の矢印をドラッグするとそれぞれy方向(鉛直方向)、x方向(水平方向)に移動することができ、青い正方形をドラッグすると自由に移動させることができます。
2つ目は矩形ツールです。四隅の青い円をドラッグして拡大縮小、枠内をドラッグして移動、青い円の外側をドラッグして回転することができます。
いずれのツールも、オブジェクトを選択していないと使えないので、ヒエラルキーまたはシーンビュー内でオブジェクトをクリックして選択しましょう。
オブジェクトにスクリプトを適用
スクリプトは作るだけでは実行されません。何かしらのオブジェクトにアタッチ(適用)させる必要があります。
先ほど作ったオブジェクトに、スクリプトを適用してみましょう。
「Square」を左側のヒエラルキーから選択して、右側のインスペクターの下の方にドラッグアンドドロップします。
このように、「Player(スクリプト)」という項目が追加されればOKです。
この操作は「コンポーネントを追加」ボタン→「Player」で検索してPlayerスクリプトをクリックでも行うことができます。
テストプレイしてみよう
スクリプトの適用ができたら、早速テストプレイしてみましょう。
画面中央上部の三角のボタンを押すとテストプレイができます。
下画面の「コンソール」を開いて、「Hello World!」と表示されれば成功です!
もしこのように「All compiler errors have to be fixed ...」と表示された場合、コンパイルエラーが起こっています。スクリプトを確認してエラーを直しましょう。
こちらはコンパイルエラーの一例です。このように、エラーが起こっている箇所には赤い波線が表示されます。
このスクリーンショットの場合だと、「;」(セミコロン)が全角で入力されているためにエラーが生じています。
コンパイルエラーが無いのにHelloWorldが表示されなかったら、以下の2点を確認してみてください。
- スクリプトが保存されているか
- スクリプトがSquareオブジェクトにアタッチされているか
最後に、シーンを保存しましょう。このようにSampleScene(現在開いているシーン)の末尾にアスタリスクがついていると思うので(保存できていない状態)、Ctrl+Sで保存しましょう。
これで今回の内容は終わりです。お疲れ様でした。
おまけ スクリーンショットの取り方
エラーの解決法などを質問するときに、自分の状況をわかりやすく相手に伝えるためにはスクリーンショットが効果的です。
スクリーンショットの取り方は色々ありますが、以下ではよく使うであろう方法を3つほど紹介しておきます。
- Snipping Tool...Windowsに標準搭載されているスクリーンショットを撮れるアプリです。Winキーを押して「Snipping Tool」で検索すれば起動できます。
- Shift+Winキー+S...このショートカットを実行すると領域を指定してスクリーンショットを取ることができ、画像のデータはクリップボードに保存されます。
- Winキー+PrintScreenキー...画面全体のスクリーンショットを
Onedrive\ピクチャ\スクリーンショット
に保存できます。保存した画像は画像編集ソフトでトリミングしましょう。
課題(C#プログラミング入門1)
本講座では、次回までに各自で確認してもらいたいことややってほしいことなどを課題として出すことにします。
もちろんやってこなくても全く構いません。講座の内容の理解度を高めるために一応書いてある程度のものです。
今回の課題はC#の基礎についてです。以下にC#の基礎事項についての解説を載せておくので、確認しておいてください。
(プログラミングをやったことがある方は既に知っている内容が多いと思います)
四則演算
まずは四則演算をしてみましょう。C#での主な演算子は以下のようになっています。(というか、ほとんどのプログラミング言語で共通です)
演算子 | 機能 |
---|---|
+ | 加算 |
- | 減算 |
* | 乗算 |
/ | 除算 |
% | 除算のあまり |
以下では今回作ったPlayerスクリプトのStartメソッドに色々書き込んでいきます。
PlayerのStartメソッドの中身を以下のように書きかえてみてください。
void Start(){
Debug.Log(1+1);
Debug.Log(3-5);
Debug.Log(3*10);
Debug.Log(6/3);
Debug.Log(64%2);
}
実行結果は以下にようになるはずです。
2
-2
30
2
0
注意ですが、この例の書き方だと計算結果として実数が表示されることはありません。(例えば、2/3を出力しようとすると0.6666...ではなく0と表示されます)
これは整数(int型)同士の計算結果は整数となるという仕様のためです。詳しくは次の変数の話で解説します。
変数
次は変数についてです。変数には型と呼ばれるタイプがあり、それぞれ役割が違います。
以下によく使われる型とその役割を書いておきます。
名前 | 役割 |
---|---|
int | 整数を格納する(4バイト, -2,147,483,648 ~ 2,147,483,647の値をとり得る) |
float | 小数を格納する(4バイト, 有効桁数6~9桁) |
double | 小数を格納する(8バイト, 有効桁数15~17桁) |
bool | 真偽値(true or false)を格納する |
char | Unicode16ビット文字を格納する(1つの文字を格納する) |
string | 文字列を格納する(複数の文字からなる文を格納する) |
それでは、実際に変数を定義してその中身を出力してみましょう。以下がサンプルコードです。
void Start(){
int x = 5;
float y = 0.75f;
string s = "unity";
Debug.Log(x);
Debug.Log(y);
Debug.Log(s);
x = 10;
Debug.Log(x);
}
これで実行すると以下のようになります。
5
0.75
unity
10
y(float型)は0.75という値が格納されていますが、代入時には"0.75f"のように末尾にfを入れて代入しています。
C#では小数点を持つ数値はすべてdouble型として扱われるので、double型より表現力(有効桁数)の小さいfloat型にdouble型の数値を代入することができません。
そこで、数値の末尾にfをつけることでその数値はfloat型となり、float型の変数に代入することができます。(実際、fを付けていない小数をfloatに代入しようとするとコンパイルエラーとなります)
ここで2/3の話に戻りますが、int型同士の除算の答えはint型となってしまうので、どちらかをfloatまたはdouble(小数を扱える型)にする必要があります。
変数や数値の前に「(型の名前)」といれることで、変数や数値の型を変えることができます。これをキャストといいます。
以下がキャストの例です。(2つ目のやつ)
void Start(){
Debug.Log(2/3); //0 が出力される
Debug.Log((float)2/3); //0.6666667 が出力される
Debug.Log(2.0/3); //0.666666666666667 が出力される
}
2つ目はfloat型の2とint型の3の除算のため答えはfloat型となります。3つ目は小数点を持つ数値はすべてdouble型として認識されるので、答えはdouble型となります。
(余談)floatを使う理由
doubleのほうが精度が良いのになぜfloatを使うんだろう...とfloatの存在意義を疑問視する方もいるかもしれません。
しかし、Unityではfloat型の方がよく使われます。
これはUnity側で用意されている関数が小数の値としてfloat型のものをよく使うからです。
Unity側で用意されている関数がfloat型しか扱えないのなら、最初からfloatの値を用意しておいたほうが楽ですよね。
(なぜUnity側でfloatを使うようにしているかは厳密には分かりませんが、doubleだと処理速度が遅くなってしまうのが主な要因っぽいです)
文字列の結合
最後に文字列の結合についてです。さっきのサンプルコードに書いていたように、文字列は「"」(ダブルクオーテーション)で囲んで表現します。
そして、文字列は他の型のデータ(数値など)と結合することができます。
以下が文字列の結合の例です。
void Start(){
string name = "キタサンブラック";
int birth_m = 3;
int birth_d = 10;
Debug.Log(name + "の誕生日は" + birth_m + "月" + birth_d + "日です");
}
これを実行するとこのようになります。今回はstringとintの結合例でしたが、もちろんfloatなどとも結合することができます。
C#のプログラミングについては一旦ここまでにします。次回以降も同様にC#の解説をつける予定です。
参考文献: [1]「UnityではじめるC# 基礎編」, 大槻有一郎著, エムディエヌコーポレーション, 2016