後だしジャンケン
辞めろ辞めろと言いながらいざ辞めるとなったら無責任だと文句意を言い、強いメッセージが必要と訴えるのに具体的な内容は口にしない後だしジャンケンが得意な皆さんこんにちは。各自思うところはあると思いますが、感染対策が焦点なのに「学術会議任命拒否問題がー」とか言ってる報道特集はどこを向いて報道しているんだろうと思う。
地上波デビュー
前回の記事でもお伝えしましたが、私が以前unityroomに投稿した作品「Supra animus quo」がテレビ朝日の「会心の1ゲー」という番組で取り上げて頂きました。
本日2時56分から
— ゲーム開発バラエティ 会心の1ゲー【毎週木曜26:36~ テレ朝公式】 (@kaishin_1game) 2021年9月2日
バイクさんと屋敷さんを迎えて
3人に似つかわない
オシャレゲームを遊びます!
しかし夜中やなー!!
前回放送もめちゃくちゃ面白いので是非!
配信終了はまもなくです!https://t.co/0iVtof2KuW pic.twitter.com/iCrqUu31ay
特に盛り上がり処の少ない作品だと思うのですが、MCの方に「面白い」「オシャレ」等々の言葉を掛けていただき感謝しかありません、ありがとうございます。
unity1week
この「Supra animus quo」はunity1weekの投稿作品ですが、今週からまたそのunity1weekが開催されています。
今回のお題は「ちゅう」だそうで少し難しいお題かなという気もしますが、最近ではこのunity1weekから「Supra animus quo」のようにテレビに取り上げられる作品が色々と出ているので、今回も数多くの作品が投稿されると思います。
unityroom.comまぁ、私は残念ながら参加できそうにないんですがね。。。
アニメーションの切り替え
例えば3DのSTGとかACT等で対面の敵と正面で対峙しつつ横に移動する、といった場面を作る場合、自機は敵と正面を向いたまま敵の周りを公転運動のように移動することになり、敵側も自機の方向を向かせるためにその場で回転させるような動作を行う必要があります。
とはいえ敵側を立ったまま(Idle状態のまま)回転させると違和感しかない絵となってしまいます。
なので敵側はその場から移動しないにせよ「歩く」ようなアニメーションをさせたいのですが、通常通りアニメーションのステートマシンを利用して「立ち状態」→「歩き状態」にアニメーションを切り替えると、これまた動作が唐突過ぎて微妙な感じ
そのため、より自然なアニメーションの切り替えを行うためにはステートマシンでなくBlend Treeを使って切り替えを行う事になります。
Blend Tree
BlendTreeはアニメーションステートマシーンの中の一つのステートとして作成します。
[Animator]タブのステートマシーン画面の中で右クリックし、メニューの中からCreate State → From New Blend Treeを選択します。
作成されたBlendTreeをダブルクリックすると、
BlendTreeの設定画面へ移動します。
今回の場合は「Idle」と「Run」の二つのアニメーションをBlendTreeで切り替えるので、BlendTreeを右クリックしAdd Motionを選択
「Idle」と「Run」の二つのアニメーションクリップを追加、Inspector上には下図のようにパラメータやアニメーションクリップが表示されます。
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」へ戻るようになります。
これで実装は完了したので、実行すれば敵側が自機側の動き合わせて、Idle状態から徐々に歩き出すアニメーションとなり、逆も徐々に動きが止まる動作となります。
ステートマシンを利用した時と比較するとかなり自然な動作になったと思います。