読者です 読者をやめる 読者になる 読者になる

遊べるゲームを作りたい

作りたいです。

Unityで自作ゲームを作る 2段ジャンプ機能

f:id:hogemarunosuke:20170222143948p:plain

遊び方

WASDキーで移動。マウスで視点移動。
左クリックで射撃。右クリックでロックオン。左シフトでダッシュ(前進中のみ)。
左ダブルクリック後、押しっぱなしでチャージ、離してチャージショット。
スペースキーでジャンプ。ジャンプ中にもう一度スペースで2段ジャンプ。

ジャンプ中の軌道修正ができないゲームでは必須ですよね。超魔界村とか。

2段ジャンプの実装

スペースキーが押されるたびにピョンピョンするんじゃ~ならシンプルですが、2段ジャンプと銘を打っている以上、3段以上ジャンプできたら困るわけで。

というわけで「jumping」と「doubleJumping」というフラグを用意して無理やりその辺りを制御しました。今後、3段以上のジャンプが必要とされることをまったく想定していない(想定したくない)実装です。そういうの大好き。ソースは↓な感じ。

private void Update()
{
    JumpControl();
}

private void JumpControl()
{
    if (controller.isGrounded)
    {
        Landing();
        DoJump();

        // 滞空時間をリセット
        jumpDuration = 0;
    }
    else
    {
        // 滞空時間が閾値よりも低い場合はジャンプ可能
        if (jumpDuration < jumpDurationThreshold)
        {
            DoJump();
        }
        else
        {
            if (enabledDoubleJump)
            {
                DoDoubleJump();
            }
        }

        // 滞空時間を増やす
        jumpDuration += Time.deltaTime;
    }
}

private void Landing()
{
    if (jumping || doubleJumping)
    {
        jumping = false;
        doubleJumping = false;
    }
}

private void DoJump()
{
    if (jumping == false && Input.GetButtonDown("Jump"))
    {
        jumping = true;
        move.Jump(jumpPower);
    }
}

private void DoDoubleJump()
{
    if (doubleJumping == false && Input.GetButtonDown("Jump"))
    {
        doubleJumping = true;
        move.DoubleJump(jumpPower);
    }
}

実装中に1つ困ったことがありました。
デコボコした地面を速い速度で移動していると、たびたびisGrounded がfalse判定になってしまい、スペースキー押してるのにジャンプできねえ!という事態に。

なので、滞空時間を測定するようにして、その時間が閾値以下なら地面を歩いているのと同じようにジャンプできるようにしました。やったー、これでストレスフリー。

「jumpDuration」が滞空時間って…。という突っ込みは無しでお願いします。正しい英語より、いかに自分が正しく認識できるかどうかのほうが大事なんじゃ~(他の人は知らない