i-school - 強制横スクロールゲーム 手順6
 以下の内容で順番に実装を進めていきます。

 手順4〜8ではプレイヤーの分身となるキャラの作成、キャラの行動とアニメーションの制御について実装を行います。

 この手順では、新しくジャンプ用のアニメーションを作成します。
またキャラ用のスクリプトを修正し、キャラをジャンプさせたり、アニメーションと同期させる制御を実装します。

手順6 −キャラのジャンプの実装−
 9.スクリプトを使って、キャラをジャンプさせて、空中浮遊できるようにする



新しく学習する内容


・Rigidbody2D.AddForceメソッド
・Animator.SetTirggerメソッド


設計


 キャラをジャンプさせる、とはどういうことでしょう、

 Unityの処理として考えた場合、「キャラ(ゲームオブジェクト)の位置を上方向に移動させる」という処理のことになります。
つまり、上方向に移動させることによって、ジャンプしているようにゲーム画面で見せるということです。
 
 そのためには、ジャンプをしているアニメーションが必要になります。まずは、このジャンプのアニメーションを作成し、Animator ビューで
どのような条件の時にジャンプのアニメーションに遷移するかを設定します。

 その後、先ほど作成した PlayerController スクリプトに処理を追加して、このジャンプの一連の処理(キャラを上方向に移動させ、ジャンプのアニメ再生)を実装していきます。


ジャンプ用のアニメーションクリップを3つ作成する


 走るアニメーションや待機のアニメーションと同じように、複数の画像をまとめてヒエラルキーにドラッグアンドドロップして、アニメーションクリップを作成します。

 ジャンプのアニメーションには3つのパターンがありますので、それぞれ同じファイル名でまとめて、3つのアニメーションクリップを作成します。

 アニメーションクリップを作成すると自動的に AnimatorController ファイルも作成されますが、これは最初に作成された Run の AnimatorController ファイルしか利用しません
そのため、新しいアニメーションクリップを作成された時に作られた AnimatorController については削除し、1つだけ(Run のもの)残してください
 

ファイルの場所 ファイルの場所 Assets/UnityChan/2DUnitychan/Sprites/Yuko/Yuko_Jump_Up_1 から Yuko_Jump_Up_2 までの2ファイル



ファイルの場所 ファイルの場所 Assets/UnityChan/2DUnitychan/Sprites/Yuko/Yuko_Jump_MidAir_1 から Yuko_Jump_MidAir_4 までの4ファイル



ファイルの場所 ファイルの場所 Assets/UnityChan/2DUnitychan/Sprites/Yuko/Yuko_Jump_Fall_1 から Yuko_Jump_Fall_3 までの3ファイル



 これらを順番にヒエラルキーにドラッグアンドドロップして、それぞれのアニメーションクリップを作成してください。



 なお上記のファイルは Yuko をキャラクターに選択している場合のファイルです。
適宜、自分の使用しているキャラクターのファイルを利用してください。

 例えば、Cindy の場合、Fall のアニメに、落下状態のみではなく、着地時のアニメが含まれているようなケースもあります。
今回制作処理では、落下アニメの場合、地面に着く前は落下状態のアニメを繰り返す形にしたいため、着地時のアニメが入るとアニメと画面の挙動がちぐはぐに鳴ります。
その場合には2つのファイルから落下アニメを作成するなど、画像の状態を見てアニメに利用する画像の判断をしてください

 アニメーションクリップの名称は、ファイル名から Jump_Up(あるいは Up)、Jump_MidAir(あるいは Mid)、Jump_Fall(あるいは Fall) のように、
アニメーションの内容がわかりやすい名称にしてください。

 アニメーションクリップを作成したら、ヒエラルキーに新しく作成されたこれらのゲームオブジェクトは3つとも削除してください。


Animatorビューにジャンプのアニメーションクリップを3つとも登録する


 ヒエラルキーで Yuko_Player ゲームオブジェクトを選択した状態で、Sceneビューから Animatorビューに切り替えてください。
先ほど作成した Animator の情報が表示されます。表示されない場合には、Yuko_Player ゲームオブジェクトが選択されていない状態ですので
一度、Sceneビューに戻り、再度 Yuko_Player ゲームオブジェクトを選択してから、タブを Animatorビューに切り替えてください。


Animatorビュー画像



 ジャンプのアニメーションクリップを作成しましたので、それをこのAnimatorビューに登録して、遷移が行えるようにします。

 作成した Jump_Up(Up)のアニメーションクリップのファイルを、Animatorビューへドラッグアンドドロップしてください。
新しく、同名のステートが1つ追加されます。

 同じ手順で、Jump_MidAir と Jump_Fall のアニメーションクリップもドラッグアンドドロップして、ステートを作成してください。


アニメーションクリップファイルを、Animatorビューへドラッグアンドドロップする



<手順動画>
https://gyazo.com/8bbcd17f6f7a42f988dbe6414679b9e2

 
 追加したら、遷移用の矢印(トランジション)がつけやすいように、3つを並べておいてください。
このように遷移させるようにしますので、参考に配置してください。(矢印は後で設定しますので、矢印がつけやすいようにステートの位置関係だけ参考にしてください。)


Animatorビュー ステート図



AnimatorビューのParametersに、アニメーション遷移の条件を新しく2つ作成して登録する


 Animatorビューの左側にある Parameters に、新しい条件を2つ登録し、アニメーション遷移の条件として設定出来るようにします。

 Parameters の右側にあるプラスボタンを押して、Trigger 型の条件を2つ追加します。1つは Jump、もう1つは Fall という名前にしてください。
Trigger 型の場合、名前の右側に 丸いアイコンが表示されます。


