【Unity】2Dと3Dのジャンプ移動やアニメーションの実装方法を解説


今回はUnityを始めたばかりの人向けに、キャラクターの移動方法を覚えた次のステップとして2Dおよび3Dにおいてキャラクターにジャンプ動作をさせる機能の実装方法を紹介いたします。

※本記事の操作キャラクターには「Unity-Chan(ユニティちゃん)」を使用しています。

© Unity Technologies Japan/UCL

参考ページ)ユニティちゃん公式サイト ガイドライン

Unityを使って「2Dキャラ」をジャンプさせる基礎知識

2D空間におけるキャラクターにジャンプをさせるフロー

2D空間におけるキャラクターにジャンプをさせるための大まかなフローは下記になります。

  1. キャラクター、床のオブジェクトを配置
  2. キャラクター及び床に必要なコンポーネントを用意
  3. キャラクターにジャンプをさせるためのスクリプトを用意

ジャンプをさせるために使用するコンポーネント

使用する主なコンポーネントはrigidbody,colliderの二つになります。

・rigidbody:「力の計算(物体に働く重力や摩擦などの力の計算)」を行うコンポーネント

★→rigidbodyの具体的な使い方についてはこちら

・collider:「物体の当たり判定(衝突)」を行うコンポーネント

★→colliderの具体的な使い方についてはこちら

上記のコンポーネントは、Add Component>Physics 3Dの項目にあります。

2D用と3D用のものが用意されていますので、2D空間で使用する場合は、「2D」と付いている方を利用します。

colliderに関しては複数の形状がありますので下記の表でご紹介いたします。

Box Collider 2D ボックス状の衝突判定
Capsule Collider 2D カプセル状の衝突判定
Circle Collider 2D サークル状の衝突判定
Edge Collider 2D 線状の衝突判定
Polygon Collider 2D 自由な形状の衝突判定
Composite Collider 2D BoxとPolygonの衝突判定を組み合わせる

必要な形状の衝突判定を選ぶ必要があります。

ジャンプをさせるためのスクリプト

ジャンプをされるためのスクリプトは、C#にて記述をしていきます。

先ほど追加したコンポーネントによる力の計算により、キャラクターにジャンプをさせることになります。

ジャンプ部分のスクリプトは下記のようになります。

スペースキーを押した時に、計算により求められた力を与えることでキャラクターがジャンプします。

これだけでは、キャラクターがスペースキーを押すたびにジャンプをしてしまいますので、地面に接地している時だけなどジャンプに制限をかけるスクリプトを追加する必要があります。

Unityを使って「3D」キャラをジャンプさせる基礎知識

3D空間でキャラクターをジャンプさせるフロー自体は、2Dと同様ですがジャンプ動作をさせる方法は3つあります。

1.CharacterController関数を利用する

キャラクターを操作するための関数がCharacterControllerになります。

実装自体も簡単で、何個かの設定をすればしようか可能です。

物理演算を行わないようなゲームによく使われる手法となります。

と呼び出すだけでキャラクターを動かすことが可能です。

2.Rigidbodyを使用する

CharacterControllerと違い、物理演算を使用してキャラクターを動かします。

と記述することで、物理的な速度がキャラクターに与えられ動かすことができます。

参考記事)【Unity】Rigidbodyを使用して重力・空気抵抗を発生させる方法

3.transform.positionを利用する

キャラクターの座標を数値で指定して動かす手法になります。

Update関数内で、transformを徐々に変化させることで、キャラクターが動いているように見せます。

本記事の後半では、こちらを利用してスクリプトを組んでいます。

参考記事→)【Unity】Transformを使って3Dオブジェクトを移動させる方法

【2D】実際にユニティちゃんをジャンプさせる手順

今まで紹介した内容を組み合わせて実際に2D、3D空間でユニティちゃんにジャンプの動作をできるように実装をしていきましょう。

事前準備として、テストに使用する下記2つのユニティちゃんのデジタルアセットデータをダウンロードしておきます。

・ユニティちゃん 2Dデータ

・ユニティちゃん 3Dデータ

それでは2Dでunityちゃんをジャンプさせてみよう

新規プロジェクトの立ち上げ

