目次

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;
		}
	}
}