レッスン 3.2 - 世界を動かす

Tutorial

Beginner

+0XP

70 mins

(169)

Unity Technologies

レッスン 3.2 - 世界を動かす

概要:

このゲームのコアなメカニクスをはっきりさせました。プレイヤーはスペースバーを押して画面に入ってくる障害物を飛び越えることができます。しかし、プレイヤーは最初の数秒間は走っているように見えますが、その後、背景が消えてしまいます。これを修正するには、背景を継ぎ目なくループさせて、世界が動き続けているように見せる必要があります。また、プレイヤーが障害物にぶつかったときにゲームを停止させ、背景の動きを止め、障害物の出現も止める必要があります。最後に、プレイヤーのところを通り過ぎた障害物を破壊しなければなりません。

プロジェクトの成果物:

背景は障害物と同時に自然に動き、障害物はゲームの境界線から出ると消去されます。スクリプト通信を活用して、プレイヤーが障害物に衝突すると背景とスポーンマネージャーが停止します。障害物に衝突すると、コンソールログにゲームオーバーのメッセージが表示され、バックグラウンドとスポーンマネージャーが停止します。

1. 導入

2. 背景をループさせるスクリプトを作成する

背景をループさせ、障害物と同じ速度で左に移動させて、世界が前に進んでいるように見せる必要があります。ありがたいことに、すでに左に移動するスクリプトはありますが、ループさせるには新しいスクリプトが必要になります。
  1. RepeatBackground.cs という新しいスクリプトを作成し、Background オブジェクトにアタッチします。

3. 背景の位置をリセットする

背景をループさせて、世界が前に進んでいるような錯覚を与えるためには、背景オブジェクトの位置をリセットして、ぴったり収まるようにする必要があります。
  1. 新しく private Vector3 startPos を宣言します。
  2. Start()で、startPos = transform.position と代入して、実際の開始位置に設定します。
  3. Update() で、特定の距離を移動した場合に位置をリセットする if 文を記述します。

4. コライダーを使って背景のループを修正する

背景が数秒ごとにループするようにはなりましたが、遷移がかなりおかしく見えます。いくつかの新しい変数を使って、背景のループを完璧かつシームレスにする必要があります。
  1. BackgroundBox Collider コンポーネントを追加します。
  2. 新しく private float repeatWidth 変数を宣言します。
  3. Start() で、ボックスコライダーの幅を 2 で割ったものを取得します。
  4. repeatWidth 変数を、ループさせる関数に組み込みます。

5. 新しいゲームオーバーのトリガーを追加する

プレイヤーが障害物にぶつかったときに、すべてを停止させる「ゲームオーバー」状態を発生させたいのですが、そのためには、プレイヤーがぶつかったすべてのゲームオブジェクトにラベルを付けて識別する方法が必要です。
  1. インスペクターで、Ground には「Ground」タグを、Obstacle プレハブには「Obstacle」タグを追加します。
  2. PlayerController で、新しく public bool gameOver; を宣言します。
  3. OnCollisionEnter if-else 文を追加して、プレイヤーが「Ground」または「Obstacle」のタグが付いた物に衝突したかどうかをテストします。
  4. 「Ground」に衝突した場合は isOnGround = true、「Obstacle」に衝突した場合は gameOver = true を設定します。

6. ゲームオーバーになったら MoveLeft を止める

bool 型変数 gameOver を追加して、それでうまく行っているように見えますが、障害物にぶつかっても背景やオブジェクトが動き続けています。MoveLeft スクリプトが PlayerController と通信し、プレイヤーが gameOver をトリガーすると停止するようにする必要があります。
  1. MoveLeft.cs で、新しく private PlayerController playerControllerScript; を宣言します。
  2. Start() Player を見つけて PlayerController コンポーネントを取得して playerControllerScript を初期化します。
  3. ゲームが終わっていないかどうかをチェックする if 文移動させるメソッドをラップします。

7. ゲームオーバーになったら障害物の生成を止める

gameOver == true のときに背景と障害物の動きは止まりますが、スポーンマネージャーはまだ障害物を生成し続けています。スポーンマネージャーのスクリプトと通信して、ゲームが終了したら停止するように指示する必要があります。
  1. SpawnManager.cs で、MoveLeft.cs で行ったのと同じ方法で playerControllerScript への参照を取得します。
  2. gameOver == false の場合のみオブジェクトをインスタンス化する条件を追加します。

8. 境界から出た障害物を破棄する

ユニット 2 の動物たちと同じように、境界から出た障害物はすべて破棄する必要があります。そうしないと、彼らは遠くに飛んでいって、ゲーム内にいつまでも居座りつづけてしまいます。
  1. MoveLeft.csUpdate(); で、障害物の位置が leftBound 変数よりも小さい場合に障害物を破棄するように if 文を書きます。
  2. コードを読みやすくするために必要なコメントを追加してください。

9. レッスンのまとめ

新機能:

  • シームレスにループする背景
  • 障害物にぶつかると背景が停止する
  • プレイヤーが障害物に衝突すると障害物の生成が停止する
  • 障害物が画面外で破壊される

新しい概念とスキル:

  • 背景をループさせる
  • コライダーの幅を取得する
  • スクリプト通信
  • 等価演算子(「==」)
  • タグ
  • CompareTag()

次のレッスン:

  • 私たちのキャラクターの内面は幸せかもしれませんが、外から見たとき少しこわばっているように見えます。そこで、次はアニメーションを追加していきましょう。

Complete this Tutorial