【Unity】【FPS】プレイヤーにダッシュを実装しよう!

Unity

今回は、プレイヤーが回避するときによく使う「ダッシュ」の実装方法を記述していきたいと思います。

今回のスクリプトでは、前の記事で記述したプレイヤーの「動作スクリプト」を利用するので、そちらを使っていただければと思います。

動作スクリプトの記事↓

スクリプト

まずは、プレイヤーの動作スクリプトにダッシュのステートを追加しないといけないので、プレイヤーの動作スクリプトを開きましょう。

これらの変数を追加します。

ステートを管理する関数の中にダッシュのスクリプトを追加。

プレイヤーの動作スクリプトの変更は以上です。

ダッシュスクリプトを書いていきましょう。

新しいスクリプトを作り、名前を「Dashing」とします。

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

public class Dashing : MonoBehaviour
{
    [Header("References")]
    public Transform orientation;
    public Transform playerCam;
    private Rigidbody rb;
    private PlayerMovement pm;

    [Header("Dashing")]
    public float dashForce;             //ダッシュ時に加える力
    public float dashUpwardForce;       //上方向に加える力
    public float dashDuration;          //ダッシュの持続時間
    private Vector3 delayedForceToApply;

    [Header("CoolDown")]
    public float dashCd; //ダッシュのクールダウン
    private float dashCdTimer;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        pm = GetComponent<PlayerMovement>();
    }


    void Update()
    {
        if (Input.GetMouseButtonDown(1))
        {
            Dash();
        }

        if (dashCdTimer > 0)
        {
            dashCdTimer -= Time.deltaTime;
        }
    }

    //ダッシュ
    private void Dash()
    {

        //ダッシュのクールダウン中ならダッシュをしない
        if (dashCdTimer > 0)
        {
            return;
        }
        else
        {
            dashCdTimer = dashCd;
        }

        pm.dashing = true;

        Vector3 direction = DashDirection();

        Vector3 forceToApply = direction * dashForce + orientation.up * dashUpwardForce;

        rb.useGravity = false;

        delayedForceToApply = forceToApply;

        Invoke(nameof(DelayedDashForce), 0.025f);//ステートが完全にdashingに切り替わるのを待つ

        Invoke(nameof(ResetDash), dashDuration);//ダッシュを終了
    }

    //ステートが完全にdashingに切り替わるのを待つ
    private void DelayedDashForce()
    {
        rb.AddForce(delayedForceToApply, ForceMode.Impulse);
    }

    //ダッシュが終了したときの処理
    private void ResetDash()
    {
        pm.dashing = false;

        rb.useGravity = true;
    }

    //ダッシュをする方向を決める
    private Vector3 DashDirection()
    {
        float horizontalInput = Input.GetAxisRaw("Horizontal");
        float verticalInput = Input.GetAxisRaw("Vertical");

        Vector3 direction;

        //どの方向でもダッシュができるかをチェック
        direction = orientation.forward * verticalInput + orientation.right * horizontalInput;

        //どの方向にも入力がなければ前方にダッシュ
        if (horizontalInput == 0 && verticalInput == 0)
            direction = orientation.forward;

        return direction.normalized;
    }
}

このスクリプトをプレイヤーにアタッチし、数値を入力していきます。

動作スクリプトの「Dash Speed」をこのぐらいに。

「Dashing」はこのように入れていきます。

これで実行をしてみると

ダッシュを実装することができました!

まとめ

久々のFPS関連の記事でしたがお役に立てればと思います。

コメント

タイトルとURLをコピーしました