tanaka's Programming Memo

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

(2)シーンの作成(2015.1改訂版)

←(1)概要・プロジェクトの作成・オブジェクトの作成(2015.1改訂版)
(3)登場するオブジェクトの動かし方(2015.1改訂版)→


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

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

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

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

  • 画面にシーン名を表示。
  • 【Jump】ボタンが押されたら、シーンを切り替える。

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

タイトルシーンの追加

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

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

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

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

f:id:am1tanaka:20150127223435p:plain

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

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

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

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

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

Unity4.6では日本語用の文字コード変更は不要になったので、そのまま作業を継続する。

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

  • 【プロジェクト(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)】ビューの【Create】→【Create Empty】を選択して、空の「GameObject」を追加する。
  • 追加した「GameObject」の名前を「Title」に変更する。
  • 【プロジェクト(Project)】ビューの「CTitle」スクリプトをドラッグして、【階層(Hierarchy)】ビューに作成した「Title」オブジェクトにドロップする。

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

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

動作が確認できたらもう一度実行ボタンを押して実行を停止する。Unityは、実行したままにしておくと、変更を加えても状態が元に戻されてしまう。動作を確認したら、必ず実行を停止するようにしよう。

[Ctrl]キー+[S]キーで保存する。

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

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

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

【プロジェクト(Project)】ビューの「Scenes」フォルダ内に「GameOver」シーンが追加されれば完了。あとはタイトルと同じ方法で、画面の左上に「ゲームオーバー」と表示されるシーンにしよう。

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

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

タイトル→ゲーム、ゲームオーバー→タイトルへの移行を実装しよう(ゲーム→ゲームオーバーの処理はゲーム中に行うので、ここでは実装しない)。

シーンの切り替え方法

「Applicatoin.LoadLevel("シーン名")」というコードを実行することでシーンを移行できる。ただし、シーンをプロジェクトに組み込んでおく必要がある。

どこに記載するか

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

ボタンの判定はどうやるか?
  • キーが押されたり、マウスの入力を確認するのは「Input」オブジェクトを利用する。
  • ゲームに使うボタンはユーザーが好きに設定できるようにした方が便利なので、編集した操作を参照する「Input.GetButtonDown("ボタン名")」関数を使う。
  • ボタン名は、メニューから【Edit】→【Project Settings】→【Input】で開く画面の【Axes】内に定義されているものが指定できる。
  • 今回はキーボードのスペースキーが設定されている「Jump」を使う。

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

実装

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

  • メニューの【File】→【Build Settings】を選ぶ。
  • 【プロジェクト(Project)】ビューの[Scenes]フォルダ内の[Game][GameOver][Title]の3つのシーンを選択して、ドラッグして、[Scenes In Build]欄にドロップする。

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

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

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

以上で、タイトルからゲームを開始する処理が実装できる。

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

←(1)概要・プロジェクトの作成・オブジェクトの作成(2015.1改訂版)
(3)登場するオブジェクトの動かし方(2015.1改訂版)→