某魔界の村で戦う騎士のように、二段ジャンプを実装してみる。
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が代入されるようにしないといけない。
まあ、単純にタグを外せばいいのだが。
コメント