Unity 二段ジャンプさせてみた

Unity

某魔界の村で戦う騎士のように、二段ジャンプを実装してみる。

 

x-z 面の移動は Input.GetAxis にて、実装。

 

最近、分かったことだが、Input.GetAxis と Input.GetAxisRaw なるモノがあり、前者は、PCなどのキーボード入力による場合でも、0から1、0から-1の値を徐々に、入力してくれるものらしい。

 

逆に、後者は、ジョイスティックなどの入力においても、極端に、0もしくは1、0もしくは-1の値をとるらしい。

 

ちなみに、raw の意味は、”生(なま)”、”生々しい” らしいのです。

 

 

| スクリプト(c#)


 

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

public class CubeController : MonoBehaviour
{
    public float speed = 1.0f;
    public float jumpPower = 1.0f;
    Rigidbody rb;
    int jumpCount = 0;

    // Use this for initialization
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

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

    void Move()
    {
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");

        transform.Translate(new Vector3(horizontal * speed, 0, vertical * speed));
    }

    void Jump()
    {
        if (Input.GetKeyDown("space") && jumpCount < 2)
        {
            rb.AddForce(new Vector3(0, jumpPower * 100.0f, 0));
            jumpCount++;
        }
    }


    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.tag == "Ground")
        {
            jumpCount = 0;
        }
    }
}

 

 

| Move()


PCの場合、方向キーで、オブジェクトを操作。

 

Input.GetAxis(“Horizontal”);

 

は、右と左のキー入力の値を、右なら、1 左なら、-1 で返してくれる。

 

Input.GetAxis(“Vertical”);

 

も同様に上下のキー入力を返してくれる。

 

ただ、このままでは、値が、1.0fか-1.0fなので、speed 変数などを任意で決め、乗算して移動量を決める。

 

(実行してみたら、そのままでも充分速かった。)

 

| Jump()


最初に、コードを書いたとき、Rigidbody() を使用するので、調子に乗って、FixedUpdate()

 内に、記述していったら、上手く動作しなかった。

 

おとなしく、Update 内に記述したら、思い通りの二段ジャンプをしてくれた。

 

 

| OnCollisionEnter(Collision collision)


あらかじめ、地面となるオブジェクトには、Ground のタグをつけておいた。

 

もし、接触したオブジェクトが、Ground のタグを持っていたら、内部の処理を実行している。

 

とは、言っても、やっていることは、JumpCount の変数に、0を代入しているだけ。

 

これで、二段ジャンプ後に、着地したら、また、二段ジャンプできるようになっている。

 

つまり、Ground のタグ付きのオブジェクトに接触しない限りは、二段ジャンプどころか、普通のジャンプもできなくなってしまうので、ゲームに実装する時は、あらゆるオブジェクトに接触したとき JumpCount に0が代入されるようにしないといけない。

 

まあ、単純にタグを外せばいいのだが。

コメント

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