unity-physics
gamedev-skills/awesome-gamedev-agent-skills
Set up 3D physics in Unity 6.3 LTS: Rigidbody movement, colliders, collisions, raycasts, and joints.
What is unity-physics?
Configure PhysX-based 3D physics for moving objects, handling collisions and triggers, and detecting interactions via raycasts. Use this when adding Rigidbody components, responding to OnCollisionEnter/OnTriggerEnter, tuning collision layers, or implementing physics-driven movement in Unity 6.3 LTS.
- Apply forces and velocity to Rigidbody objects with mass-aware or mass-independent acceleration modes
- Distinguish between solid collisions (OnCollisionEnter) and trigger overlaps (OnTriggerEnter) and respond accordingly
- Organize interactions using layer-based collision matrices to avoid unnecessary physics tests
- Cast rays with layer masks for ground checks, line-of-sight, and hit detection
- Connect bodies with joints and configure kinematic vs dynamic Rigidbody behavior
- Debug physics with the Physics Debugger and handle common pitfalls like tunnelling and sleeping bodies
How to install unity-physics
npx skills add https://github.com/gamedev-skills/awesome-gamedev-agent-skills --skill unity-physics- Unity 6.3 LTS (6000.3) or compatible version
- Basic understanding of Transform, GameObject, and MonoBehaviour
- Familiarity with FixedUpdate vs Update execution order
How to use unity-physics
- 1.Add a Rigidbody component to any object that should be physically simulated, and a Collider to anything that should be hit
- 2.Read input in Update and store movement intent; apply all forces and velocity changes in FixedUpdate
- 3.Use AddForce, linearVelocity, or MovePosition to move bodies—never assign transform.position directly to dynamic Rigidbodies
- 4.Toggle 'Is Trigger' on a Collider to switch between solid collisions (OnCollisionEnter) and trigger overlaps (OnTriggerEnter)
- 5.Assign objects to layers and configure the Layer Collision Matrix (Project Settings → Physics) to reduce unnecessary physics tests
- 6.Verify behavior with the Physics Debugger (Window → Analysis → Physics Debugger) and raise Collision Detection mode if fast objects tunnel through walls
Use cases
- Character controller that accelerates with forces in FixedUpdate and clamps horizontal speed while preserving gravity
- Pickup system using trigger colliders to detect when the player enters an area and collect items
- Ground detection for jump mechanics using a downward raycast filtered to a ground layer
- Moving platform that uses MovePosition to interpolate kinematic movement while carrying resting bodies
- Bullet or fast-moving projectile that uses Continuous Collision Detection to avoid passing through walls
- Game programmers implementing character movement and platformer mechanics
- Physics-heavy game designers tuning collision behavior and layer interactions
- Developers migrating from older Unity versions (linearVelocity replaces deprecated velocity)
- Level designers setting up collision layers and debugging physics interactions
unity-physics FAQ
In Unity 6.3 LTS, Rigidbody.velocity is deprecated and replaced by Rigidbody.linearVelocity. Code from older tutorials using velocity will warn or fail to compile; always use linearVelocity in 6.3 LTS.
CharacterController.Move bypasses the Rigidbody system entirely and reports hits via OnControllerColliderHit instead. Do not add a Rigidbody to a CharacterController—the two are mutually exclusive movement modes.
Raise the Rigidbody's Collision Detection from Discrete to Continuous (sweeps against static colliders), Continuous Dynamic (also sweeps against other dynamic bodies), or Continuous Speculative (works against everything). For bullets, consider raycasting along the trajectory instead.
Trigger callbacks require a Rigidbody on at least one of the two colliders, and both colliders must be enabled. Two static triggers will never report overlaps.
Always apply forces, velocity changes, and MovePosition calls in FixedUpdate. Read input in Update and store intent, then apply physics in FixedUpdate to avoid frame-rate-dependent jitter.
Full instructions (SKILL.md)
Source of truth, from gamedev-skills/awesome-gamedev-agent-skills.
name: unity-physics description: > Set up 3D physics in Unity 6.3 LTS: 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.
Unity Physics (Rigidbody / PhysX)
Make objects move, collide, and detect each other with Unity 6.3 LTS's built-in 3D physics
(PhysX). Get the FixedUpdate discipline, trigger-vs-collision rules, and collision layers
right. Targets Unity 6.3 LTS (6000.3).
Unity 6.3 LTS rename:
Rigidbody.velocityis nowRigidbody.linearVelocity(the old name is deprecated). Code copied from older tutorials will warn or fail to compile.
When to use
- Use when giving an object physical motion (forces, velocity, gravity), responding to collisions or triggers, setting up collision layers/masks, raycasting for ground checks or line-of-sight, or connecting bodies with joints.
- Use when scenes/prefabs contain
Rigidbody+Collidercomponents.
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.
Core workflow
- Add a
Rigidbodyto anything that should be simulated; add aColliderto anything that should be hit. A collision needs aCollideron both, and at least oneRigidbody. - Do all physics in
FixedUpdate. Read input inUpdate, store intent, then apply forces / setlinearVelocity/ callMovePositioninFixedUpdate. - Move bodies through the physics API, not the Transform. Use
AddForce,linearVelocity, orMovePosition— never assigntransform.positionto a non-kinematic Rigidbody (it teleports and breaks collision resolution). - Pick collision vs trigger. A solid collision blocks and calls
OnCollisionEnter; aColliderwithIs Triggerchecked passes through and callsOnTriggerEnter. - Organise interactions with layers. Put objects on layers and edit the Layer Collision Matrix (Project Settings → Physics) so unrelated things don't test against each other.
- Verify with the Physics Debugger (Window → Analysis → Physics Debugger) and by watching for jitter; if fast objects pass through walls, raise Collision Detection mode.
Patterns
1. Force-based movement in FixedUpdate (with a speed clamp)
using 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.3 LTS: 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).
2. Collision vs trigger callbacks
// 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);
}
3. Ground check with a layer-masked raycast
[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);
}
4. Kinematic platform that still pushes bodies
// 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));
Pitfalls
Rigidbody.velocitydoesn't exist in Unity 6.3 LTS — uselinearVelocity(andangularVelocityis unchanged).- Setting
transform.positionon a dynamic Rigidbody — teleports it, skips collision. UseMovePosition(kinematic/interpolated) or apply forces. If you do write the transform, physics queries (Raycast,OverlapSphere) see the old position until the next physics step — callPhysics.SyncTransforms()once before a same-frame query, never every frame. OnCollisionEnternever fires on aCharacterController—CharacterController.Movebypasses the Rigidbody system; it reports hits viaOnControllerColliderHit(ControllerColliderHit)instead. Don't add a Rigidbody to "fix" it — the two are mutually exclusive movement modes.Physics.Raycastignores triggers by default — a ray won't report a trigger collider unless you passQueryTriggerInteraction.Collide(or flip the globalPhysics.queriesHitTriggers/ Project Settings → Physics → Queries Hit Triggers). It also returnsfalsewhen the ray origin starts inside the target collider.- A resting Rigidbody stays put after you move or disable what it rests on — below the
Sleep Threshold a body goes to sleep. Collisions and
AddForcewake it automatically, but moving a static collider (no Rigidbody) via its Transform may not, so the crate hangs in mid-air when the floor slides away. CallRigidbody.WakeUp()on the affected bodies. - Applying forces in
Update— frame-rate-dependent and jittery. Physics goes inFixedUpdate. - Trigger callbacks never fire — triggers need a
Rigidbodyon at least one of the two colliders, and both colliders enabled; two static triggers don't report overlaps. - Fast objects pass through walls (tunnelling) — raise the Rigidbody's Collision Detection
from
Discrete. NoteContinuoussweeps against static colliders only (it falls back to Discrete against other dynamic bodies);Continuous Dynamicalso sweeps against other continuous dynamic bodies;Continuous Speculativeworks against everything and is cheaper. For bullets, also consider aSphereCast/Raycastalong the trajectory instead of a collider. - Non-uniform-scaled
MeshColliders or scaled colliders misbehave; prefer primitive colliders and keep scale uniform. - A concave
MeshCollideron a moving body — Mesh colliders are concave by default, and concave ones can only be static or kinematic; two concave colliders never collide at all. For a dynamic Rigidbody enable Convex on the MeshCollider, or build a compound collider from primitives. - Everything collides with everything — wasted cost; assign layers and prune the Layer Collision Matrix.
References
- For raycast variants (
SphereCast,RaycastAll,OverlapSphere,LayerMaskbit math) and joints (FixedJoint,HingeJoint,ConfigurableJoint, breakable joints), readreferences/raycasting-and-joints.md. - Primary docs: Unity Manual "Physics" section and
ScriptReference/Rigidbody,ScriptReference/Physics.Raycast. For the added gotchas:ScriptReference/CollisionDetectionMode,ScriptReference/Physics-queriesHitTriggers,ScriptReference/MonoBehaviour.OnControllerColliderHit,ScriptReference/Physics.SyncTransforms,ScriptReference/Rigidbody.WakeUp, and the Manual pages "Introduction to rigid body physics" (sleeping) and "Introduction to Mesh colliders" (concave vs convex).
Related skills
physics-tuning— engine-agnostic feel: fixed timestep, mass/drag, CCD, stability.unity-csharp-scripting— theFixedUpdate/Updatesplit these patterns rely on.unity-navmesh— agent movement that is not force-driven.
Related skills
More from gamedev-skills/awesome-gamedev-agent-skills and the wider catalog.

unity-scriptableobjects
Design data-driven Unity systems with ScriptableObject assets for config, events, and registries without singletons.

unity-tilemap-2d
Build and script 2D tilemaps in Unity 6.3 LTS with Grid, Tilemap, colliders, and rule tiles.

unreal-behavior-trees
Build NPC AI in Unreal Engine 5 with Behavior Trees, Blackboards, and AIControllers.

unreal-blueprints
Build Unreal Engine 5 gameplay with Blueprint visual scripting—events, variables, and decoupled communication.

unreal-cpp-gameplay
Write Unreal Engine 5 C++ gameplay classes with reflection macros, Gameplay Framework, and module dependencies.

unreal-enhanced-input
Set up player input in Unreal Engine 5 with Enhanced Input system: Input Actions, Mapping Contexts, modifiers, and triggers.