キャラクターの当たり判定に、箱や球を使うと、形状が合わなくて判定が不自然になる。
キャラクターは縦長の形状なので、カプセルを使いたい。
でも、カプセルの当たり判定ってどう計算すればいいのか分からない。
そんな悩みを抱えていませんか。
カプセル(Capsule)は、円柱の両端に半球をつけた形状で、キャラクターの当たり判定に適しています。
この記事では、カプセルの当たり判定の仕組みを、Unity実装例とともに解説します。
カプセルとは何か(ゲーム制作目線)

カプセルは、円柱の両端に半球をつけた形状です。
Unityでは、CapsuleColliderコンポーネントが用意されています。
カプセルの特徴は、縦長の形状を正確に表現できることです。
キャラクターの当たり判定には、箱(AABB)や球(Sphere)を使うこともできますが、箱は角が当たって不自然、球は形状が合わないという問題があります。
カプセルなら、キャラクターの形状に近く、滑らかな形状なので、当たり判定が自然になります。
カプセルの表現方法
カプセルは、2つの球の中心点と、半径で表現できますね。
2つの球の中心点を結ぶ線分を軸として、その周りに半径分の厚みを持った形状です。
UnityのCapsuleColliderでは、中心点、高さ、半径でカプセルを定義します。
ゲームでの具体的な使い道

カプセルの当たり判定が、ゲームでどう使われているかを確認してみましょう。
キャラクターの当たり判定
プレイヤーキャラクターや敵キャラクターの当たり判定に、カプセルがよく使われます。
キャラクターは縦長の形状なので、箱や球よりもカプセルの方が適しています。
カプセルを使うことで、より自然な当たり判定が実現できます。
物理演算との連携
Unityの物理演算では、CapsuleColliderとRigidbodyを組み合わせることで、カプセルの当たり判定を自動で処理してくれます。
キャラクターコントローラーや、物理ベースの移動システムで活用されます。
地形との衝突判定
キャラクターが地面や階段、坂道を移動する時、カプセルの当たり判定が有効です。
滑らかな形状なので、階段を登る時や、坂道を移動する時に自然な動きになります。
他のカプセルとの衝突
複数のキャラクター同士が衝突する時、カプセル同士の当たり判定が必要です。
カプセル同士の判定は、計算が複雑ですが、Unityの物理エンジンが自動で処理してくれます。
- キャラクターの当たり判定(プレイヤー、敵など)
- 物理演算との連携
- 地形との衝突判定
- 他のカプセルとの衝突判定
作り方は分かった。
でも完成まで行けない人へ
当たり判定・移動・カメラ・AIまで、
実装しながら学べる「永久会員チケット」です。
※ まずは内容を見るだけでOK
考え方・仕組みを図解イメージで説明

カプセルの当たり判定は、「点と線分の最短距離」という考え方で理解できますね。
カプセルと点の距離
カプセルと点の距離を計算する時、まず点からカプセルの軸(2つの球の中心点を結ぶ線分)への最短距離を計算します。
この最短距離が、カプセルの半径以下なら、点はカプセルの内部にあります。
カプセルとカプセルの距離
2つのカプセルが衝突しているかを判定する時、それぞれのカプセルの軸を考えます。
2つの軸の間の最短距離を計算し、それぞれの半径を足した値と比較します。
最短距離が、2つの半径の合計以下なら、カプセル同士は衝突しています。
カプセルと球の距離
カプセルと球の距離を計算する時、球の中心点からカプセルの軸への最短距離を計算します。
この最短距離から、カプセルの半径を引いた値が、球の半径以下なら、衝突しています。
線分と点の最短距離
カプセルの当たり判定では、線分と点の最短距離を計算することが重要です。
線分ABと点Pの最短距離は、Pから線分AB上の最近接点への距離です。
最近接点は、Pを線分ABに投影した点です。
- カプセルの当たり判定は、点と線分の最短距離を使って計算する
- カプセルとカプセルの判定は、2つの軸の間の最短距離と半径を比較する
- 計算は複雑だが、Unityの物理エンジンが自動で処理してくれる
- 手動で実装する場合は、ライブラリの使用を推奨する
Unityで実装する際の注意点(代表例)

