前回の作業でプレイヤーが動くようになりました。次はステージを作っていきましょう。
今回のゲーム「悪路王2020」ではステージのギミックが重要なので、その部分についての考え方~実装方法までを順番に説明していきますね。
ステージを簡単に作るための考え方
では、はじめに「悪路王2020」のステージの作り方についての考え方を説明します。
今回のゲームは非常にシンプルなので、ステージも考え方一つでとても簡単に作ることができます。その考え方とはズバリ「障害物を動かす」という発想です。
普通2Dアクションゲームというと、このサイトのサンプルゲーム「ユニティちゃんの2Dアクション」のように
- キャラクターが移動したり、ジャンプしたりできる
- キャラクターに合わせてカメラが移動する
という風になっているのが一般的だと思います。しかし「悪路王2020」ではプレイヤーはキャラをジャンプさせることしかできないので、そもそもカメラを動かす必要がありません。
したがって今回は(普通の2Dゲームのように横長のステージを作ってプレイヤーを走らせるのではなく)カメラの見える範囲にだけステージを用意して、障害物を画面外から流せばいかにもプレイヤーキャラが走っているように見える、というトリックを使うというわけです。
動く障害物の作り方
ステージ作りの考え方が分かったところで、早速それを実装していきます。ここではステージの基本となる「動く障害物」を作ってみましょう。
障害物のゲームオブジェクトの作成
まず、障害物のゲームオブジェクトを作ります。
最初にインポートしてもらったスプライト画像の中に、「floor」という真っ黒な画像があると思うので、それをシーンにドラッグ&ドロップしてください。そうしたら、
- 名前:Wall
- タグ:Wall(※新しく作ってください)
- レイヤー:Obstacle
に変更しましょう。できたらこのゲームオブジェクトに「ボックスコライダー2D」をアタッチして、下の画像のように設定を変更してください。
こうすることで、スプライトのサイズを変更するとボックスコライダーの大きさも自動的に変化するようになります。
動く障害物のC#スクリプト
次に、障害物を動かすためのC#スクリプトを書いていきます。「Scripts」フォルダ内の「Obstacles」フォルダに新しいC#スクリプトを作り、名前を「Wall」に変更して次のスクリプトを書いてください。
using System.Collections; using System.Collections.Generic; using UnityEngine; [RequireComponent(typeof(SpriteRenderer))] public class Wall : MonoBehaviour { SpriteRenderer spriteRenderer; float speed = 5; //とりあえずデフォルト値を5としておく public float Speed { set { speed = value; } } void Update() { transform.position = new Vector2(transform.position.x - speed * Time.deltaTime, transform.position.y); } //サイズと位置を調整 public void SetWall(Vector2 size) { spriteRenderer = GetComponent<SpriteRenderer>(); spriteRenderer.size = size; transform.position = new Vector2(transform.position.x, transform.position.y + size.y / 2); } //画面外に出たら破棄(※テストプレイ時にシーンビューに映っていると破棄されないので注意) private void OnBecameInvisible() { Destroy(gameObject); } }
スクリプトを書けたら、それを先ほど作ったゲームオブジェクトにアタッチしてプレハブ化しましょう。これで動く障害物ができました。