Developer

【Unity実践】#5 プロトタイプ編 ~ プレイヤー作成 part2 ~【Boxゲーム】
2020.12.28
Lv2

【Unity実践】#5 プロトタイプ編 ~ プレイヤー作成 part2 ~【Boxゲーム】

今回の内容

前回に続いてプレイヤーの作成を進めます。
今回はアニメーターの作成と設定を行い、プレイヤーの移動時にアニメーションが再生されるようにします!

※初めての方はこちらから
【第1回記事】この連載について

アニメーターコントローラーの作成

Assetsフォルダに「Animations」フォルダを作成して、その中に Animator Controller を追加してください。
名前は、「PlayerAnimController」とします。

作成したら、Player の Animatorコンポーネント > Controller に設定しましょう。
(※前回に続き、プレハブ側で設定を行ってください。)

アニメータービューで、「Idle」「Run」のステートを作成して、画像の様に遷移を作成しましょう。
また、Bool型のパラメーター「isRunning」を追加してください。
(この変数を、アニメーションパラメーターと呼びます。)

※アニメータービューが表示されていない場合は、
「Window > Animation > Animator」から表示させてください。

ひとまず必要なステートはこの2つになります。
「Idle」は静止状態、「Run」は走行状態を表すステートとします。

「Idle」「Run」のモーション設定

「Idle」と「Run」で再生されるモーションの設定を行います。

「Idle」の設定
アニメータービューで「Idle」をクリックして、インスペクタービューの Motion に、
「UnityChan > SD_unitychan > Animations > SD_unitychan_motion_humanoid > Standing@loop」を設定してください。

「Run」のアニメーション設定
アニメータービューで「Run」をクリックして、インスペクタービューの Motion に、
「UnityChan > SD_unitychan > Animations > SD_unitychan_motion_humanoid > Running@loop」を設定してください。

「Idle」「Run」の遷移設定

次に、各ステートへの遷移の条件等の設定を行います。

「Idle」⇒「Run」の遷移の設定
isRunnnig が true の時に遷移するようにします。
即時遷移するように、「Has Exit Time」のチェックは外します。

※遷移設定を開くには

アニメーターコントローラーで対象の矢印をクリックします。

「Run」⇒「Idle」の遷移の設定
先ほどの逆にします。

ここまでで、静止状態と走行状態のアニメーション設定は完了です。

アニメーションを設定する時は、以下あたりが必要項目となるので慣れておきましょう。
・アニメーターコントローラーの作成
・ステートの追加
・各ステートのアニメーションの設定
・ステート間の遷移の設定

スクリプトからアニメの制御

作成したアニメ(ステート)が、適切なタイミングで再生されるようにします。
具体的には、Player が静止状態なら「Idle」、走行状態なら「Run」が再生されるようにします。
先ほどの遷移の設定を思い出すと、この状態管理でポイントとなるのは「isRunning」の値です。

なのでやることは、特定のタイミングで「isRunning」の値を変える処理を、スクリプトで作成します。
PlayerScript を以下の様に変更してください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerScript : MonoBehaviour
{
    Animator charaAnim;

    public bool isMove;

    void Start()
    {
        charaAnim = GetComponent<Animator>();
    }

    void FixedUpdate()
    {
        if (isMove)
        {
            transform.position += transform.forward * 0.03f;
        }
    }

    void Update()
    {
        charaAnim.SetBool("isRunning", isMove);
    }
}

変更内容は以下の通りです。(クリックで詳細解説を載せています。)

・プロパティに「charaAnim」を追加
・Start に処理を追加。Player のアニメーターを取得。
・Update で、charaAnim の isRunning を変更する処理を追加

を行いました。

詳細解説

PlayerAnimController の isRunning を操作するためには、Player の Animatorコンポーネントを取得する必要があります。
Animator に限らず、コンポーネントを操作したい時には、

・コンポーネントに対応するプロパティを作成
・開始時(StartやAwake)で取得して、Update 等の必要なタイミングでプロパティから呼び出す

この流れが一般的です。

コンポーネントの取得はそれなりに重たい処理なので、Update に書いてしまうと動作に影響が出る可能性があり、
そのためこのような実装をされることが多いです。

もちろんケースによっては、Update 内の特定のタイミングで GetComponent を実行する、と言うこともあり得ますが、初めから取得するコンポーネントが分かっているのであれば、素直に Start や AWake 内で取得しましょう。

実装内容に戻って、Update メソッドを新規で追加しています。
Update と FixedUpdate の違いについては前回の記事の中で軽く触れた通りで、
アニメーター設定の変更は物理演算とは大きく絡まない処理なので、通常の Update に実装しています。

ここで使用している「SetBool メソッド」はAnimatorコンポーネントでよく使うメソッドで、
名前の通り、Bool型のアニメーションパラメーターを設定できます。
この実装により、isRunning の値が、PlayerScript の isMove と連動するようになります。

(参考記事)
【Unity連載】GetComponentを具体例付きで解説

作成ができたら、シーンを再生してみましょう。
前回同様、isMove の値を変えて移動の切り替えを行った際に、アニメの切り替えが行われていれば成功です。

おわりに

アニメーターの設定と、スクリプトからの制御を行いました。
いずれも基本的な設定なので、初めての方は何度か練習して慣れておくのが良さそうです。

次回も引き続きプレイヤーの実装となり、壁に当たったときに反対に移動する処理を作成します。
一旦次回でプレイヤーの基礎的な実装は完了となる予定ですので、お楽しみに!

 
 

連載目次リンク

実践Unityゲームプログラミング 連載目次
 

関連する連載リンク

「初心者のための」Unityゲーム制作 目次
 

© Unity Technologies Japan/UCL