#11 プレイヤーのスクリプトを改良してジャンプ出来るようにしよう

ステージの配置が出来たわけですが、ブロックに乗れなかったり、谷を超えられなかったりする状態です。ここではスクリプトを改良してジャンプできるようにしましょう。

目次

ジャンプが出来る用の処理を追加

スクリプトを編集

まずはスクリプトを以下のように変更しましょう。

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private Rigidbody2D m_rigidbody;
    private float m_fAxisHorizontal;
    public float HorizontalSpeed = 3f;

    public float m_fJumpPower = 9.0f;
    public LayerMask m_layerGround;
    private bool m_bJumpRequest;
    private bool m_bIsGround;

    void Start()
    {
        m_rigidbody = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        m_fAxisHorizontal = Input.GetAxisRaw("Horizontal");

        if( 0f < m_fAxisHorizontal)
        {
            // 右側の入力
            transform.localScale = Vector2.one;
        }
        else if(m_fAxisHorizontal < 0f)
        {
            // 左側の入力
            transform.localScale = new Vector2(-1f, 1f);
        }
        else
        {
            // 左右の入力なし
        }

        // ジャンプの入力処理
        if(Input.GetButtonDown("Jump"))
        {
            InputJump();
        }

    }

    private void OnDrawGizmos()
    {
        Debug.DrawLine(transform.position,
            transform.position + (transform.up * -0.27f));

        Gizmos.DrawWireSphere(
            transform.position + (transform.up * -0.27f),
            0.5f);
    }

    private void FixedUpdate()
    {
        // 接地判定
        m_bIsGround = Physics2D.CircleCast(
            transform.position ,
            0.5f,
            transform.up * -1f,
            0.27f,
            m_layerGround);

        m_rigidbody.velocity = new Vector2(
            m_fAxisHorizontal * HorizontalSpeed,
            m_rigidbody.velocity.y);

        if(m_bIsGround && m_bJumpRequest)
        {
            Vector2 jumpPower = new Vector2(0f, m_fJumpPower);
            m_rigidbody.AddForce(jumpPower, ForceMode2D.Impulse);
            m_bJumpRequest = false;
        }
    }

    private void InputJump()
    {
        m_bJumpRequest = true;
    }
}

プレイヤー・足場のオブジェクト設定

スクリプトの編集が終わったらヒエラルキーにあるPlayerを選択して、設定変更を行います。

TagをPlayerに変更

Playerのタグ(Tag)をPlayerに変更します。コレ自体はジャンプ時には利用しませんが、後に使うので今のうちに変更しておきましょう。

GroundのLayerMaskを変更

地面のレイヤーを判定するためのLayerMaskの設定を行います。今回はGroundというレイヤーが地面と判断します。下図のようにGroundのみに設定が入った状態にしてください。2つ以上にチェックが入ってしまうとMixedという表示になりますのでその場合はGround以外のチェックを外しましょう。

足場になるオブジェクト達の設定

プレイヤがジャンプや移動をするために足場になる部分に接していないと移動ができなくなります。足場の画像やBlock類のレイヤーを「Ground」に変更してください。

レイヤーの設定に関してはプレファブ側を変更しておくとシーン内のものを変更しなくても一括で置き換わるのでやるならそっちがわで対応してみましょう。このあとプレイヤーを動かしてみて歩けなくなっていたら対象の足場がGroundになっていない可能性大です

ジャンプは出来るようになったけどもう少し調整したい

補足1:ふわっとしたジャンプを調整する

ジャンプ出来るようになりましたが、ふわっとしすぎてなんだか遊びづらいですよね。ここではそのふわっと感を修正したいと思います。修正するにはプロジェクトセッティングからPhysics2Dの設定を変更します。

  • Edit>Project Settingsからエディターを開きます。
  • Physics 2Dタブを選択
  • GravityのYをいい感じに調整する(渡しの場合は-30.デフォルトは-9.81とかだったと思う)

これでキビキビ動くようになります。谷などを超えられる長さに影響が出るので、可能な限り早い段階で調整しましょう。

補足2:DrawGizmoと接地判定

プログラムの中に、地面に足がついているかの判定とそれをシーンビューで確認する処理があります。シーンビューのPlayerを見やすい位置に移動させると、緑の線と白い丸の線が表示されていると思います。この白い線はCircleCastで一番遠くに当たり判定をとる丸になります。

今回のキャラクターは足もとは丸みを帯びているので直線などでの当たり判定では地面の判定を行うには少し不足します。DrawGizmoを使うことでシーンビュー内でどのような当たり判定を取られるかを予め可視化することで、快適にゲーム内の当たり判定の調整を行うことが出来ます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次