Unityを起動して、新規プロジェクトを立ち上げます。

2Dユニティちゃんにジャンプをさせるので、テンプレートは「2D」を選択しておきます。

プロジェクト名称は自由で構いませんが今回は「UnityChan2D」としておきます。

ユニティちゃん(2D)のアセットデータのインポート

事前にダウンロードしておいたデジタルアセットデータのインポートを行います。

File > Open Scenes > UnityChan2D.unitypackage

 

 

インポートが完了すると、プロジェクトウィンドウ内にあるAssetsに「UnityChan2D」が追加されます。

ユニティちゃん(2D)と床となるマテリアルの追加

今回はキャラクターとしてユニティちゃん、床となるマテリアルとして背景素材を利用します。

ユニティちゃんは、UnityChan2D >  Sprites にある「UnityChan_footwork_0」をドラッグ&ドロップして、ヒエラルキーウィンドウへ追加します。

背景素材は、UnityChan 2D > Demo > Sprites にある「BG_02」をドラッグ&ドロップして、ヒエラルキーウィンドウへ追加します。

BG_02のサイズは適宜変更します。

ヒエラルキーウィンドウへ各素材を追加をすると、シーンウィンドウは下記のような状態になります。

コンポーネントの追加

ユニティちゃんと床となるマテリアルに必要となるコンポーネントを追加します。

ユニティちゃんと床となるマテリアルにRigidbody 2Dを追加。

Add Components > Physics 2D > Rigidbody 2D

ユニティちゃんを動かした時に転ばないように、RigidBodyのConstraints内にあるFreeze Rotetion Zにチェックを入れておきます。

床となるマテリアル(BG_02)が落下しないようにRigidBodyのBody TypeはKinematicを選択しておきます。

ユニティちゃんにはCapsule Collider 2DとBox Collider 2Dを、床となるマテリアル(BG_02)にはBox Collider 2Dのみを追加。

ユニティちゃんへの衝突判定の追加

下記の手順でColliderを追加します。

Add Components > Physics 2D > Capsule Collider 2D

Add Components > Physics 2D >  Box Collider 2D

Colliderの追加後、サイズ変更及び位置調整を行い、下記の画像のようにしておきます。

床の接地判定に使用するために、ユニティちゃんに追加したBox Collider2Dを選択し、Is Triggerにチェックを入れておきます。

床となるマテリアルへの衝突判定の追加

下記の手順でColliderを追加します。

Add Components > Physics 2D > Box Collider 2D

Colliderの追加後、サイズ変更及び位置調整を行い、下記の画像のようにしておきます。

ジャンプ及び左右移動のスクリプト追加

ジャンプ及び左右移動をさせるスクリプトを作成します。

プロジェクトウィンドウのCreateよりC♯ Scriptを選択し、「PlayerController」と名前をつけます。

作成した「PlayerController」をダブルクリックで開き、スクリプトを作成していきます。

ジャンプ及び左右移動をさせるスクリプトは下記になります。

ジャンプ制限及び左右反転もスクリプト内に記述していますので参考にしてみてください。

Unityを使ったC♯入門はこちら→)[第1回] C#(C Sharp)言語とは?|Unityで学ぶC#入門

スクリプトを入力・保存を行ったら、プロジェクトウィンドウの「PlayerController」を選択し、ヒエラルキーウィンドウのユニティちゃんにドラッグ&ドロップします。

実際に動かしてみると下記のようになります。

アニメーションの遷移の設定

待機、ジャンプ及び歩行におけるアニメーションの遷移を設定していきます。

Animator Controllerの作成

プロジェクトウィンドウのCreateよりAnimator Controllerを選択し、「unity_move」と名前をつけます。

ノードの作成

作成した「unity_move」をダブルクリックするとアニメーションウィンドウが開きます。

アニメーションウィンドウ内で右クリック > Create State > Emptyを選択し、Emptyノードを追加します。

Emptyノードをクリックし、インスペクターウィンドウで待機状態「Idle」の名称設定と適用するアニメーションの設定を行います。

今回アニメーション自体は、アセットデータに含まれるものを使用します。

待機状態:Footwork

設定は下記のように行います。

 

