====== 069 2段ジャンプを実装する(AddForceを使った場合) ====== ===== 概要 ===== rigidbody.AddForceを使って2段ジャンプを実装します。 2段目のジャンプを1段目と同じ挙動にするためにはrigidbody.velocity を初期化します。 ==== 3Dの場合 ==== using UnityEngine; using System.Collections; public class Player : MonoBehaviour { public const int MAX_JUMP_COUNT = 2; // ジャンプできる回数。 public float force = 5.0f; private int jumpCount = 0; private bool isJump = false; void Update() { // クリックでジャンプ。 if( jumpCount < MAX_JUMP_COUNT && Input.GetMouseButtonDown(0) ) { isJump = true; } } void FixedUpdate() { if( isJump ) { // 速度をクリアして2回目のジャンプも1回目と同じ挙動にする。 rigidbody.velocity = Vector3.zero; // ジャンプさせる。 rigidbody.AddForce( Vector3.up * force, ForceMode.Impulse ); // ジャンプ回数をカウント。 jumpCount++; // ジャンプを許可する。 isJump = false; } } private void OnCollisionEnter( Collision collision ) { // 地面との当たり。 if (collision.gameObject.name == "Floor") { jumpCount = 0; } } } 操作するPlayerのGameObjectには当たり判定用にBox Collider、物理属性付加のためRigidBodyコンポーネントを追加しています。 地面となるFloorのGameObjectにはBox Collider コンポーネントのみ追加しています。 ==== 2Dの場合 ==== 3Dとの違いは当たり判定や物理属性付加に、2D用のrigidbody2DとBox Collider2Dを使っている点です。 ジャンプに加える力forceも2D用に調整している点に注目して下さい。 using UnityEngine; using System.Collections; public class Player : MonoBehaviour { private const int MAX_JUMP_COUNT = 2; // ジャンプできる回数。 private float force = 250.0f; private int jumpCount = 0; private bool isJump = false; void Update() { // クリックでジャンプ。 if( jumpCount < MAX_JUMP_COUNT && Input.GetMouseButtonDown(0) ) { isJump = true; } } void FixedUpdate() { if( isJump ) { // 速度をクリアした2回目のジャンプも1回目と同じ挙動にする。 rigidbody2D.velocity = Vector2.zero; // ジャンプさせる。 rigidbody2D.AddForce( Vector2.up * force ); // ジャンプ回数をカウント。 jumpCount++; // ジャンプを許可する。 isJump = false; } } private void OnCollisionEnter2D( Collision2D collision ) { if (collision.gameObject.name == "Floor") { jumpCount = 0; } } }