第9回目:ユニティちゃんにジャンプ機能を実装する|Tech Book Zone Manatee

マナティ

入門Unity 5

第9回目:ユニティちゃんにジャンプ機能を実装する

前回作成したユニティちゃんがPlane上を駆け巡る処理に、キーボードの「スペース キー」を押すとジャンプルをする機能を追加してみましょう。

はじめに

今回は、前回作成した、ユニティちゃんがPlane上を駆け巡る処理に、キーボードの「スペース キー」を押すとジャンプルをする機能を追加してみましょう。前回と同じプロジェクトファイルを使用します。 前回の図12を見るとPlane(床)が少し狭いので、HierarchyからPlaneを選択して、Inspector内のTransformの「Scale」を「X、Y、Z」ともに「5」を指定して広くしておきます。今回はユニティちゃんを走り回らせてジャンプさせますので、床が狭いと、床からはみ出て下に落ちてしまいます。図1のような大きさになります。

図1 Unitychanがキーボードの「前後左右矢印キー」で自由に動き回るPlane(床)のサイズを大きくした

Asset StoreからAssetのダウンロード

ジャンプ機能を追加するために、ジャンプの機能を含んでいる下記のAssetをダウンロードします。

1.Raw Mocap Data For Mecanim(無料)
https://www.assetstore.unity3d.com/jp/#!/content/5330

検索欄に「Raw Mocap」と入力して「虫眼鏡アイコン」をクリックすると、該当するファイルの一覧が表示されますので、「Raw Mocap Data For Mecanim」をクリックして、DownloadからImportしてください(図2)。

図2 「Raw Mocap Data for Mecanim」をDownloadからImportする

Importには結構時間がかかりますので、気長にお待ちください。Importが完了すると図3のように、「Raw Mocap Data for Mecanim」のファイルがProject内に追加されます。

図3 Project内にImportしたファイルが追加された

Locomotion.controllerファイルを編集する

次に、Hierarchyからunitychanを選択し、Inspector内のAnimatorのControllerに指定している「Locomotion」をクリックします。すると図4のようにLocomotion.controllerファイルの文字が黄色の背景色で表示されて、Locomotion.controllerの所在が分かります。

図4 Locomotion.controllerファイルの所在が分かる

このLocomotionファイルをダブルクリックします。すると図5のような画面が表示されます。表示されているオレンジの六角形のアイコンは「アニメーションステートマシン」と呼ばれるもので、アニメーションの状態(State)とその遷移(Transition)をグラフィカルに表したものです。

図5 Locomotion.controllerの中が表示された

この六角形の「アニメーションステートマシン」をダブルクリックします。するとたくさんの四角形と、その間を接続している矢印線が表示されます。この「四角形をState」、「矢印線をTransition」と呼びます(図6)。

図6 StateとTransitionが表示された

ジャンプの機能を実装する

まず、図6の左上にある「Parameters」というボタンをクリックします。すると図7のような画面が表示されます。

図7 Parameterボタンをクリックした

図7の画面で赤の矩形で囲った「+」アイコンをクリックします。図8のようにデータ型が表示されますので、「Bool」を選択します。

図8 Boolを選択する

「New Bool」という項目が作成されますので、名前を「is_jumping」としておきます(図9)。

図9 名前をis_jumpingとしておく

次に、図6の何もない場所で、マウスの右クリックをします。すると図10のような項目が表示されますので、「Create State→Empty」と選択します。

図10 「Create State→Empty」と選択する

すると「New State」という新しい四角形が作成されますので、これを選択して、右のInspectorから名前に「Jump」と付け、Motionの横にある“○に・”のアイコンをクリックして、Select Motionの画面を開きます。たくさんのMotionが表示されますので、目的のジャンプのモーションを見つけるのが大変なので、一番上の検索欄に「RunJump」と入力します。するとJumpに関するMotionが表示されますので、その中から、「RunJump_ToLeft_2」を選択します(図11)。

図11 RunJump_ToLeft_2 を選択した

