【Unity】転倒モーションを作ってみる

スライディングまで作る事ができたので、
少しづつモーションを増やしていこうと思っているのですが、
キャラの制御処理が複雑になって、バグ祭り真っ最中のケロです(T-T) グスッ

コロナで軒並み夏祭りが中止になっているのに、バグの祭りは大盛況でっす。
( ̄ .  ̄)ノ" ナンデヤネン

コロナとバグは早く治まって欲しいでっす。

愚痴から始めてしまいましたが、
そろそろ本題に戻ります。


今回は、店頭…
もとい、転倒モーションを追加してみたので、
記事にしてみます。

まず転倒と言う事で、簡単に処理するならZ軸をフリーにするのが手っ取り早いのですが、
そうすると床との摩擦で回転するようになるので、
正直おすすめできません。

特に手足のモーションを入れていると
走ったままの態勢で回転するので、見た目に転倒していません(^.^; オホホホ

当然、アニメーションを追加して転倒モーションを作る必要があります。

転倒モーションの条件として、
・障害ブロックで転倒する
・転倒したら動きが止まる

この辺りを作る必要があるので、考えてみたいと思います。

アニメーションを作るのですが、
キャラの動作範囲が分かるように白背景を設定しておきます。
転倒①.jpg
転倒は上下動が入ってくるので、
白背景の上下を基準にアニメーションの座標を設定します。

ただコケるだけでは見た目が面白くないので、
回転する要素を入れてみます。

当然、転倒回転中を秒数設定する必要があるので、
転倒は1秒としておきます。

アニメーションを開いて、クリップを追加、FallDownとしておきます。
転倒⑤.jpg
サンプルレートを8に設定して、開始0秒のアングルを作ります。

障害物は、腰くらいの高さを上限に考えてるので、
接触した際、飛び越える必要があります。

なので、立ち姿勢の腰より上に胴体が来るように設定して、
障害物を越えるようにしておきます。

続いて、回転モーションを追加していきます。
転倒⑦.jpg
0:1毎に回転のモーションを追加していき、0:5で一回転する状態を設定します。

アニメーションを作る際に注意する事は、
胴体は高さを変えれるので、問題ないのですが、
手足は、IKが入ってるので、ターゲットの座標を設定する必要があります。

上体の角度を変える場合は、胴体のZ軸を変えるのが普通ですが、
Boneを設定している場合は、親骨をドラッグして回転させると楽に角度を変えれます。

これで回転まで作れたので、残りの時間は立ち上がりまでのモーションにします。
転倒⑧.jpg
まず座った状態からすぐに立ち上がると止まった感が出ないので、
0:5のキーをコピーして0:6に追加します。
これで0:1フレーム同じ姿勢が維持できます。

後は、走り出す感じで体を起こせばOKでっす。

これで転倒モーションができたのでスクリプトを組んで行きます。
ActionTest

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

public class ActionTest : MonoBehaviour
{
[Header("レイヤーマスク")]
public LayerMask blockLayer;

private bool obstacle; //障害物判定

//Linecastの設定
private void SetLinecast()
{
Vector2 rightD1 = transform.position + (transform.right * 1.05f) - (transform.up * 1.19f);
Vector2 rightD2 = transform.position + (transform.right * 1.05f) - (transform.up * 2.15f);

if (Physics2D.Linecast(rightD1, rightD2, blockLayer))
obstacle = true;
}
}

障害物を検知するようにLinecastを設定します。
転倒⑨.jpg
Rayの長さは、足先からひざくらいで設定しておいて、
障害物が当たったらフラグをONにします。

続いて、接触時の転倒処理を作ります。
ActionTest

private float fallDownProgress; //転倒経過時間
private const float fallDownTime = 1.0f; //転倒時間

//アクションナンバーの設定
private enum actionNum
{
stop = 0,
run = 1,
jump = 2,
fall = 3,
sliding = 4,
wallAttach = 5,
wallJump = 6,
fallDown=7,
}


// Update is called once per frame
void Update()
{
SetLinecast();

if (obstacle)
{
if (playerUnderBC.enabled)
playerUnderBC.enabled = false;

FallDown();
return;
}
}


//転倒アクション
private void FallDown()
{
fallDownProgress += Time.deltaTime;

if (fallDownProgress < fallDownTime)
AnimationChange(actionNum.fallDown);
else
{
obstacle = false;
fallDownProgress = 0f;
playerUnderBC.enabled = true;
}
}

こんな感じで処理できるかと思います。

ちなみにUpdate内のobstacle判定で
if (playerUnderBC.enabled)
playerUnderBC.enabled = false;

としていますが、足元を安定する為
転倒⑩.jpg
Colliderを設定しているので、消さないと邪魔になるからです。
この辺りは、Colliderがなければ必要のない処理になります。

スクリプトが組めたので、blockLayerの設定とAnimatorのトランジションを設定します。
障害物はスプライトを追加して、
転倒⑫.jpg
Layerにblockを追加して設定しておきます。

Animatorは
転倒⑬.jpg
Runから繋いでRunに戻すようにします。
ジャンプ中に接触した場合などに転倒モーションをさせたい場合は、
Jumpのクリップからトランジションを設定する必要があります。

最後にキャラのActionTestコンポーネントのレイヤーをblockに設定したら完了でっす。

この状態でPLAYしてみます。

当然なんですが転倒した後も動き続けています。

尻もちを着いた所で動きを止めないと障害物の意味がないので、
停止処理を作ります。

停止させた場合、動き出しがないと見た目がおかしいので、
同時に動き出しの処理も追加します。
ActionTest

private const float moveStopTime = 0.62f; //転倒時の移動停止時間
private const float restart = 0.87f; //転倒時の動き出し時間

//転倒アクション
private void FallDown()
{
fallDownProgress += Time.deltaTime;

if (fallDownProgress >= moveStopTime)
runSpeed = 0.0f;

if (fallDownProgress >= restart)
runSpeed = 2.0f;

if (fallDownProgress < fallDownTime)
AnimationChange(actionNum.fallDown);
else
{
obstacle = false;
fallDownProgress = 0f;
playerUnderBC.enabled = true;
}
}

今回、サンプルレートを8に設定したので、
0:1フレームは、1秒/8フレームで計算できます。

尻もちを着くのが0:5フレームなので、1秒/8✕5なので、
約0.62秒後を停止時間にしました。

動き出しは、立ち上がりを設定している0:7フレームなので、
1/8✕7、約0.87秒後に動き出しを設定しています。

Runスピードを10に設定しているのですが、
いきなりトップスピードにすると動き出しの感じが出ないので、
立ち上がりは、2にして完全に走り出した時に10になるように設定しました。

停止の処理が作れたので、PLAYしてみます。

おおむねイメージしていた処理を作る事ができましたヽ(´▽`)/~♪

ただ、起き上がりからいきなりトップスピードになるので、
この辺りは考える必要がありそうです。

せっかくstop&goができるようになったので、
加速の処理を考えてみようと思います。

処理が作れたら記事にまとめてみようと思います。

最後に、スクリプトの処理を端折って書いているので、
このページだけ読むと処理内容が分からないと思うので、
【Unity】アニメーションのお勉強(Bone編)
からの連続記事になるので、読み返してもらうと分かり易いかと思います。

転倒処理については以上となります。
それでは(^ _ ^)/~~サヨナラ



この記事へのコメント