4th week - dsuz/2019-1st-term-unity-game-development GitHub Wiki

プロジェクトが失われてしまった人は

新しく空の Unity プロジェクト (2D) を作り、3rdWeekCompleted.unitypackage をインポートすることで先週の授業終了時の状態になる。

今日のテーマ

  1. 得点を管理する
  2. 得点を表示する(UI)
  3. ゲームを管理する
    • ゲームクリアを管理する
    • ゲームオーバーを管理する
    • ゲームスタートを管理する

スコアをつける機能を追加する

  1. ScoreAndGameManagement.unitypackage をダウンロードしてプロジェクトにインポートする
  2. シーンを実行してブロックを壊し、「ブロックを壊したらスコアが Console に出力される」ことを確認する

説明

  1. 「ブロックを壊すと加算される得点」は TargetBlockController に追加されている
  2. TargetBlock の Prefab (BlockDarkGreyPrefab 等)を見ると、Score という設定が追加されている
  3. 前述の Score を変更して実行し、加算される得点が変わることを確認する(あとで)
  4. 得点を保持する変数は BallController に定義されている
  5. 得点を加算する処理は BallController.OnCollisionEnter2D で行われている

スコアを画面に表示する

  1. 次のようにして、シーンに UI コンポーネントの Text を追加する。
    • image
  2. Text の名前を ScoreText に変える
  3. Hierarchy で ScoreText をダブルクリックすると、Scene でそのオブジェクトが中心に表示される。
  4. ScoreText オブジェクトに対して以下の設定をする
    • 画面に表示される範囲を確認して、画面の右上の方に ScoreText を移動する
    • Text コンポーネントの設定 Color を変更して、見やすい色にする
  5. ScoreText を、Ball オブジェクトの BallController の設定 Score Text にアサインする
    • image
  6. シーンを実行して、スコアが画面に表示されることを確認する

説明

  1. BallController の中で、アサインされた ScoreText を利用している
    • using UnityEngine.UI; をしていることにも注意すること
  2. BallController.AddScrore で ScoreText に表示されている内容を更新している
  3. UI コンポーネントの各設定を知る
    1. Rect Transform コンポーネントの各設定
      • Pos X, Y, Z - 表示位置
      • Width, Height - 幅、高さ
      • Anchors - 基準点となる割合を表す。最初は Anchor Presets を使うとよい。
    2. Text コンポーネントの各設定
      • Text - 表示する文字
      • Character - フォントの設定
      • Paragraph - フォントの表示位置、表示スタイルの設定
      • Color - 色
    3. その他の項目は今のところ使わないが、ヘルプボタンを押すと説明を見られることは知っておくこと。

ミス/ゲームオーバーを判定し、処理する

  1. 次のようにして空の GameObject を作る
    • image
  2. GameObject の名前を Killzone に変えて、以下の設定をする
    1. Box Collider 2D コンポーネントを追加する
    2. Transform - Position と Box Collider 2D - Size - X を調整して、「ボールがここに来たらゲームオーバー」になる位置を設定する
    3. タグ "KillzoneTag" を追加し、Killzone オブジェクトに KillzoneTag を設定する
  3. 上記の設定をすると、Killzone は以下のようになる
    • image
  4. 実行してボールを撃ち返さずに Killzone に当てると、ボールの動きが止まることを確認する
  5. 次に "Game Over!" を表示する Text を設定する。先ほどのように UI - Text オブジェクトを作り、以下の設定をする
    1. 名前を MessageText に変える
    2. MessageText を画面中央に配置し、色などを調整する
    3. Text コンポーネントの設定 Text を消す
      • image
    4. Ball オブジェクトの BallController - Message Text に MessageText をアサインする
      • image
  6. 実行してボールを Killzone に当てると、ボールの動きが止まると共に Game Over と表示されることを確認する

説明

  1. ミス/ゲームオーバーの判定は BallController.OnCollisionEnter2D で行っている
  2. Killzone にぶつかると BallController.GameOver が呼ばれる。ここでボールを止め、画面の表示をしている。

ゲームクリアーを判定する

  1. シーンを実行し、TargetBlock を全て消すと画面に "Clear!" の文字が出ることを確認する

説明

  1. BallController.AddScore で「現在シーン内にある TargetBlock の数」を集計している
  2. TargetBlock の集計には、GameObject.FindObjectsOfType を使っている。これは「指定したコンポーネントを持つオブジェクトを全て取得する」という機能がある。
  3. Find 系の関数には以下のものがある
    1. GameObject.Find(string name) - name で指定した名前を持つオブジェクトを取得する。指定した名前のオブジェクトが複数ある場合、最初に見つかったものを取得する。見つからない場合は null を返す。
    2. GameObject.FindWithTag(string tag) - tag で指定したタグを持つオブジェクトを取得する。指定したタグを持つオブジェクトが複数ある場合、最初に見つかったものを取得する。見つからない場合は null を返す。
    3. GameObject.FindGameObjectsWithTag(string tag) - tag で指定したタグを持つオブジェクトを全て取得する。見つからない場合は要素 0 個の配列(空の配列)を返す。
    4. GameObject.FindObjectOfType() - type で指定したコンポーネントを持つオブジェクトを取得する。指定したコンポーネントを持つオブジェクトが複数ある場合、最初に見つかったものを取得する。見つからない場合は null を返す。
    5. GameObject.FindObjectsOfType() - type で指定したコンポーネントを持つオブジェクトを全て取得する。見つからない場合は要素 0 個の配列(空の配列)を返す。

ゲームスタート機能を追加する

  1. Hierarchy から以下のように UI - Button オブジェクトを追加する
    • image
  2. Button オブジェクトの名前を StartButton に変えて、次の設定をする
    1. MessageText と重ならないように中央下部に移動する
    2. On Click () の右下にある + をクリックし、以下のように Ball オブジェクトをアサインして、BallController.Push を選ぶ
      • image
      • image
    3. StartButton の子オブジェクトになっている Text オブジェクトの Text コンポーネントの設定 Text を "Start" に変えて、ボタンのキャプションテキストを "Start" にする
      • image
  3. Ball オブジェクトの Ball Controller コンポーネントの設定 Start Button に StartButton オブジェクトをアサインする
    • image
  4. 実行して「Start ボタンを押すまでボールが動かず、Start ボタンを押すとボールが動き出す」ことを確認する

説明

  1. Button オブジェクトを使うと、OnClick() を設定することで、クリックした時に「指定したオブジェクトの指定した public 関数」を呼び出すことができる
  2. 今回はボタンをクリックすると BallController.Push を呼び出している
  3. BallController.Push には「ボタンを非表示にする」処理が書いてある
  4. これまでは BallController.Start で Push を呼んでいたが、StartButton を設定している時には実行開始時には Push しないようにしてある
  5. Button コンポーネントの設定により、操作をした時の表示を変えることができるが、詳しくはもっと先で扱う。

まとめ

  1. スコアを管理するには、それを入れておく変数が必要である
  2. UI を作る機能について
    1. Text では画面に文字を表示できる
    2. Button はクリックすると指定したオブジェクトの指定した public 関数を呼び出せる
    3. UI はScene 上では別の次元で管理され、Game ウィンドウで重ねて表示される
  3. GameObject.Find 系の関数を使うことで、Scene 内のオブジェクトを取得することができる
⚠️ **GitHub.com Fallback** ⚠️