次に、中央に表示されている「WalkRun」と今作成した「Jump」をTransitionで接続します。「Jump」の四角形の上でマウスを右クリックすると「Make Transition」の項目が表示されますので(図12)、これを選択します。すると矢印線が表示されますので、「WalkRun」上でクリックすると、これら2つが接続されます(図13)。

図12 Make Transitionの項目が表示された

図13 JumpとWalkRunが接続された

同じ手順で、今度は「WalkRun」上でマウスの右クリックをして、Make Transitionを表示して、「Jump」と接続します。図14のようにお互いが2本の矢印線(Transition)で接続されます。

図14 WalRunとJumpが2本のTransitionで接続された

Transitionの条件を設定する

まず、「WalkRun」から「Jump」に伸びているTransitionを選択します。すると右のInspectorの下にConditionsという項目がありますので、「+」アイコンをクリックします。するとConditionsの項目が表示されますので、その中からParametersで設定しておいた「is_jumping」を選択し、横に表示される値を「true」としておきます。これは「WalkRun」から「Jump」にMotionを変化させることが可能という意味になります(図15)。

図15 「is_jumping」に「true」を指定する

次に、「Jump」から「WalkRun」に伸びているTransitionを選択して、Inspectorから、先ほどと同じ手順で「is_jumping」を表示して、今回は値に「false」を指定しておきます。「Jump」から「WalkRun」に移る場合のMotionには「Jump」は必要ありませんので「false」にしておきます。

以上でTransitionの設定は終わりです。現在はAnimatorタブが選択されて、Locomotion.controllerの画面が表示されていますので、Scene画面を選択して、オブジェクトが配置されている画面に戻ってください。 次に、C#でユニティちゃんをスペース キーでジャンプさせるコードを記述します。

ジャンプのコードを記述する

Hierarchyからunitychanを選択して、Inspectorの「Add Component」から「New Script」を選択し、Nameに「JumpScript」、Languageに「C#」を選択して、「Create and Add」をクリックします。 Inspector内に「Jump Script(Script)」が追加されます。ScriptのJumpScriptをダブルクリックするとVisual Studio 2015が起動しますので、void Update()内にリスト9.1のコードを記述します。

リスト9.1 ユニティちゃんがジャンプするコード(Junpscript.cs)
using UnityEngine;
public class JumpScript : MonoBehaviour {
    void Update () {
        Animator anim = GetComponent<Animator>();   // ...(1)

        if(Input.GetKey(KeyCode.Space))   // ...(2)
        {
            anim.SetBool("is_jumping", true);
        }

        AnimatorStateInfo state = anim.GetCurrentAnimatorStateInfo(0);   // ...(3)
        if(state.IsName("Locomotion.Jump"))   // ...(4)
        {
            anim.SetBool("is_jumping", false);
        }
    }
}

...(1) GetComponentでAnimatorコンポーネントを取得し、変数animで参照します。
...(2) キーボードから入力されたキーがSpaceなら、SetBoolでJumpパラメーターにtrueを指定します。
...(3) GetCurrentAnimatorStateInfo(0)でAnimatorの現在の状態を取得し、変数stateに格納します。
...(4) そのAnimatorの名前がLocomotion.Jumpなら、SetBoolでJumpのパラメーターにfalseを指定して、次のJumpに備えます。

実際に実行すると図16のようになります。

図16 ユニティちゃんがスペース キーでジャンプをしている

実際に動かしたのが下記の動画になります。

ユニティちゃんがスペース キーでジャンプする動画
https://youtu.be/R9FrU8CKNDw

今回はこれで終わりです。SateやTransitionの設定も出てきて、少し面倒かもしれませんが、実際に自分で手を動かして試してみれば、思っているよりは簡単です。実際に手を動かしてみましょう。C#のコード自体も長くはなく、そんなに難しい処理ではないので、理解しやすいのではないでしょうか。

次回は最終回で、Image Effectsについて解説します。

著者プロフィール

薬師寺国安事務所 薬師寺国安(著者)
薬師寺国安事務所代表。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。現在はUnity5、UE4、ExcelVBAについて執筆活動中。
Microsoft MVP for Development Platforms‒Windows Platform Development (Oct 2014‒Sep 2015)。