FPSキャラの手を引っ込めたり、持たせる武器を切り替えてみます。
まず前の記事と同様に、ナイフやライターを取り出すアニメーションやライターの火を付けるアニメーション等を作りました。
これらをUnityに持っていって、アニメーターコントローラーを設定します。初期状態と、各武器の取り出す・持ったままにする・攻撃する・仕舞うの状態があります。
デフォルトは手が下がっているアニメーションがアタッチされていて、パラメーターによって武器を取り出します。武器を取り出すアニメーションが1度再生されると自動で武器を持つ状態に変わります。武器を持つ状態では呼吸に合わせて手が上下に揺れるアニメーションがループ再生されます。
この状態でAttackトリガーがセットされると、攻撃アニメーションが再生されて、自動で武器を持つ状態へ戻ります。
武器を持ち上げるステートを複製して、逆再生させることで武器を仕舞うアニメーションにしています。逆再生させるにはステートを選択してインスペクタのSpeedをマイナスの値にします。
武器の切り替えはキー入力を使います。スクリプトでキーによって整数型のパラメーターの値を変えています。武器を持っている状態で他の武器を選択すると、選択した武器を取り出すステートに遷移します。
if(Input.GetKeyDown(KeyCode.Alpha0))
{
animator.SetInteger("Weapon", 0);
}
else if (Input.GetKeyDown(KeyCode.Alpha1))
{
animator.SetInteger("Weapon", 1);
}
else if (Input.GetKeyDown(KeyCode.Alpha2))
{
animator.SetInteger("Weapon", 2);
}
else if (Input.GetKeyDown(KeyCode.Alpha3))
{
animator.SetInteger("Weapon", 3);
}
前の記事の方法でBlenderで手に武器をもたせたままUnityでインポートすると、ナイフとライターが手のボーンの子オブジェクトになっています。
各武器を取り出すときに、スクリプトで取り出す武器だけをアクティブにします。
if (animator.GetCurrentAnimatorStateInfo(0).IsName("PickKnife"))
{
knife.SetActive(true);
lighter.SetActive(false);
}
if (animator.GetCurrentAnimatorStateInfo(0).IsName("PickLighter"))
{
knife.SetActive(false);
lighter.SetActive(true);
fire.SetActive(false); // 火を消す
}
また、火のエフェクトを作って、ライターの子オブジェクトにしておき、ライターの攻撃状態で半分くらい時間がたったら火をつけ、ライターを仕舞う状態の序盤で火を消します。
if (animator.GetCurrentAnimatorStateInfo(0).IsName("LighterAttack") && animator.GetCurrentAnimatorStateInfo(0).normalizedTime > 0.4f)
{
fire.SetActive(true); // 火をつける
}
if (animator.GetCurrentAnimatorStateInfo(0).IsName("PickLighter 0") && animator.GetCurrentAnimatorStateInfo(0).normalizedTime > 0.1f)
{
fire.SetActive(false); // 火を消す
}
これでFPSで武器の切り替えができました。