表示テーマ
Physicsと当たり判定
描画と衝突は別
MeshRendererでモデルを表示しても、そのまま物理判定の形状になるとは限りません。接触に使うCollisionと、動かすRigidbodyを設定します。
| Component | 役割 |
|---|---|
| Collision | 形状、衝突タイプ、Trigger、押し戻し |
| Rigidbody | 3Dの質量、重力、速度、力、接触応答 |
| Rigidbody2D | 2Dの移動・回転と接触応答 |
| FixedJoint | 剛体間の固定接続 |
| HingeJoint | 軸に沿った回転接続 |
落下する物体を作る
- Cubeなどを置き、Collisionの形状を見た目へ合わせます。
- Rigidbodyを追加し、Dynamicと重力を有効にします。
- 床にもCollisionを設定し、固定物として扱います。
- 「プロジェクト設定 → 衝突設定」で双方の衝突タイプが接触できる組み合わせかを確認します。
- Playし、落下して床へ止まることを確認します。
Dynamicは物理で動き、Kinematicはゲーム側の制御、Staticは固定物です。毎frameのTransform設定と物理の速度計算を同時に行うと競合するため、動かし方を揃えます。
Forceと速度
物理に関わる継続的な操作はFixedUpdateで行います。力、衝撃、速度変更はForceModeで意味が異なります。秒数を掛ける必要も同じではないため、力と移動量を取り違えないでください。
Freeze Position/Rotationで軸を固定できます。質量、摩擦、反発、減衰を1項目ずつ変えて比較します。
接触を受け取る
OnCollisionEnter、OnCollisionStay、OnCollisionExitの引数には、相手GameObject、接触点、法線、めり込み量、Triggerかどうかなどが入ります。通知中に対象を破棄した場合、その後の参照を使い続けないでください。
Raycast
cs
using NEMEngine;
public sealed class MouseRaycast : MonoBehaviour {
void Update() {
// クリック位置からCameraのRayを取得
if (!Input.GetMouseButtonDown(0)) return;
if (!Camera.TryGetMouseRay(out var ray)) return;
// 100単位以内の当たり位置を調べる
if (Physics.Raycast(ray, out var hit, 100.0f)) {
Debug.Log($"命中位置: {hit.point}");
}
}
}CameraからのRayはゲームView内のマウス位置を使います。画面外やCamera不在の場合にRayを作れないことがあります。
Raycastの対象は描画MeshとCollisionなどで選別できます。判定LayerとTriggerの扱いも指定できます。描画の透明部分・変形と、判定形状が常に完全一致するとは限りません。
Joint
接続先のRigidbodyと、双方のAnchorを設定します。HingeJointでは回転軸と角度制限も確認します。接続先を非アクティブ・破棄する場面では、Joint側の参照が残ることを想定して制御します。