【バイオハザード風のゲームを作ってみよう。その1】

最近バイオハザード1 リマスター版をプレイして、自分でも作りたくなったのでやってみたいと思います。

下のセバスチャン先生の動画を参考に作ってみたいと思います。
youtu.be


まず、キャラクターはmixamoから下記ダウンロードしました。

・キャラクター:swat

・アニメーション:pistol idle

www.mixamo.com


次にキャラクターをunity上に配置し、キーボードの上下(W,S,)で前進/後進、キーボードの左右(A,D)で回転するように下記スクリプトをアタッチしました。
参考サイト:
jyumotendo.jeez.jp

Unity Ver:2020.3.20f1(URP)を使用。


次に、前進/後進のアニメーションをmixamoからダウンロードしました。
・前進:Pistol Walk
・後進:Pistol Walk BackWard

Unityへのインポートが完了したら、下記のアニメーションの設定をします。
・設定したいアニメーションのInspectorウインドウの[Rig]>[Animation Type]から、プルダウンメニューで[Humanoid]を選択して、[Apply]で確定。
・設定したいアニメーションのInspectorウインドウの[Animation]>[Loop Time]にチェックを入れる。[Apply]で確定。
・アニメーションにアニメーションクリップが2つある場合、Inspectorウインドウの[Animation]の[Source Take](下図①)にアニメーションを再生(下図②)して動作する方に設定し、[Apply]で確定。
(私の場合、アニメーションにpistol walkとmixamoの2つのクリップがあり、初期はアニメーションにpistol walkが設定されていましたが、上手く動作しない(アニメーションを再生(下図②)しても上手く動作しなかった)ため、mixamoに変更した所、思い通りの動作になりました。)


次に、ブレンドツリーを下記のように設定しました。
左右回転時のアニメーションも前進/後進のアニメーションを使用しています。


そして、キーボードの動作でアニメーションが動作するようにスクリプトに追加しました。

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

public class Player_Controller : MonoBehaviour
{
    // 上下のキーで前後ろ移動、左右のキーでPlayerを左右に回転させたい。
    // 上下の移動はPlayerの向いている方角に対して前後させたい。

    public float speed = 1f; //歩行スピード
    public float rotateSpeed = 1f; //体の向きのスピード

    Vector3 direction;

    Animator animator;
    float snappedHorizontal;
    float snappedVertical;

    float span = 1f;
    private float currentTime = 0f;
    bool moveOn = true;

    public void Awake()
    {
        animator = GetComponent<Animator>();
    }

    void FixedUpdate()
    {
        //Input.GetAxisRawは押したキーに応じて1か-1を返します。また、キーが押されていないときは0を返します。
        //Input.GetAxisは押したキーに応じて1ら-1までの範囲の値をとります。初期値は0です、これはジョイスティック入力やキーボード入力からの場合です。
        ///
        //float h = Input.GetAxisRaw("Horizontal");
        //float v = Input.GetAxisRaw("Vertical");

        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        Move(v);
        Turning(h);
    }

    // 上下キーが押されたら
    void Move(float v)
    {
        if (v != 0)
        {
            direction = transform.TransformDirection(new Vector3(0.0f, 0.0f, v)); //ローカル空間からワールド空間へ x、y、z を変換します。
            direction *= speed;
            direction *= Time.deltaTime;
            direction /= 2f; //歩行スピード調整
            transform.position += direction;
            HandleAnimatorValues(0f, v);
        }
        else
        {
            HandleAnimatorValues(0f, 0f);
        }
    }

    //左右キーが押されたら
    void Turning(float h)
    {
        if (h != 0)
        {
            //左右に回転させるにはRotateメソッドを使用。
            //y軸の引数に左右キーが押下された時に得られる1or - 1の値にspeedとdeleteTimeをかけて引数として使用しました。
            transform.Rotate(0, 100 * Time.deltaTime * rotateSpeed * h, 0);
            HandleAnimatorValues(h, 0f);
        }
    }

    //移動アニメーション
    void HandleAnimatorValues(float horizontalMovememt, float verticalMovement)
    {      
        if(horizontalMovememt > 0)
        {
            snappedHorizontal = 1;
        }
        else if (horizontalMovememt < 0)
        {
            snappedHorizontal = -1;
        }
        else
        {
            snappedHorizontal = 0;
        }
        
        
        if (verticalMovement > 0)
        {
            snappedVertical = 1;
        }
        else if (verticalMovement < 0)
        {
            snappedVertical = -1;
        }
        else
        {
            snappedVertical = 0;
        }

        // animator.SetFloat("Horizontal", snappedHorizontal, 0.1f, Time.deltaTime);
        // animator.SetFloat("Vertical", snappedVertical, 0.1f, Time.deltaTime);

         animator.SetFloat("Horizontal", snappedHorizontal);
         animator.SetFloat("Vertical", snappedVertical);

    }
}    
    


unityでプレイしてみた結果がこちら。
youtu.be