補足:Igaguri 距離ボーナス(radius を Bounds.extents から)
題材・出典: SBクリエイティブ刊『Unityの教科書 Unity 6完全対応版』付属サンプルに基づく学習解説です。書籍の代替提供を目的とせず、コード掲載は学習上必要な範囲(必要最小限)にとどめます。利用条件は書籍付属案内・Readme・出版社サポート情報に従ってください。本シリーズ目次(書籍・著作の注記)
対象読者:Chapter 7 Igaguriゲーム入門 の 発展④(距離ボーナス) まで進めた方
本編ではradiusを手で決める形が基本です。このページは、コライダのBoundsからradiusを推定する応用です。
記事の目次
本編との関係
発展④:的の中心に近いほど高得点 では、次の流れでスコアを出しています。
- 衝突点と
bounds.centerとの距離distanceを求める radius(手で決めた定数) で割り、Clamp01(1 - distance / radius)で「端≈0・中心≈1」の比率にする- 比率に
maxPointsを掛けてhitScoreにする
Prefab のスケールや的の大きさを変えるたびに radius の数値を直したくないとき、当たったコライダの包囲ボックスから「おおよその半径」を取る方法があります。
extents で radius を決める理由
Collider.bounds はワールド空間の**軸に平行な包囲ボックス(AABB)**です。bounds.extents は、中心から各軸方向への「半分の辺の長さ」(いわゆる半サイズ)です。
板状の的であれば、厚みの軸は小さく、面内の軸が大きくなりがちです。extents.x・y・z の最大値を radius にすると、面内のおおよその半径として使いやすいことが多いです。コライダの Transform のスケールを変えると bounds も変わるため、スコアの減り方が自動で追従します。
コード例(OnCollisionEnter 内)
本編の OnCollisionEnter のうち、targetCenter から hitScore までを次のように置き換えます(タグ判定・contactCount チェック・ScoreManager・isKinematic / ps.Play() は本編どおり)。
Collider targetCol = collision.collider;
Bounds b = targetCol.bounds;
Vector3 targetCenter = b.center;
Vector3 collisionPoint = collision.GetContact(0).point;
float distance = Vector3.Distance(collisionPoint, targetCenter);
float radius = Mathf.Max(Mathf.Max(b.extents.x, b.extents.y), b.extents.z);
radius = Mathf.Max(radius, 0.01f); // 極小コライダで 0 除算にならないよう下限
int maxPoints = 100;
float closeness = Mathf.Clamp01(1f - distance / radius);
int hitScore = Mathf.RoundToInt(closeness * maxPoints);手感が合わないときは、radius を求めた直後に radius *= 1.2f; のように係数で微調整してもよいです。
注意点(AABB・回転・厚み・0除算)
- AABB であること:
boundsは常に世界座標軸に平行な箱です。的やコライダが大きく回転していると、見た目の円・楕円とradiusのイメージがずれることがあります。 - 厚みのあるコライダ:距離は 表面の衝突点 と
bounds.centerとの 3D 距離です。コライダが厚いと、正面の中心付近でも 厚みの半分ほどが常に距離に乗り、extentsから取ったradiusと組み合わせたときの手感が分かりにくくなります。当たり判定だけ薄い Box Collider(狙い面に合わせ、厚みを小さく)にすると、本編の補足と同じ考え方で揃えやすいです。 - 複合コライダ:親子で複数のコライダがある場合、実際に当たった
collision.colliderのboundsが使われます。Tag は そのコライダが付いている GameObject に付ける必要があります。 - 下限
0.01f:extentsが極端に小さいとdistance / radiusが不安定になるため、下限を設けています。
まとめ
- 本編の 手で決める
radiusが、学習とデバッグでは分かりやすい基本形です。 bounds.extentsの最大値でradiusを推定すると、スケール変更に追従しやすくなります。- 回転・AABB・厚みの性質を理解しておくと、挙動のズレを説明しやすくなります。
最終更新:2026年4月