Trigger 型の Jump パラメータ



Trigger 型の Fall パラメータ



Animatorビューでジャンプのアニメーション遷移を作成する


 作成したパラメータを使って、それぞれの遷移と条件を設定していきます。

 まず最初に AnyState というステートを選択し、右クリックをしてメニューの中から Make Transition を選択します。
白い矢印が AnyState から表示されますので、Jump_Up ステートへつなげて左クリックを押します。

 この矢印(トランジション)を選択してください。インスペクターから遷移条件を設定します。


AntyState => Jump_Up(Up) Animatorビュー画像



 Has Exit Time のチェックを外してください。
 Consitions には プラスボタンを押して、Jump パラメータを設定してください。


AntyState => Jump_Up(Up) インスペクター画像




 続いて、Jump_Up ステートを選択して右クリックをし、Make Transition を選択します。
Jump_Mid ステートへつなげて左クリックしてください。この部分は特に設定は不要ですので、下記の画像を参考に、インスペクターの確認だけしてください。


Jump_Up => Jump_Mid Animatorビュー画像



Jump_Up => Jump_Mid インスペクター画像




 次は、Jump_Mid ステートを選択して右クリックをし、Make Transition を選択します。
Jump_Fall ステートへつなげて左クリックしてください。この部分も設定は不要ですので、下記の画像を参考に、インスペクターの確認だけしてください。


Jump_Mid => Jump_Fall Animatorビュー画像



Jump_Mid => Jump_Fall インスペクター画像




 もう一度 AnyState ステートを選択して右クリックをし、Make Transition を選択します。
Jump_Fall ステートへつなげて左クリックしてください。同じように矢印を選択して、インスペクターから設定を行います。


AnyState => Jump_Fall Animatorビュー画像



 Has Exit Time のチェックを外してください。
 Consitions には プラスボタンを押して、Fall パラメータを設定してください。


AnyState => Jump_Fall インスペクター画像



 最後です。Jump_Fall ステートを選択して右クリックをし、Make Transition を選択します。
Exit ステートへつなげて左クリックしてください。この部分は設定は不要ですので、下記の画像を参考に、インスペクターの確認だけしてください。


Jump_Fall => Exit Animatorビュー画像



Jump_Fall => Exit インスペクター画像



 以上の手順で完成です。


完成図



Animatorビュー 全体図



InputManagerを利用する


 ジャンプの処理に関しても、移動の際と同じように、UnityのInputManagerの設定を利用します。
InputManagerを確認してみると、Jump という項目があります。文字列は Jump、対応するキーは スペースキーになっています。
この情報をそのまま利用して、ジャンプの処理を追加します。


InputManager



PlayerController スクリプトを修正して、ジャンプの行動とジャンプのアニメーションの再生を追加する


 ジャンプを処理を追加し、ジャンプの処理に合わせて、ジャンプのアニメーションを再生するように処理を追加します。


PlayerController.cs

 <= クリックすると開きます。



<Rigidbody2D.AddForceメソッド>


 ゲームオブジェクトに物理的な力を加えるメソッドです。
力を与えることによって、物理演算にのっとってゲームオブジェクトを移動させる処理が行えます。
Rigidbody2D.AddForce (Vector2 force, ForceMode2D mode= ForceMode2D.Force)

 // キャラの位置を上方向へ移動させる(ジャンプ・浮遊)
  rb.AddForce(transform.up * jumpPower);

 第1引数に、ゲームオブジェクトに与える力の値を設定します。第2引数は力の与え方に対するオプション値です。初期値で Force が設定されています。
Rigidbody2Dの場合には、ForceModeは2種類あります。力の値を変更するとどうなるか、第2引数の設定を変更するとどうなるかなど、
自分で調べて、スクリプトに代入し、違いを確認してみましょう。


参考サイト
Unity公式スクリプトリファレンス
Rigidbody2D.AddForce
https://docs.unity3d.com/ja/current/ScriptReferenc...
Unity公式スクリプトリファレンス
ForceMode2D
https://docs.unity3d.com/ja/current/ScriptReferenc...

SamuraiBlog様
【Unity入門】Rigidbodyで自在に移動!addforceやpositionを極めよう!
https://www.sejuku.net/blog/54896


<Animator.SetTriggerメソッド>


 ジャンプする際のアニメーションの遷移のために、SetTriggerメソッドを利用し、遷移の条件をこのメソッドの引数に指定してアニメーションの遷移を行っています。

 // Jump(Up + Mid) アニメーションを再生する
 anim.SetTrigger("Jump");  
Unity公式スクリプトリファレンス
SetTrigger
https://docs.unity3d.com/ja/current/ScriptReferenc...


ゲームを実行して確認する


 スクリプトの修正が終了したら、Yuko_Player ゲームオブジェクトを選択して、新しく追加した jumpPower 変数の値を登録します。
0 になっていますので、 300 を入力してください。この値が 0 のままではジャンプしません。(この値を利用する計算式を確認してみてください。)


Yuko_Player ゲームオブジェクト インスペクター画像



 ゲームを実行して、スペースキーを押してください。ジャンプすれば成功です。ジャンプ中でもジャンプできますので、空中浮遊をしてみましょう。


<実行動画>
https://gyazo.com/7ffddb2c86ac207c8f351206162ffef3


 ジャンプ出来ましたら、次の手順へ進みます。もしもジャンプが出来ない場合には、スクリプトに記述ミスがないか確認してください。
ジャンプはできるものの、アニメーションが再生されない場合には、Animatorの設定とスクリプトの両方を順番に見直して、問題点を見つけてください。


 以上でこの手順は終了です。

 次は 手順7 −キャラのジャンプの改善− です。