原カバンは鞄のお店ではありません。

Unityを使ったゲーム制作のあれこれを綴っていきます。

【Unity】今更ながらBlend Treeを使う

f:id:Karvan:20210907210733p:plain

後だしジャンケン

辞めろ辞めろと言いながらいざ辞めるとなったら無責任だと文句意を言い、強いメッセージが必要と訴えるのに具体的な内容は口にしない後だしジャンケンが得意な皆さんこんにちは。各自思うところはあると思いますが、感染対策が焦点なのに「学術会議任命拒否問題がー」とか言ってる報道特集はどこを向いて報道しているんだろうと思う。

 

地上波デビュー

前回の記事でもお伝えしましたが、私が以前unityroomに投稿した作品「Supra animus quo」がテレビ朝日の「会心の1ゲー」という番組で取り上げて頂きました。

 

特に盛り上がり処の少ない作品だと思うのですが、MCの方に「面白い」「オシャレ」等々の言葉を掛けていただき感謝しかありません、ありがとうございます。

 

unity1week

この「Supra animus quo」はunity1weekの投稿作品ですが、今週からまたそのunity1weekが開催されています。
今回のお題は「ちゅう」だそうで少し難しいお題かなという気もしますが、最近ではこのunity1weekから「Supra animus quo」のようにテレビに取り上げられる作品が色々と出ているので、今回も数多くの作品が投稿されると思います。

unityroom.comまぁ、私は残念ながら参加できそうにないんですがね。。。

 

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

例えば3DのSTGとかACT等で対面の敵と正面で対峙しつつ横に移動する、といった場面を作る場合、自機は敵と正面を向いたまま敵の周りを公転運動のように移動することになり、敵側も自機の方向を向かせるためにその場で回転させるような動作を行う必要があります。
とはいえ敵側を立ったまま(Idle状態のまま)回転させると違和感しかない絵となってしまいます。

f:id:Karvan:20210907211211g:plain



なので敵側はその場から移動しないにせよ「歩く」ようなアニメーションをさせたいのですが、通常通りアニメーションのステートマシンを利用して「立ち状態」→「歩き状態」にアニメーションを切り替えると、これまた動作が唐突過ぎて微妙な感じ

f:id:Karvan:20210907211255g:plain

そのため、より自然なアニメーションの切り替えを行うためにはステートマシンでなくBlend Treeを使って切り替えを行う事になります。

 

Blend Tree

BlendTreeはアニメーションステートマシーンの中の一つのステートとして作成します。
[Animator]タブのステートマシーン画面の中で右クリックし、メニューの中からCreate State → From New Blend Treeを選択します。

f:id:Karvan:20210907211432p:plain

作成されたBlendTreeをダブルクリックすると、

f:id:Karvan:20210907211457p:plain

BlendTreeの設定画面へ移動します。
今回の場合は「Idle」と「Run」の二つのアニメーションをBlendTreeで切り替えるので、BlendTreeを右クリックしAdd Motionを選択

f:id:Karvan:20210907211519p:plain

「Idle」と「Run」の二つのアニメーションクリップを追加、Inspector上には下図のようにパラメータやアニメーションクリップが表示されます。

f:id:Karvan:20210907211549p:plain

Inspectorからわかるようにここでは[Blend]という値を0~1に変更して0に近いほど「Idle」のアニメーションが、1に近いほど「Run」のアニメーションが強く反映されるようになります。

 

スクリプトを組む

[Blend]の値を指定した時間で0→1、1→0に変更するようスクリプトを組みます。
Easingを考慮するならDotweenのToやiTweenのValueToを使っても良いですが、今回は単純な(Linerな)変更でよいでUpdate関数内でSetFloatをコールして変更するようにしました。

    static readonly int BLEND_KEY = Animator.StringToHash("Blend");
    Animator Animator;
    
    public float BlendTime;    // Idle → Walkの変更時間
    public float IdleTime;     // Walk → Idleの変更時間
    
    private void BlendWalk(float deltaTime, bool isRev)
    {
        float nowBlend = Animator.GetFloat(BLEND_KEY);

        float modBlend = 0.0f;
        if (isRev)
        {
            modBlend = nowBlend - deltaTime / IdleTime;

            if (modBlend < 0.0f)
            {
                modBlend = 0.0f;
            }
        }
        else
        {
            modBlend = nowBlend + deltaTime / BlendTime;

            if (modBlend > 1.0f)
            {
                modBlend = 1.0f;
            }
        }

        Animator.SetFloat(BLEND_KEY, modBlend);
    }

 

ちなみにアニメーションステートマシーンの設定はこんな感じ、[Blend]の値が0.1以上になると最初の「Idle」のステートから「BlendTree」のステートへ、0.1以下になると「BlendTree」から「Idle」へ戻るようになります。

f:id:Karvan:20210907211755p:plain

これで実装は完了したので、実行すれば敵側が自機側の動き合わせて、Idle状態から徐々に歩き出すアニメーションとなり、逆も徐々に動きが止まる動作となります。

f:id:Karvan:20210907211848g:plain

ステートマシンを利用した時と比較するとかなり自然な動作になったと思います。

 

◇プライバシーポリシー

●個人情報の利用目的

当ブログでは、メールでのお問い合わせ、メールマガジンへの登録などの際に、名前(ハンドルネーム)、メールアドレス等の個人情報をご登録いただく場合がございます。

これらの個人情報は質問に対する回答や必要な情報を電子メールなどをでご連絡する場合に利用させていただくものであり、個人情報をご提供いただく際の目的以外では利用いたしません。

●個人情報の第三者への開示

当サイトでは、個人情報は適切に管理し、以下に該当する場合を除いて第三者に開示することはありません。

・本人のご了解がある場合
・法令等への協力のため、開示が必要となる場合

個人情報の開示、訂正、追加、削除、利用停止
ご本人からの個人データの開示、訂正、追加、削除、利用停止のご希望の場合には、ご本人であることを確認させていただいた上、速やかに対応させていただきます。

アクセス解析ツールについて

当サイトでは、Googleによるアクセス解析ツール「Googleアナリティクス」を利用しています。

このGoogleアナリティクスはトラフィックデータの収集のためにCookieを使用しています。このトラフィックデータは匿名で収集されており、個人を特定するものではありません。
この機能はCookieを無効にすることで収集を拒否することが出来ますので、お使いのブラウザの設定をご確認ください。

●免責事項

当サイトからリンクやバナーなどによって他のサイトに移動された場合、移動先サイトで提供される情報、サービス等について一切の責任を負いません。

当サイトのコンテンツ・情報につきまして、可能な限り正確な情報を掲載するよう努めておりますが、誤情報が入り込んだり、情報が古くなっていることもございます。

当サイトに掲載された内容によって生じた損害等の一切の責任を負いかねますのでご了承ください。

●プライバシーポリシーの変更について

当サイトは、個人情報に関して適用される日本の法令を遵守するとともに、本ポリシーの内容を適宜見直しその改善に努めます。

修正された最新のプライバシーポリシーは常に本ページにて開示されます。