ラン&ジャンプ系ゲームの作り方

この記事では Jump ’n’ run game (ラン&ジャンプゲーム) の作り方を紹介します。

作り方手順

1. プレイヤーを表示する。重力で落下させる

まずはプレイヤーを表示して重力で落下させます。

重力落下

重力の扱いを理解していれば、特に難しくないと思います。

2. 床を表示する。プレイヤーが床の上に乗れるようにする

床を表示して、プレイヤーがその上に乗れるようにします。

床に乗れるようにする

判定は「上からの当たり判定のみ有効にする」という方法で実装できます。ジャンプも実装して、ちゃんとジャンプ後に着地できるか確認しておきましょう。

3. プレイヤーの横移動を実装する。それに追従して画面をスクロールさせる

プレイヤーが横に移動し続けるようにします。そして、その動きに追従して、画面をスクロールさせます。

スクロールの実装

スクロールの考え方としては、「ワールド座標系」「スクリーン座標系」という2つの座標系の考え方を理解することです。

  • ワールド座標系:各オブジェクトが実際に存在する座標
  • スクリーン座標系:画面内に表示する座標
ワールド座標系とスクリーン座標系

計算方法ですが、例えば、ワールド座標としてはプレイヤーをどんどん右に移動させて、プレイヤーの位置を 500px に移動したとします。

ただ、画面上では、プレイヤーは 80px の位置に表示させたいとします。

そうすると、スクリーン座標の左側は 500 – 80 = 420px にズラす必要があります。この値を元にプレイヤーだけでなく、床オブジェクトも実際の座標から 420px ズラすとスクロールが実装できます。

ワールド座標に存在するゲームオブジェクトをスクリーン座標に変換する

この考え方を実装することが難しい場合は、ひとまず床そのものを動かすという方法もありです(座標変換を行わずすべてスクリーン座標系で処理を行う)。その場合は、プレイヤーが右へ移動する処理は不要となります。

4. 床を動的に生成する。当たり判定が正しくできているかを確認する

床の自動生成

床をプログラムから自動生成するようにします。ひとまず上記画面のようにランダムな位置に出現するようにしても良いです。このときに、当たり判定が正常にできているかを確認します。上の画面のようにプレイヤーが空中に浮いてしまったりしないようにします。

ちなみに私がこのサンプルを作るときにハマって空中浮遊してしまった原因は、

空中に浮いてしまった理由

プレイヤーの当たり判定が大きすぎて、上側の接触でも接地判定としていると推測しました。実際にこれも原因の1つだったのですが、この修正では解消せず、1時間ほど悩んだところ……、

空中に浮いてしまった理由2

床のコリジョンサイズを間違えるという痛恨のミスをしていました。プレイヤーの当たり判定を足元のみにする修正だけではうまくいかないわけです。思い込みで調査するのは危険、ということを改めて学んだ次第です。

5. 画面外に落下したらゲームオーバー

画面外に落下したらゲームオーバー

プレイヤーのY座標が画面外に移動したら、プレイヤーを消滅させるなどしてゲームオーバー表示をします。

6. 一定ラインを超えたらゲームクリア

ゴールに接触したらゲームクリア

プレイヤーの移動距離が一定を超えたらゲームクリアとします。上記画面ではゴールオブジェクトに接触したらクリアとしていますが、簡単にできそうな方法で問題ありません。

補足:床オブジェクト出現のアルゴリズムについて

床オブジェクト出現のアルゴリズムについて補足します。
出現タイミングは、床オブジェクトの横幅以上のスクロールが発生したときです。例えば、床オブジェクトの横幅が 32px の場合、前回床オブジェクトが出現した時よりも 32px 画面が動いていたら、出現判定を行うようにします。

また、極端にランダムな高さで出現させると、プレイヤーがジャンプで飛び移れなくなるので注意です。
方法としては、前回出現させた床のY座標を覚えておいて、その値から例えば±128px 以内の位置に出現させる(最大のジャンプ力を考慮します)、とすると無理がない位置に出現させることが可能となります。

それと同じ考え方で、同じ高さに連続して出現させる場合は、前回の高さそのままで出現させるようにします。

ゲームを拡張する

ラン&ジャンプ系ゲームはスマートフォン向けのゲームジャンルとして人気なので、それらを参考に、色々なアクションを追加していくのも楽しいと思います。

例えば、ジャンプ中にタップすると2段ジャンプしたりや長押しで滑空など……。

アクションのバリエーションで、様々なゲーム性が表現できるのが、ラン&ジャンプ系ゲームの魅力ではないかと思います。

ハイパーカジュアルゲームナイト Voodooが語るランアクションゲーム開発Tips – Unityステーション

こちらの動画でラン系ゲームのTipsが紹介されており、より詳しく知りたい方にはおすすめとなります。

ラン系ゲームの定義

  • 1. A地点からB地点への移動:スタート地点Aから目的地Bへ向かう要素があればラン系ゲーム
  • 2. 「動き」こそがゲームプレイ:2Dであればジャンプ。3Dの場合は左右 (画面の奥に向かって移動する)
  • 3. 既存の道のり:進むルートをショートカットできる。ルート分岐の発生など
  • 4. 障害物:障害物への衝突ルールをどのようにするか

1. A地点からB地点への移動

最近のラン系ゲームの傾向は、目的地Bが複数用意されている。それにより同じコースを複数回遊べるようになっている。

2. 「動き」こそがゲームプレイ

キャラクターを動かすための操作方法の種別

  • シンプルな空間ナビゲート:ジャンプ、または左右移動
  • 物理的空間:物理空間(地面)を傾けるなど物理空間を操作するタイプ。ルート選択しやすい
  • アビリティの活用:走るための能力の組み合わせを選択してコースを攻略するタイプ
  • 全自動の動き:環境をコントロールするタイプ
  • ダブル:2通りの使い方がある
  • 描画:フリック操作で図形を書くことで動きが決まる
  • タイピング:文字入力で動きを決める

3. 既存の道のり

目的に到達するまでの道のりをどのように定義するのか?

  • ショートカット:プレイヤーのスキルで時間短縮可能な道のりにする
  • 分岐:プレイヤーのスキルでゴールが変化する

4. 障害物

障害物に衝突したときの挙動をどうするか?

  • フェイル:失敗にする(即死)
  • 進行性あり:ライフを失うだけにする
  • デザイン性の高いもの
  • クイズ:瞬時の判断を試される障害物(○×クイズ。正解を選ぶと先に進める)

関連記事

Godot Engineでのラン&ジャンプゲームの作り方は以下の記事に書いています。

【Godot】ラン&ジャンプゲームのチュートリアル