tanaka's Programming Memo

プログラミングについてのメモ。

(2)シーンの作成

今回のブロック崩しでは、以下のようなシーン(Scene)を用意する。

  • タイトル
  • ゲーム
  • ゲームオーバー

詳細はあとで考えるとして、先にシーンを準備して、シーン間の遷移を実装しよう。ゲームに関連するシーンを先に用意しておくと、このあとの開発が楽になる。例えば、ミスの判定を実装する時に、ゲームオーバーシーンがすでに実装されていれば、判定後にシーンを移行させればすぐに効果が確認できる。

ここでは以下のようなものを簡単に実装しておく。

  • 画面にシーン名を表示。
  • 【Jump】ボタンを押すと、シーンが切り替わる。

ゲームシーンは画面レイアウトを作成した時に実装済みなので、残りの「タイトル」と「ゲームオーバー」シーンを実装しよう。

タイトルシーンの追加

新しいシーンを作成して、それをタイトル用にしよう。

  • メニューから、【File】→【New Scene】を選択。ここで以前までのシーンの保存の確認が表示されたら【Yes】で保存する。
  • 新しいシーン(Scene)が表示される。
  • [Ctrl]キー+[S]キーを押す。
  • ファイル名を「Title」として保存する。【プロジェクト(Project)】ビューに「Title」というシーンが追加される。

シーンをプロジェクト上でまとめておくために、シーンをフォルダにまとめておく。

  • 【プロジェクト(Project)】ビューで「Title」シーンを選択しておく。
  • 【Create】ボタンを押して、【Folder】を選ぶ。
  • 【プロジェクト(Project)】ビューに新しいフォルダが作成されるので、名前を「Scenes」に変更する。
  • 「Game」シーンと「Title」シーンを、作成した「Scenes」フォルダにドラッグ&ドロップする。

画面の左上に「タイトル」と表示する

タイトル画面用のスクリプトを用意して、画面の左上に「タイトル」と表示しよう。スクリプトをこれからいくつか作っていくので、まとめておくためのフォルダを作成しておこう。

  • 【プロジェクト(Project)】ビューで、余白をクリックして何も選択されていない状態にする。
  • 【Create】ボタンを押して【Folder】を選択。
  • 作られたフォルダ名を「Scripts」に変更する。

フォルダが作成できたら、そのフォルダ内にスクリプトを新規作成する。

  • 【プロジェクト(Project)】ビューの「Scripts」フォルダを右クリックする。
  • 【Create】→【C# Script】を選択する。
  • 作成したC#のファイル名を「CTitle」に変更する。

Unityで日本語を使うには、スクリプトファイルのエンコードを「Unicode(UTF-16)」の「Big Endian」というものに変更する必要がある。この作業が、Unity Ver3.4.2f2に組み込まれているスクリプトエディタの【MonoDevelop】ではうまく出来ないので、一度、他のテキストエディタを使ってエンコードを変更しておく必要がある。

  • 【プロジェクト(Project)】ビューから作成した「CTitle」をクリックして選択する(ダブルクリックはしない)。
  • メニューから【Assets】→【Show in Explorer】を選択。セキュリティエラーが出た場合は「許可」を選ぶ。
  • しばらく待っているとスクリプトの入っているフォルダが開くので、「CTitle.cs」を右クリックして【プログラムから開く】→【Notepad】を選択。
  • 【メモ帳】でスクリプトが開いたら、メニューの【ファイル】→【名前を付けて保存】を選択。
  • 【ファイルの種類】を「すべてのファイル」、【文字コード】を「Unicode big endian」に変更して【保存】ボタンを押す。
  • 「上書きしますか?」というウィンドウが表示されたら「はい」で上書きする。
  • メモ帳を閉じる。

以上で、エンコードの変更は完了である。新規にスクリプトを作成したら、最初にこの作業をするようにしよう。一度エンコードを変更したスクリプトファイルは、その後はそのまま【MonoDevelop】で編集してよい。

画面の左上に「タイトル」と表示する。

  • 【プロジェクト(Project)】ビューから「CTitle」をダブルクリックする。【MonoDevelop】が開くまでしばらく時間がかかるので待つ。
  • MonoDevelop】が開いたら、クラス名がファイル名と一致しているかを確認する。「public class」の後ろが「NewBehaviourScript」だった場合、C#ではファイル名とクラス名を一致させる必要があるので「CTitle」に修正する。
public class NewBehaviourScript : MonoBehaviour {

以上のようであったら、以下のように修正する。最初から以下のようになっていたら何もしなくてよい。

public class CTitle : MonoBehaviour {
  • ファイルの一番最後の「}」を見つけて、その上の行に、以下のスクリプトを追加する。
	// GUI描画
	void OnGUI() {
		GUI.Label(new Rect(0,0,100,20),"タイトル");
	}
  • [Ctrl]キー+[S]キーを押して上書き保存する。

記述したのが、画面上に文字を描画する方法の一つである。「void OnGUI()」という関数は、グラフィカルユーザーインターフェース(GUI)を描画する命令を書いておくための関数である。これを自力で追加して、中にGUI関連の命令を書いておくと、毎フレーム、指定のGUIを画面上に描画してくれる。

ここで書いたのはGUIのLabelという文字を描画するためのパーツを使って、(0,0)から幅(100,20)の範囲に、"タイトル"という文字を描画する命令である。

スクリプトが出来上がったら、それが動くように登録する必要がある。【MonoDevelop】を最小化などして【Unity】に戻って以下の作業をしよう。

シーン全体に関連するスクリプトをまとめておくためのゲームオブジェクト(GameObject)を作成する。

