以下の内容はhttps://www.karvan1230.com/entry/2021/09/07/212146より取得しました。


【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

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

 




以上の内容はhttps://www.karvan1230.com/entry/2021/09/07/212146より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14