
レッスン 3.2 - 世界を動かす
Tutorial
Beginner
+0XP
70 mins
(169)
Unity Technologies

概要:
このゲームのコアなメカニクスをはっきりさせました。プレイヤーはスペースバーを押して画面に入ってくる障害物を飛び越えることができます。しかし、プレイヤーは最初の数秒間は走っているように見えますが、その後、背景が消えてしまいます。これを修正するには、背景を継ぎ目なくループさせて、世界が動き続けているように見せる必要があります。また、プレイヤーが障害物にぶつかったときにゲームを停止させ、背景の動きを止め、障害物の出現も止める必要があります。最後に、プレイヤーのところを通り過ぎた障害物を破壊しなければなりません。
プロジェクトの成果物:
背景は障害物と同時に自然に動き、障害物はゲームの境界線から出ると消去されます。スクリプト通信を活用して、プレイヤーが障害物に衝突すると背景とスポーンマネージャーが停止します。障害物に衝突すると、コンソールログにゲームオーバーのメッセージが表示され、バックグラウンドとスポーンマネージャーが停止します。
1. 導入
2. 背景をループさせるスクリプトを作成する
背景をループさせ、障害物と同じ速度で左に移動させて、世界が前に進んでいるように見せる必要があります。ありがたいことに、すでに左に移動するスクリプトはありますが、ループさせるには新しいスクリプトが必要になります。
- RepeatBackground.cs という新しいスクリプトを作成し、Background オブジェクトにアタッチします。
3. 背景の位置をリセットする
背景をループさせて、世界が前に進んでいるような錯覚を与えるためには、背景オブジェクトの位置をリセットして、ぴったり収まるようにする必要があります。
- 新しく private Vector3 startPos を宣言します。
- Start()で、startPos = transform.position と代入して、実際の開始位置に設定します。
- Update() で、特定の距離を移動した場合に位置をリセットする if 文を記述します。
4. コライダーを使って背景のループを修正する
背景が数秒ごとにループするようにはなりましたが、遷移がかなりおかしく見えます。いくつかの新しい変数を使って、背景のループを完璧かつシームレスにする必要があります。
- Background に Box Collider コンポーネントを追加します。
- 新しく private float repeatWidth 変数を宣言します。
- Start() で、ボックスコライダーの幅を 2 で割ったものを取得します。
- repeatWidth 変数を、ループさせる関数に組み込みます。
5. 新しいゲームオーバーのトリガーを追加する
プレイヤーが障害物にぶつかったときに、すべてを停止させる「ゲームオーバー」状態を発生させたいのですが、そのためには、プレイヤーがぶつかったすべてのゲームオブジェクトにラベルを付けて識別する方法が必要です。
- インスペクターで、Ground には「Ground」タグを、Obstacle プレハブには「Obstacle」タグを追加します。
- PlayerController で、新しく public bool gameOver; を宣言します。
- OnCollisionEnter に if-else 文を追加して、プレイヤーが「Ground」または「Obstacle」のタグが付いた物に衝突したかどうかをテストします。
- 「Ground」に衝突した場合は isOnGround = true、「Obstacle」に衝突した場合は gameOver = true を設定します。
6. ゲームオーバーになったら MoveLeft を止める
bool 型変数 gameOver を追加して、それでうまく行っているように見えますが、障害物にぶつかっても背景やオブジェクトが動き続けています。MoveLeft スクリプトが PlayerController と通信し、プレイヤーが gameOver をトリガーすると停止するようにする必要があります。
- MoveLeft.cs で、新しく private PlayerController playerControllerScript; を宣言します。
- Start() で Player を見つけて PlayerController コンポーネントを取得して playerControllerScript を初期化します。
- ゲームが終わっていないかどうかをチェックする if 文で移動させるメソッドをラップします。
7. ゲームオーバーになったら障害物の生成を止める
gameOver == true のときに背景と障害物の動きは止まりますが、スポーンマネージャーはまだ障害物を生成し続けています。スポーンマネージャーのスクリプトと通信して、ゲームが終了したら停止するように指示する必要があります。
- SpawnManager.cs で、MoveLeft.cs で行ったのと同じ方法で playerControllerScript への参照を取得します。
- gameOver == false の場合のみオブジェクトをインスタンス化する条件を追加します。
8. 境界から出た障害物を破棄する
ユニット 2 の動物たちと同じように、境界から出た障害物はすべて破棄する必要があります。そうしないと、彼らは遠くに飛んでいって、ゲーム内にいつまでも居座りつづけてしまいます。
- MoveLeft.cs の Update(); で、障害物の位置が leftBound 変数よりも小さい場合に障害物を破棄するように if 文を書きます。
- コードを読みやすくするために必要なコメントを追加してください。
9. レッスンのまとめ
新機能:
- シームレスにループする背景
- 障害物にぶつかると背景が停止する
- プレイヤーが障害物に衝突すると障害物の生成が停止する
- 障害物が画面外で破壊される
新しい概念とスキル:
- 背景をループさせる
- コライダーの幅を取得する
- スクリプト通信
- 等価演算子(「==」)
- タグ
- CompareTag()
次のレッスン:
- 私たちのキャラクターの内面は幸せかもしれませんが、外から見たとき少しこわばっているように見えます。そこで、次はアニメーションを追加していきましょう。