  • 【階層(Hierarchy)】ビューの余白をクリックして、何も選ばれていない状態にする。
  • メニューの【GameObject】→【Create Empty】を選択して、新しい「GameObject」を追加する。
  • 追加した「GameObject」の名前を「Scripts」に変更する。
  • 【プロジェクト(Project)】ビューの「CTitle」スクリプトをドラッグして、【階層(Hierarchy)】ビューに作成した「Scripts」オブジェクトにドロップする。

以上で作業は完了である。

実行ボタンを押して、ゲーム画面が以下のようになることを確認しよう。

動作が確認できたら[Ctrl]キー+[S]キーで保存する。

ゲームオーバーシーンの作成

タイトルシーンを作成した手順を振り返りながら、ゲームオーバーシーンを作成してみよう。

  1. 【プロジェクト(Project)】ビューの余白をクリックして、何も選択されていない状態にする。
  2. メニューで【File】→【New Scene】を選択して、新しいシーンを作成する。
  3. [Ctrl]キー+[S]キーを押して、保存画面を呼び出す。
  4. 「GameOver」のファイル名で保存する。
  5. 【プロジェクト(Project)】ビューに「GameOver」シーンが追加されるので、「Scenes」フォルダにドラッグ&ドロップで移動させる。

以上でゲームオーバーシーンの新規追加が出来る。あとはタイトルと同じ方法で、画面の左上に「ゲームオーバー」と表示されるシーンにしよう。

  • スクリプトは、【プロジェクト(Project)】ビューの「Scripts」フォルダを右クリックして、【Create】→【C# Script】を選択して作成する。ファイル名は「CGameOver」。
  • スクリプトのエンコードを「Unicode(big endian)」にして、クラス名の確認と、文字描画のスクリプトを追加する。
  • 【階層(Hierarchy)】ビューに「Scripts」という空のゲームオブジェクトを作成。
  • 作成した「CGameOver」スクリプトを、「Scripts」ゲームオブジェクトにドラッグ&ドロップ。

シーンの切り替えを実装する。

タイトルからゲームへの移行と、ゲームオーバーからタイトルへの移行を実装しよう。

シーンの切り替え方法

「Applicatoin.LoadLevel("シーン名")」というスクリプトを呼び出せばシーンの移行は簡単に出来る。ただし、シーンをプロジェクトに組み込んでおく必要がある。

どこに記載するか

プログラムは、各シーンのスクリプトの「Update()」関数内に記載する。1フレームに1回呼び出される関数で、ゲームを制御するプログラムの大半はこの中に記載することになる。

ボタンの判定はどうやるか?

キーが押されたり、マウスの入力を確認するのは「Input」オブジェクトを利用する。ゲームに使うボタンはユーザーが好きに設定できるようにした方が便利なので、編集した操作を参照する「Input.GetButtons("ボタン名")」関数を使う。

ボタン名にはメニューの【Edit】→【Project Settings】→【Input】として呼び出される設定画面の【Axes】内に定義されているものを指定できる。

今回はキーボードのスペースキーが設定されている「Jump」を使う。

以上が、シーンの切り替えに必要な情報である。早速実装してみよう。

実装

シーンをプロジェクトに追加する。

  • 【プロジェクト(Project)】ビューの「Scenes」フォルダ内の「Title」シーンをダブルクリックする。画面の切り替えの際に保存確認のウィンドウが表示されたら「Yes」で保存しておく。
  • シーンタイトルに切り替わったかをタイトルバーで確認する。「Unity - Title.unity -・・・」となっていればOK。

  • メニューの【File】→【Build Settings】を呼び出す。
  • 【Add Current】ボタンを押して、Titleシーンを追加する。
  • 【プロジェクト(プロジェクト)】ビューの「Game」シーンをダブルクリックして選ぶ。
  • 【Add Current】ボタンを押して、Gameシーンを追加する。
  • 【プロジェクト(プロジェクト)】ビューの「GameOver」シーンをダブルクリックして選ぶ。
  • 【Add Current】ボタンを押して、GameOverシーンを追加する。

  • シーンの順番がTitle→Game→GameOverの順になっていない場合は、ドラッグ&ドロップしてその順番に変更すること。
  • 追加が出来たら【Build Settings】ウィンドウの×ボタンを押して閉じる。

タイトルで【Jump】ボタンを押したらゲームに切り替わるようにする。

  • 【プロジェクト(Project)】ビューで、「Title」シーンをダブルクリックしてシーンを切り替える。
  • 【プロジェクト(Project)】ビューの「Scripts」フォルダ内の「CTitle」をダブルクリックして、スクリプトを開く。
  • 「void Update() {」となっている行を探して、「{」と「}」の間の行に以下のプログラムを記載する。
		if(Input.GetButton("Jump")) {
			Application.LoadLevel("Game");
		}
  • [Ctrl]キー+[S]キーを押して保存する。
  • 【Unity】に戻って、実行して、[space]キーを押してゲーム画面に切り替わるかを確認してみよう。

以上で、タイトルからゲームを開始する処理が実装できる。同様の方法で、シーンを「GameOver」に切り替えて、「CGameOver」の「Update」関数内に「Title」シーンへ移行するプログラムを追加してみよう。ゲームからゲームオーバーへの移行は、ゲーム処理時に実装するので、ここでは実装しなくてよい。