同様にして、「Move」、「Jump_up」、「Jump_down」の3つのノードを作成します。

各項目に適用するアニメーションは下記を使用します。

  • 歩行:Move
  • ジャンプ(上昇):Jump_up
  • ジャンプ(下降):Jump_down
ノード間の遷移の設定

ノード間の遷移の設定を行います。

「Idel」ノードの上で右クリックし、Make Transitionを選択します。

マウスを動かすと「Idle」から矢印がのびるので、「Move」の上でクリックをします。

これで「Idle」から「Move」への遷移が設定されました。

設定のフローは下記を参考にしてください。

「Move」から「Idle」への遷移やその他の遷移に関しても同様に設定を行います。

遷移の全景は下記のようになります。

遷移の条件の設定

次に遷移の条件の設定をします。

「Idle」から「Move」への遷移を例にとって手順を示すと下記になります。

  1. アニメーターウィンドウのParametersの+ボタンをクリックし、Boolを選択。
  2. 作成されたパラメータの名称を「Run」にする。
  3. 「Idle」から「Move」への矢印を選択。
  4. インスペクターウィンドウにあるHas Exit Timeのチェックボックスを外す。
  5. インスペクターウィンドウにあるConditionsの+ボタンをクリックし、ドロップダウンからRunと  trueを選択。

上記の作成方法でパラメータとしてIdle、JumpUp、JumpDownを作成し、同様の設定で各矢印の設定を行えばAnimator Controllerの設定は完了です。

キャラクターへのAnimator Controllerの適用

作成した「unity_move」をヒエラルキーウィンドウのユニティちゃんにドラッグ&ドロップし、遷移情報を適用します。

アニメーションを遷移させるスクリプトの作成

「Player Controller」にアニメーションの遷移に関するスクリプトの追加を行います。

アニメーションの遷移を追加したスクリプトは下記のようになります。

今回はswich-case文を使用してアニメーションの遷移を行っています。

これで2D空間におけるアニメーションを含めたジャンプ及び移動の設定が完了です。

実際に動作をさせると下記のようになります。

【3D】実際にユニティちゃんをジャンプさせる手順

新規プロジェクトの立ち上げ

Unityを起動して、新規プロジェクトを立ち上げます。

3Dユニティちゃんにジャンプをさせるので、テンプレートは「3D」を選択しておきます。

プロジェクト名称は自由で構いません。

今回は「UnityChan3D」としておきます。

ユニティちゃん(3D)のアセットデータのインポート

事前にダウンロードしておいたデジタルアセットデータのインポートを行います。

File > Open Scenes > UnityChan_1_2_1.unitypackage

インポートが完了すると、プロジェクトウィンドウ内にあるAssetsに「UnityChan」が追加されます。

ユニティちゃん(3D)と床となるマテリアルの追加

今回はキャラクターとしてユニティちゃん、床となるマテリアルとしてPlaneオブジェクトを利用します。

ユニティちゃんは、UnityChan >  Modelsにある「unitychan」をドラッグ&ドロップして、ヒエラルキーウィンドウへ追加します。

Planeオブジェクトは、ヒエラルキーウィンドウのCreateから3D Object > Planeを選択し追加します。

Planeオブジェクトのサイズは適宜変更します。

ヒエラルキーウィンドウへ各素材を追加をすると、シーンウィンドウは下記のような状態になります。

コンポーネントの追加

ユニティちゃんと床となるマテリアルに必要となるコンポーネントを追加します。

ユニティちゃんと床となるマテリアルにRigidbodyを追加します。

追加の仕方は、2Dの時と同じですが、Phsics2DではなくPhysicsを使用します。

Add Components > Physics > Rigidbody

ユニティちゃんを動かした時に転ばないように、RigidBodyのConstraints内にあるFreeze Rotetion XおよびZにチェックを入れておきます。

床となるマテリアルは、2Dの時と同じように落下しないようにRigidBodyのBody TypeはKinematicを選択しておきます。

次に、ユニティちゃんにCapsule ColliderとBox Colliderを追加します。

床となるマテリアルであるPlaneオブジェクトにはMesh Colliderが設定されているため追加は不要です。

