【Unity】2D横スクロールアクションゲームのキャラクター移動方法

2017.09.23 自習室 0

ここでは下の動画のような、2D横スクロールアクションゲームのキャラクター移動について説明します。

移動イメージ

この記事はUnity1weekという1週間ゲームジャムで作ったゲームを元にしています。実際の操作感を知りたい場合は以下のリンクからプレイできますので、試してみてください。

ゲームはこちらからプレイできます

環境

  • Unity 2017.1.0f3

このページの構成

ポイント
事前準備
スクリプト全文
処理の説明
参考記事

ポイント

スクリプトの処理手順は以下のとおりです。
① 入力を取得する。
② 入力に応じてキャラクターの状態を変更する。
③ 状態に応じてアニメーションを変更する。
④ 移動する。

事前準備

キャラクターの設定

キャラクターには以下のコンポーネントを追加しておいてください。

  • Rigidbody2D
  • Capsule Collider2D(通常の衝突判定用)
  • Box Collider2D(地面との接地判定用)
  • Animator

Colliderを分けているのは、着地後すぐにジャンプしたい場合などに、通常の衝突判定用のColliderだけだと反応が悪かったからです。

参考にCollider設定のキャプチャを貼っておきます。

colliderの設定

ちなみにここで使用しているキャラは以下のリンクから入手できます。

『コーゲンシティ・オールスターズ!』ユニティちゃんピクセルアートパック for アクションゲーム Vol.2

アニメーションの設定

アニメーションは「待機状態」「走っている状態」「上昇中」「下降中」の4種類を切り替えて表示しています。
アニメーションの設定についてはスクリプトの切り替え処理と合わせて後述します。

spriteアニメの設定方法がわからない場合は下記リンクなどを参考にしてみてください。

ステージの設定

地面との接地判定に衝突したオブジェクトのタグを使用しています。同じように動作させたい場合は、地面となるオブジェクトのタグを「Ground」にしておいてください。

スクリプト全文

処理の説明

入力の取得

まず GetInputKey() で入力を取得しています。
処理としては、左右の入力を取得して key に入力内容を格納しているだけです。key の値を 1, -1 でもっているのは、入力方向に応じてキャラクターの向きを変更する処理にも使用するためです。向きの変更については後述する「アニメーションの変更」で説明します。

状態の変更

ここではキャラクターの状態を「待機状態」「走行中」「上昇中」「下降中」の4種類持っています。状態の判定は以下のように行なっています。

  • 待機状態 : 地面に接地している  かつ 左右の入力がない
  • 走行中  : 地面に接地している  かつ 左右の入力がある
  • 上昇中  : 地面に接地していない かつ 上方向に速度がかかっている
  • 下降中  : 地面に接地していない かつ 下方向に速度がかかっている

上下の速度は Rigidbody2D.velocity.y で取得できます。

アニメーションの変更

状態に応じてアニメーションを変更します。基本的には上記4つの状態に応じた以下のフラグをAnimatorに用意しておき、そのフラグを切り替えることで処理を行っています。

  • 待機状態 : isIdle = true
  • 走行中  : isRun = true
  • 上昇中  : isJump = true
  • 下降中  : isFall = true

ここでは走行中のアニメーションを右向きのものしか作成していなかったため、上記設定だけでは左に移動するときも右を向いたアニメーションが表示されていました。
これを回避するため、左入力されている場合は transform.localScale.x にマイナスの値を与えてspriteを反転させています。key の値を 1, -1 でもっているのはこの処理のためです。

※ 公式マニュアルでは処理が重いため、この方法は推奨されていません。SpriteRendererのflipXをtrueにすることでもspriteは反転させることが可能なので、処理速度が気になる方はそちらを使用してください。ただしこの方法ではCollider等は反転しないため、左右対称ではない場合は注意が必要です。

また、stateEffectという変数に状態に応じて値を設定しています。これはジャンプ中に左右のボタンを押した場合、地上と同様の速度で移動してしまうのを防ぐための変数です。移動処理時に使用しています。

2017.12.06追記
Animator側の設定も見せてほしいとご連絡いただいたので、簡単にですが追記します。

アニメーション切り替えの設定

上図のように、各状態からどの状態にも遷移できるように設定しています。

animation遷移の設定はどれも同じなので、例として「待機状態(isIdle)から走っている状態(isRun)」と「走っている状態(isRnu)から待機状態(isIdle)」への遷移の設定のみキャプチャを貼っておきます。

待機状態から走っている状態への遷移 走っている状態から待機状態への遷移

デフォルト設定からの変更点は「HasExitTimeのチェックを外す」「FixedDurationにチェックを付ける」「TransitionDurationを0.01にする」の3点です。アニメーションがすぐに切り替わるように設定しています。

移動

入力に応じてキャラクターを移動させます。
移動し始めは等速移動ではない感じにしたかったので、最初はAddforceで力を加えて、途中から一定速度で移動するような処理にしています。
ゲームをプレイしてもらうと分かるのですが、正直ちょっとふわふわした操作感になっているので、この辺りの処理は適宜書き換えてもらったほうがいいかもしれません。いい処理方法をご存知の方は教えてください。

また「アニメーションの変更」のところでも書いていますが、キャラクターの状態に応じた stateEffect という値を移動時に掛けることで、ジャンプ中の横移動速度に制限を加えています。

着地判定

着地判定はOnTrigger〜系の処理で行なっています。
衝突したオブジェクトのタグが “Ground” の場合、isGround をtrue に書き換えています。

参考記事

関連記事


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です