初めに
私はアクションゲームが昔から好きでいつか作りたいと思っていて、つい最近、完成させたゲームがあります。その中でいくつか Unity で実装する上で気になるところがありましたので、少しずつ作ってみたことで見えてきたことについても載せていこうと思いまして今回の記事になりました。
ゲーム制作の解説本や Udemy の講座を見てみると、Rigidbody を使用したジャンプがほとんどなので、これを使用するのが普通に思っていましたが、あくまで AI の情報源ではありますが、有名なインディーのタイトルなんかはジャンプ挙動には Rigidbody を使用していないというのも出てくるので気になっていました。
Rigidbody は Unity で物理演算の処理を自動で任せて、現実世界に近い挙動の動きができるなど何かと便利な標準的な機能ですが、一方で不便に感じるような場面もあるのでその辺りについて思うことを今回の記事では書いていきます。あくまでアクションゲームでの考え方なのでゲームのジャンルによって考慮することは多いかと思われます。
Rigidbodyのメリット・デメリット
Rigidbody を使うメリット
- 物理演算を自動で行ってくれる
public class PlayerController : MonoBehaviour
{
public float moveSpeed = 5f;
public float jumpForce = 10f;
private Rigidbody2D rb;
void Start()
{
rb = GetComponent();
}
void Update()
{
// 水平移動
float horizontal = Input.GetAxis("Horizontal");
rb.velocity = new Vector2(horizontal * moveSpeed, rb.velocity.y);
// ジャンプ
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
}
}
}
- 衝突判定の実装が簡単
public class CollisionHandler : MonoBehaviour
{
void OnCollisionEnter2D(Collision2D collision)
{
// 敵との衝突
if (collision.gameObject.CompareTag("Enemy"))
{
Debug.Log("敵に当たった!");
// ダメージ処理など
}
// 地面との衝突
if (collision.gameObject.CompareTag("Ground"))
{
Debug.Log("地面に着地した!");
// 着地処理など
}
}
void OnTriggerEnter2D(Collider2D other)
{
// アイテムとの接触
if (other.CompareTag("Item"))
{
Debug.Log("アイテムを取得!");
Destroy(other.gameObject);
}
}
}
Rigidbody を使うデメリット
- ジャンプの細かい制御がむずかしい
- 特殊な挙動の安定化が難しい

対策方法
あくまでアクションの挙動に対しては、Rigidbodyを使用すると使いづらい場面があるだけであり、当たり判定などでは使いやすいという面もあります。
そのための対応策としては、ColliderとRigidbodyを対象のオブジェクトにコンポーネントとして付与し、Rigidbodyを「キネマティック」に設定すると良いと思います。
この設定にしておくことで、当たり判定のみを取得しつつ、重力や物理演算的な処理を無効化できます。
![]()
まとめ
軽く Rigidbody のメリット・デメリットを書いてみましたが、今後は Rigidbody を使わない部分を含むアクションゲームを作ってみる予定なので、また分かることがあれば追記していきたいと思います。アクションでも操作性が大事なゲームであったりストーリー重視かで仕様も異なるので、ゲームの方針に合わせるといいですね。