ユニティちゃんへの衝突判定の追加

下記の手順でColliderを追加します。

Add Components > Physics  > Capsule Collider

Add Components > Physics  > Box Collider

Colliderの追加後、サイズ変更及び位置調整を行い、下記の画像のようにしておきます。

床の接地判定に使用するために、ユニティちゃんに追加したBox Colliderを選択し、Is Triggerにチェックを入れておきます。

設定完了後、再生をスタートすると下記のような動作となります。

ジャンプ及び左右移動のスクリプト追加

ジャンプ及び左右移動をさせるスクリプトを作成します。

プロジェクトウィンドウのCreateよりC♯ Scriptを選択し、「Player」と名前をつけます。

作成した「Player」をダブルクリックで開き、スクリプトを作成していきます。

ジャンプ及び左右移動をさせるスクリプトは下記になります。

ジャンプ制限及び左右反転もスクリプト内に記述していますので参考にしてみてください。

スクリプトを入力・保存を行ったら、プロジェクトウィンドウの「Player」を選択し、ヒエラルキーウィンドウのユニティちゃんにドラッグ&ドロップします。

実際に動かしてみると下記のようになります。

アニメーションの遷移の設定

待機、ジャンプ及び歩行におけるアニメーションの遷移を設定していきます。

Animator Controllerの作成

2Dの時と同じようにプロジェクトウィンドウのCreateよりAnimator Controllerを選択し、「UnityAction」と名前をつけます。

ノードの作成

作成した「UnityAction」をダブルクリックするとアニメーションウィンドウが開きます。

2Dの時と同じ作成方法で、下記のノードを作成します。

  • 待機状態:Idle
  • 歩行:Run
  • ジャンプ:Jump

各状態に適用するアニメーションは、アセットデータに入っているものを使用します。

  • 待機状態:WAIT00
  • 歩行:RUM00_F
  • ジャンプ:JUMP00
ノード間の遷移の設定

2Dの時と同様にノード間の遷移の設定を行います。

3つの状態が下記のようになるように設定をおこなってください。

遷移の条件の設定

次に遷移の条件の設定をします。

「Idle」から「Run」への遷移を例にとって手順を示すと下記になります。

  1. アニメーターウィンドウのParametersの+ボタンをクリックし、Boolを選択。
  2. 作成されたパラメータの名称を「Running」にする。
  3. 「Idle」から「Run」への矢印を選択。
  4. インスペクターウィンドウにあるHas Exit Timeのチェックボックスを外す。
  5. インスペクターウィンドウにあるConditionsの+ボタンをクリックし、ドロップダウンからRunningとtrueを選択。

上記の作成方法でパラメータとしてIdle、Jumpingを作成し、同様の設定で各矢印の設定を行えばAnimator Controllerの設定は完了です。

キャラクターへのAnimator Controllerの適用

作成した「UnityAction」をヒエラルキーウィンドウのユニティちゃんにドラッグ&ドロップし、遷移情報を適用します。

アニメーションを遷移させるスクリプトの作成

「Player」にアニメーションの遷移に関するスクリプトの追加を行います。

アニメーションの遷移を追加したスクリプトは下記のようになります。

今回は2Dの時と同じようにswich-case文を使用してアニメーションの遷移を行っています。

これで3D空間におけるアニメーションを含めたジャンプ及び移動の設定が完了です。

実際に動作をさせると下記のようになります。

まとめ

いかがでしたでしょうか。

Unityの2D及び3Dキャラクターにジャンプ移動をさせる方法についてご紹介してきました。

どちらの場合においても、キャラクターに対してどのように接触判定を与えるか、動作をさせるために力の計算をどのように処理するかが重要でした。

これは、障害物などを増やした場合なども同様なのでゲームを作成する時の参考にしてもらえればと思います。

合わせて読みたい関連記事

■Unityちゃんをカメラで追従する方法はこちら→【Unity】カメラの基本設定を理解しよう!|Camera入門①

■Unityちゃんを用いた当たり判定についてはこちら→【Unity】ユニティちゃんに攻撃アニメーションをつけて当たり判定を設定しよう!


この記事はいかがでしたか?よければシェアをお願いします。

Yuhei Fujie