4th week - dsuz/2019-1st-term-unity-game-development GitHub Wiki
新しく空の Unity プロジェクト (2D) を作り、3rdWeekCompleted.unitypackage をインポートすることで先週の授業終了時の状態になる。
- 得点を管理する
- 得点を表示する(UI)
- ゲームを管理する
- ゲームクリアを管理する
- ゲームオーバーを管理する
- ゲームスタートを管理する
- ScoreAndGameManagement.unitypackage をダウンロードしてプロジェクトにインポートする
- シーンを実行してブロックを壊し、「ブロックを壊したらスコアが Console に出力される」ことを確認する
- 「ブロックを壊すと加算される得点」は TargetBlockController に追加されている
- TargetBlock の Prefab (BlockDarkGreyPrefab 等)を見ると、Score という設定が追加されている
- 前述の Score を変更して実行し、加算される得点が変わることを確認する(あとで)
- 得点を保持する変数は BallController に定義されている
- 得点を加算する処理は BallController.OnCollisionEnter2D で行われている
- 次のようにして、シーンに UI コンポーネントの Text を追加する。
- Text の名前を ScoreText に変える
- Hierarchy で ScoreText をダブルクリックすると、Scene でそのオブジェクトが中心に表示される。
- ScoreText オブジェクトに対して以下の設定をする
- 画面に表示される範囲を確認して、画面の右上の方に ScoreText を移動する
- Text コンポーネントの設定 Color を変更して、見やすい色にする
- ScoreText を、Ball オブジェクトの BallController の設定 Score Text にアサインする
- シーンを実行して、スコアが画面に表示されることを確認する
- BallController の中で、アサインされた ScoreText を利用している
-
using UnityEngine.UI;
をしていることにも注意すること
-
- BallController.AddScrore で ScoreText に表示されている内容を更新している
- UI コンポーネントの各設定を知る
- Rect Transform コンポーネントの各設定
- Pos X, Y, Z - 表示位置
- Width, Height - 幅、高さ
- Anchors - 基準点となる割合を表す。最初は Anchor Presets を使うとよい。
- Text コンポーネントの各設定
- Text - 表示する文字
- Character - フォントの設定
- Paragraph - フォントの表示位置、表示スタイルの設定
- Color - 色
- その他の項目は今のところ使わないが、ヘルプボタンを押すと説明を見られることは知っておくこと。
- Rect Transform コンポーネントの各設定
- 次のようにして空の GameObject を作る
- GameObject の名前を Killzone に変えて、以下の設定をする
- Box Collider 2D コンポーネントを追加する
- Transform - Position と Box Collider 2D - Size - X を調整して、「ボールがここに来たらゲームオーバー」になる位置を設定する
- タグ "KillzoneTag" を追加し、Killzone オブジェクトに KillzoneTag を設定する
- 上記の設定をすると、Killzone は以下のようになる
- 実行してボールを撃ち返さずに Killzone に当てると、ボールの動きが止まることを確認する
- 次に "Game Over!" を表示する Text を設定する。先ほどのように UI - Text オブジェクトを作り、以下の設定をする
- 名前を MessageText に変える
- MessageText を画面中央に配置し、色などを調整する
- Text コンポーネントの設定 Text を消す
- Ball オブジェクトの BallController - Message Text に MessageText をアサインする
- 実行してボールを Killzone に当てると、ボールの動きが止まると共に Game Over と表示されることを確認する
- ミス/ゲームオーバーの判定は BallController.OnCollisionEnter2D で行っている
- Killzone にぶつかると BallController.GameOver が呼ばれる。ここでボールを止め、画面の表示をしている。
- シーンを実行し、TargetBlock を全て消すと画面に "Clear!" の文字が出ることを確認する
- BallController.AddScore で「現在シーン内にある TargetBlock の数」を集計している
- TargetBlock の集計には、GameObject.FindObjectsOfType を使っている。これは「指定したコンポーネントを持つオブジェクトを全て取得する」という機能がある。
- Find 系の関数には以下のものがある
- GameObject.Find(string name) - name で指定した名前を持つオブジェクトを取得する。指定した名前のオブジェクトが複数ある場合、最初に見つかったものを取得する。見つからない場合は null を返す。
- GameObject.FindWithTag(string tag) - tag で指定したタグを持つオブジェクトを取得する。指定したタグを持つオブジェクトが複数ある場合、最初に見つかったものを取得する。見つからない場合は null を返す。
- GameObject.FindGameObjectsWithTag(string tag) - tag で指定したタグを持つオブジェクトを全て取得する。見つからない場合は要素 0 個の配列(空の配列)を返す。
- GameObject.FindObjectOfType() - type で指定したコンポーネントを持つオブジェクトを取得する。指定したコンポーネントを持つオブジェクトが複数ある場合、最初に見つかったものを取得する。見つからない場合は null を返す。
- GameObject.FindObjectsOfType() - type で指定したコンポーネントを持つオブジェクトを全て取得する。見つからない場合は要素 0 個の配列(空の配列)を返す。
- Hierarchy から以下のように UI - Button オブジェクトを追加する
- Button オブジェクトの名前を StartButton に変えて、次の設定をする
- MessageText と重ならないように中央下部に移動する
- On Click () の右下にある + をクリックし、以下のように Ball オブジェクトをアサインして、BallController.Push を選ぶ
- StartButton の子オブジェクトになっている Text オブジェクトの Text コンポーネントの設定 Text を "Start" に変えて、ボタンのキャプションテキストを "Start" にする
- Ball オブジェクトの Ball Controller コンポーネントの設定 Start Button に StartButton オブジェクトをアサインする
- 実行して「Start ボタンを押すまでボールが動かず、Start ボタンを押すとボールが動き出す」ことを確認する
- Button オブジェクトを使うと、OnClick() を設定することで、クリックした時に「指定したオブジェクトの指定した public 関数」を呼び出すことができる
- 今回はボタンをクリックすると BallController.Push を呼び出している
- BallController.Push には「ボタンを非表示にする」処理が書いてある
- これまでは BallController.Start で Push を呼んでいたが、StartButton を設定している時には実行開始時には Push しないようにしてある
- Button コンポーネントの設定により、操作をした時の表示を変えることができるが、詳しくはもっと先で扱う。
- スコアを管理するには、それを入れておく変数が必要である
- UI を作る機能について
- Text では画面に文字を表示できる
- Button はクリックすると指定したオブジェクトの指定した public 関数を呼び出せる
- UI はScene 上では別の次元で管理され、Game ウィンドウで重ねて表示される
- GameObject.Find 系の関数を使うことで、Scene 内のオブジェクトを取得することができる