学習記事一覧 · Unity教科書_Unity6対応

補足:Igaguri 距離ボーナス(radius を Bounds.extents から)

題材・出典: SBクリエイティブ刊『Unityの教科書 Unity 6完全対応版』付属サンプルに基づく学習解説です。書籍の代替提供を目的とせず、コード掲載は学習上必要な範囲(必要最小限)にとどめます。利用条件は書籍付属案内・Readme・出版社サポート情報に従ってください。本シリーズ目次(書籍・著作の注記)

対象読者:Chapter 7 Igaguriゲーム入門発展④(距離ボーナス) まで進めた方
本編では radius を手で決める形が基本です。このページは、コライダの Bounds から radius を推定する応用です。


記事の目次


本編との関係

発展④:的の中心に近いほど高得点 では、次の流れでスコアを出しています。

  1. 衝突点と bounds.center との距離 distance を求める
  2. radius(手で決めた定数) で割り、Clamp01(1 - distance / radius) で「端≈0・中心≈1」の比率にする
  3. 比率に maxPoints を掛けて hitScore にする

Prefab のスケールや的の大きさを変えるたびに radius の数値を直したくないとき、当たったコライダの包囲ボックスから「おおよその半径」を取る方法があります。


extents で radius を決める理由

Collider.bounds はワールド空間の**軸に平行な包囲ボックス(AABB)**です。bounds.extents は、中心から各軸方向への「半分の辺の長さ」(いわゆる半サイズ)です。

板状の的であれば、厚みの軸は小さく、面内の軸が大きくなりがちです。extents.xyz最大値radius にすると、面内のおおよその半径として使いやすいことが多いです。コライダの Transform のスケールを変えると bounds も変わるため、スコアの減り方が自動で追従します。


コード例(OnCollisionEnter 内)

本編の OnCollisionEnter のうち、targetCenter から hitScore までを次のように置き換えます(タグ判定・contactCount チェック・ScoreManagerisKinematic / 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.colliderbounds が使われます。Tag は そのコライダが付いている GameObject に付ける必要があります。
  • 下限 0.01fextents が極端に小さいと distance / radius が不安定になるため、下限を設けています

まとめ

  • 本編の 手で決める radius が、学習とデバッグでは分かりやすい基本形です。
  • bounds.extents の最大値radius を推定すると、スケール変更に追従しやすくなります。
  • 回転・AABB・厚みの性質を理解しておくと、挙動のズレを説明しやすくなります。

← Igaguriゲーム入門(本編)に戻る


最終更新:2026年4月