【Unity】アニメーションの後退・方向転換|Input System②

back-turn-icatch Unity development

キャラクターに後退や方向転換をさせる方法がわかりません。

悩むことはないよ!
これまで学習した内容に一手間加えるだけで、実現できるよ!

引き続き、Input Systemを使います。

Input Systemは、ゲームパッド・キーボード・マウス・センサー等の各種入力デバイスからの入力を汎用的・統合的に取り扱うために導入されたUnityの新しい入力システムです。

Unity for Pro

今回は、キーボード操作で、後退・方向転換をさせる方法について解説していきます。

では、早速始めていきましょう!

プロジェクトは前回の続きから始めていきますので、手順に不安のある方は以下の記事内容を先に実施してから、戻ってきてください。

ここでは、キャラクターとアニメーションは、mixamoを使用します。

後退

ここでは、前進するアニメーションを使って、後退させる方法について解説していきます。

スクリプトの編集

キャラクターに付けたスクリプトを微修正します。

Projectウインドウから、Scriptを開いて、以下のコードを入力します。

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

public class WorkerController : MonoBehaviour
{
    Vector3 moveDirection;
    public float moveSpeed = 2;
    public float maxForwardSpeed = 8;
    float desiredSpeed;
    float forwardSpeed;

    const float groundAccel = 5;
    const float groundDecel = 25;

    Animator anima;

    bool IsMoveInput
    {
        get { return !Mathf.Approximately(moveDirection.sqrMagnitude, 0f); }
    }

    public void OnMove(InputAction.CallbackContext context)
    {
        moveDirection = context.ReadValue<Vector2>();
    }

    void Move(Vector2 direction)
    {
        float fDirection = direction.y;

        if (direction.sqrMagnitude > 1f)
            direction.Normalize();

        desiredSpeed = direction.magnitude * maxForwardSpeed * Mathf.Sign(fDirection);
        float acceleration = IsMoveInput ? groundAccel : groundDecel;

        forwardSpeed = Mathf.MoveTowards(forwardSpeed, desiredSpeed, acceleration * Time.deltaTime);
        anima.SetFloat("ForwardSpeed", forwardSpeed);
    }

    void Start()
    {
        anima = this.GetComponent<Animator>();
    }

    void Update()
    {
        Move(moveDirection);
    }
}

編集が完了したら、保存します。

Blend Treeの変更

Animatorウインドウで、[Blend Tree]をクリックして、Inspectorウインドウで、[Changes animation speed.]にマイナスの値を入れます。

動作確認

[▶︎]プレイゲームをクリックして、キーボードの矢印キーを操作します。

アニメーションを使って後退をさせることができました。

方向転換

Projectウインドウから、Scriptを開いて、以下のコードを入力します。

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

public class WorkerController : MonoBehaviour
{
    Vector3 moveDirection;
    public float moveSpeed = 2;
    public float maxForwardSpeed = 8;
    public float turnSpeed = 50;
    float desiredSpeed;
    float forwardSpeed;


    const float groundAccel = 5;
    const float groundDecel = 25;

    Animator anima;

    bool IsMoveInput
    {
        get { return !Mathf.Approximately(moveDirection.sqrMagnitude, 0f); }
    }

    public void OnMove(InputAction.CallbackContext context)
    {
        moveDirection = context.ReadValue<Vector2>();
    }

    void Move(Vector2 direction)
    {
        float turnAngle = direction.y;
        float fDirection = direction.y;

        if (direction.sqrMagnitude > 1f)
            direction.Normalize();

        desiredSpeed = direction.magnitude * maxForwardSpeed * Mathf.Sign(fDirection);
        float acceleration = IsMoveInput ? groundAccel : groundDecel;

        forwardSpeed = Mathf.MoveTowards(forwardSpeed, desiredSpeed, acceleration * Time.deltaTime);
        anima.SetFloat("ForwardSpeed", forwardSpeed);

        transform.Rotate(0, turnAngle *turnSpeed * Time.deltaTime, 0);

    }

    // Start is called before the first frame update
    void Start()
    {
        anima = this.GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        Move(moveDirection);
    }
}

編集が完了したら、保存します。

動作確認

[▶︎]プレイゲームをクリックして、キーボードの矢印キーを操作します。

方向転換をさせることができました。

以上です。お疲れ様でした。

▼ポチッと応援お願いします▼
にほんブログ村 IT技術ブログ Unityへ
にほんブログ村
タイトルとURLをコピーしました