この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン | |||
wiki:unity:tips:069 [2015/01/06 14:16] step |
— (現在) | ||
---|---|---|---|
ライン 1: | ライン 1: | ||
- | ====== 069 2段ジャンプを実装する(AddForceを使った場合) ====== | ||
- | |||
- | ===== 概要 ===== | ||
- | rigidbody.AddForceを使って2段ジャンプを実装します。 | ||
- | 2段目のジャンプを1段目と同じ挙動にするためにはrigidbody.velocity を初期化します。 | ||
- | |||
- | ==== 3Dの場合 ==== | ||
- | <code csharp> | ||
- | 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; | ||
- | } | ||
- | } | ||
- | } | ||
- | </code> | ||
- | |||
- | |||
- | 操作するPlayerのGameObjectには当たり判定用にBox Collider、物理属性付加のためRigidBodyコンポーネントを追加しています。 | ||
- | 地面となるFloorのGameObjectにはBox Collider コンポーネントのみ追加しています。 | ||
- | |||
- | ==== 2Dの場合 ==== | ||
- | 3Dとの違いは当たり判定や物理属性付加に、2D用のrigidbody2DとBox Collider2Dを使っている点です。 | ||
- | ジャンプに加える力forceも2D用に調整している点に注目して下さい。 | ||
- | |||
- | <code csharp> | ||
- | 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; | ||
- | } | ||
- | } | ||
- | } | ||
- | </code> | ||
- | |||