Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Set up 3D physics in Unity 6: Rigidbody movement and forces, colliders, triggers vs collisions, layer-based collision, raycasts, and joints. Use when adding a Rigidbody, handling OnCollisionEnter/OnTriggerEnter, tuning collision layers, casting rays, or when the user mentions Unity physics, AddForce, isKinematic, or linearVelocity.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-11 | ✗→✓ | ▲ Improved | 72% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 57% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 49% | 0% |
| case-15 | ✓→✓ | = Same ✓ | 110% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 259% | 0% |
Make objects move, collide, and detect each other with Unity 6's built-in 3D physics (PhysX). Get the FixedUpdate discipline, trigger-vs-collision rules, and collision layers right. Targets Unity 6 (6000.0 LTS).
> Unity 6 rename: Rigidbody.velocity is now Rigidbody.linearVelocity (the old > name is deprecated). Code copied from older tutorials will warn or fail to compile.
collisions or triggers, setting up collision layers/masks, raycasting for ground checks or line-of-sight, or connecting bodies with joints.
Rigidbody + Collider components.When not to use: 2D physics (Rigidbody2D, Collider2D) is a separate API — adapt the concepts but the types differ. Cross-engine feel tuning (timestep, jitter, tunnelling) → physics-tuning. Reading input that drives movement → unity-input-system.
Rigidbody to anything that should be simulated; add a Collider to anythingthat should be hit. A collision needs a Collider on both, and at least one Rigidbody.
FixedUpdate. Read input in Update, store intent, then applyforces / set linearVelocity / call MovePosition in FixedUpdate.
AddForce,linearVelocity, or MovePosition — never assign transform.position to a non-kinematic Rigidbody (it teleports and breaks collision resolution).
OnCollisionEnter; aCollider with Is Trigger checked passes through and calls OnTriggerEnter.
Matrix (Project Settings → Physics) so unrelated things don't test against each other.
for jitter; if fast objects pass through walls, raise Collision Detection mode.
FixedUpdate (with a speed clamp)csharpusing UnityEngine; [RequireComponent(typeof(Rigidbody))] public class Mover : MonoBehaviour { [SerializeField] private float accel = 30f, maxSpeed = 8f; private Rigidbody _rb; private Vector3 _input; // set from Update / input system private void Awake() => _rb = GetComponent<Rigidbody>(); private void FixedUpdate() { _rb.AddForce(_input * accel, ForceMode.Acceleration); // mass-independent accel // Unity 6: linearVelocity (was 'velocity'). Clamp horizontal speed. Vector3 flat = new(_rb.linearVelocity.x, 0, _rb.linearVelocity.z); if (flat.magnitude > maxSpeed) { flat = flat.normalized * maxSpeed; _rb.linearVelocity = new Vector3(flat.x, _rb.linearVelocity.y, flat.z); } } }
ForceMode: Force (continuous, mass-scaled), Acceleration (continuous, ignores mass), Impulse (instant, mass-scaled — jumps), VelocityChange (instant, ignores mass).
csharp// Solid hit: both have colliders, this one has a (non-kinematic) Rigidbody. private void OnCollisionEnter(Collision col) { Debug.Log($"Hit {col.gameObject.name} at {col.contacts[0].point}"); } // Overlap: one collider has 'Is Trigger' = true. Requires a Rigidbody on at least one party. private void OnTriggerEnter(Collider other) { if (other.CompareTag("Pickup")) Destroy(other.gameObject); }
csharp[SerializeField] private LayerMask groundMask; // set to your "Ground" layer in the Inspector private bool IsGrounded() { // Cast a short ray down; only test colliders on groundMask. return Physics.Raycast(transform.position, Vector3.down, out RaycastHit hit, 1.1f, groundMask); }
csharp// isKinematic Rigidbody: not driven by forces, but MovePosition interpolates and carries // resting bodies correctly (unlike moving the Transform directly). private void FixedUpdate() => _rb.MovePosition(_rb.position + Vector3.right * (2f * Time.fixedDeltaTime));
Rigidbody.velocity doesn't exist in Unity 6 — use linearVelocity (andangularVelocity is unchanged).
transform.position on a dynamic Rigidbody — teleports it, skips collision.Use MovePosition (kinematic/interpolated) or apply forces.
Update — frame-rate-dependent and jittery. Physics goes inFixedUpdate.
Rigidbody on at least one of the twocolliders, and both colliders enabled; two static triggers don't report overlaps.
to Continuous (or Continuous Dynamic) for bullets/fast movers.
MeshColliders or scaled colliders misbehave; prefer primitivecolliders and keep scale uniform.
Collision Matrix.
SphereCast, RaycastAll, OverlapSphere, LayerMask bit math) andjoints (FixedJoint, HingeJoint, ConfigurableJoint, breakable joints), read references/raycasting-and-joints.md.
ScriptReference/Rigidbody,ScriptReference/Physics.Raycast.
physics-tuning — engine-agnostic feel: fixed timestep, mass/drag, CCD, stability.unity-csharp-scripting — the FixedUpdate/Update split these patterns rely on.unity-navmesh — agent movement that is not force-driven.Other measured skills in the registry, with their headline benchmark lift.