Unityでカプセルの当たり判定を実装する場合の注意点を見ていきましょう。
CapsuleColliderを使った実装
Unityでは、CapsuleColliderコンポーネントを使うことで、カプセルの当たり判定を簡単に実装できます。
|
1 2 3 4 5 6 7 8 |
// CapsuleColliderを追加 CapsuleCollider capsuleCollider = gameObject.AddComponent(); // カプセルの設定 capsuleCollider.height = 2f; // 高さ capsuleCollider.radius = 0.5f; // 半径 capsuleCollider.center = new Vector3(0, 1, 0); // 中心位置 |
このコードでは、CapsuleColliderを追加して、高さ、半径、中心位置を設定しています。
物理演算を使った判定
Rigidbodyと組み合わせることで、物理演算による当たり判定が可能です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public class CapsuleController : MonoBehaviour { private Rigidbody rb; private CapsuleCollider capsuleCollider; void Start() { rb = GetComponent(); capsuleCollider = GetComponent(); } // 衝突時に呼ばれる void OnCollisionEnter(Collision collision) { // 衝突したオブジェクトを処理 Debug.Log("衝突: " + collision.gameObject.name); } // トリガーに侵入した時に呼ばれる void OnTriggerEnter(Collider other) { // トリガーに侵入したオブジェクトを処理 Debug.Log("侵入: " + other.gameObject.name); } } |
このコードでは、物理演算を使った当たり判定を実装しています。
手動で判定を実装する場合
物理演算を使わず、手動でカプセルの当たり判定を実装する場合のコード例です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
bool IsPointInCapsule(Vector3 point, Vector3 capsuleStart, Vector3 capsuleEnd, float radius) { // 点から線分への最短距離を計算 Vector3 line = capsuleEnd - capsuleStart; Vector3 toPoint = point - capsuleStart; float lineLength = line.magnitude; if (lineLength < 0.0001f) // 線分が点の場合 { return Vector3.Distance(point, capsuleStart) <= radius; } // 線分上への投影 float t = Mathf.Clamp01(Vector3.Dot(toPoint, line) / (lineLength * lineLength)); Vector3 closestPoint = capsuleStart + line * t; // 距離を計算 float distance = Vector3.Distance(point, closestPoint); return distance <= radius; } |
このコードでは、点がカプセル内にあるかを判定しています。
ただし、カプセル同士の判定はより複雑なため、ライブラリの使用を推奨します。
Physics.CheckCapsuleを使った判定
Unityには、Physics.CheckCapsuleという関数があり、指定した範囲内にコライダーがあるかを判定できます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// カプセルの範囲内にコライダーがあるかを判定 Vector3 capsuleStart = transform.position; Vector3 capsuleEnd = transform.position + Vector3.up * 2f; float radius = 0.5f; int layerMask = -1; // すべてのレイヤー bool hasCollider = Physics.CheckCapsule(capsuleStart, capsuleEnd, radius, layerMask); if (hasCollider) { Debug.Log("カプセル内にコライダーがあります"); } |
このコードでは、指定したカプセルの範囲内にコライダーがあるかを判定しています。
Physics.OverlapCapsuleを使った判定
Unityには、Physics.OverlapCapsuleという関数もあり、カプセルの範囲内のすべてのコライダーを取得できます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// カプセルの範囲内のコライダーを取得 Vector3 capsuleStart = transform.position; Vector3 capsuleEnd = transform.position + Vector3.up * 2f; float radius = 0.5f; int layerMask = -1; Collider[] colliders = Physics.OverlapCapsule(capsuleStart, capsuleEnd, radius, layerMask); foreach (Collider col in colliders) { Debug.Log("検出: " + col.gameObject.name); } |
このコードでは、カプセルの範囲内のすべてのコライダーを取得しています。

まとめ

この記事では、カプセルの当たり判定について見てきました。
重要なポイントをおさらいします。
- カプセルは円柱の両端に半球をつけた形状で、キャラクターの当たり判定に適している
- カプセルの当たり判定は、点と線分の最短距離を使って計算する
- UnityではCapsuleColliderコンポーネントを使うことで、簡単に実装できる
- 物理演算を使うことで、カプセル同士の衝突を自動で処理できる
- 手動で実装する場合は複雑になるため、Unityの物理エンジンやライブラリの使用を推奨する
カプセルの当たり判定は、キャラクターの当たり判定に最適です。
UnityのCapsuleColliderや物理エンジンを活用すれば、効率的に実装できます。
まずは、CapsuleColliderを使って、基本的な当たり判定を実装してみましょう。
実際に試してみることで、カプセルの当たり判定の効果を実感できるはずです。
数学的な理論だけでなく、実際のゲーム実装とセットで学ぶことで、理解が深まるはずです。
Unity入門の森では、当たり判定を実装とセットで学べるUnity入門の森・永久会員講座への導線を用意しています。
ぜひチェックしてみてください。
Unity入門の森をチェック Unity初心者でも安心。動画解説+完成サンプル付きで実装まで進められます





コメント