本文へ移動
cccskills
無料GitHub で公開

unity-physics

Unity 6 physics development guide. Use when working with Rigidbody, colliders, raycasting, triggers, collisions, joints, or physics simulation. Covers PhysX 5 (3D) and Box2D (2D) physics, FixedUpdate timing, layer masks, and contact data. Based on Unity 6.3 LTS documentation.

インストール方法を見る

含まれるファイル(4)

  • SKILL.md17.4 KB
  • references/character-controller.md5.5 KB
  • references/physics2d-api.md14.8 KB
  • references/physics3d-api.md17.8 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Unity Physics

Physics System Overview

Unity provides different physics engine integrations for different project needs:

  • 3D Physics (PhysX): Nvidia PhysX engine integration for 3D object-oriented projects
  • 2D Physics (Box2D): Optimized 2D physics system with dedicated components
  • Both systems simulate gravity, collisions, forces, and constraints

Physics Timing

Physics runs on a fixed timestep via FixedUpdate, separate from the rendering frame rate:

void FixedUpdate()
{
    // All physics code belongs here, not in Update()
    rb.AddForce(Vector3.forward * speed);
}

Key timing rules:

  • FixedUpdate runs at a fixed interval (default 0.02s / 50Hz)
  • Multiple FixedUpdate calls can occur per frame, or none
  • Time.fixedDeltaTime controls the interval
  • Use Update for input, FixedUpdate for physics forces

Simulation Modes

Physics.simulationMode controls when the physics engine steps:

  • FixedUpdate (default): Automatic simulation each fixed timestep
  • Update: Simulate once per frame
  • Script: Manual control via Physics.Simulate()

Rigidbody Configuration

A Rigidbody component places a GameObject under physics engine control. A rigid body does not deform or change shape under physics forces.

Key Properties

PropertyDescriptionDefault
massMass in kg; affects force interactions1
linearDampingResistance to linear velocity0
angularDampingResistance to angular velocity0.05
useGravityWhether gravity affects this bodytrue
isKinematicIf true, not driven by physics forcesfalse
interpolationSmooths visual jitter between physics stepsNone
collisionDetectionModeAlgorithm for detecting collisionsDiscrete

Movement Methods

Rigidbody rb = GetComponent<Rigidbody>();

// Apply continuous force (call in FixedUpdate)
rb.AddForce(Vector3.forward * 10f);
rb.AddForce(Vector3.up * 5f, ForceMode.Impulse);

// Apply torque
rb.AddTorque(Vector3.up * 2f);

// Apply force at a world position (creates both force and torque)
rb.AddForceAtPosition(Vector3.forward * 10f, hitPoint);

// Kinematic movement (use for isKinematic=true bodies)
rb.MovePosition(rb.position + direction * speed * Time.fixedDeltaTime);
rb.MoveRotation(targetRotation);

ForceMode Options

ModeDescription
ForceMode.ForceContinuous force, uses mass (default)
ForceMode.AccelerationContinuous force, ignores mass
ForceMode.ImpulseInstant force, uses mass
ForceMode.VelocityChangeInstant force, ignores mass

Sleep State

When a Rigidbody's energy falls below the sleep threshold, the physics engine stops calculating it. Control manually with rb.Sleep() and rb.WakeUp().

Scale Warning

Unity assumes 1 world unit = 1 metre. Incorrect scale causes unrealistic physics behavior. Keep GameObjects at realistic proportions.


Colliders and Triggers

Colliders are invisible shapes that define a GameObject's physical boundaries. They do not need to match the visual mesh.

Collider Categories

CategoryDescription
Static ColliderCollider only, no Rigidbody. For immovable geometry (walls, floors).
Dynamic Rigidbody ColliderCollider + Rigidbody (isKinematic=false). Fully simulated.
Kinematic Rigidbody ColliderCollider + Rigidbody (isKinematic=true). Moved via script.

Collider Shapes

  • Primitive: BoxCollider, SphereCollider, CapsuleCollider -- efficient, auto-scale
  • Compound: Multiple primitives on child GameObjects for complex shapes
  • MeshCollider: Matches exact mesh geometry; expensive, use sparingly
  • WheelCollider: Raycast-based, built-in vehicle physics
  • TerrainCollider: Matches terrain heightmap

Trigger Colliders

Triggers detect overlapping colliders without physical collision response:

// Set via Inspector: Collider > Is Trigger = true
// Or via script:
GetComponent<BoxCollider>().isTrigger = true;

Requirements for trigger events:

  • At least one GameObject must have a Rigidbody
  • The collider must have isTrigger enabled
  • Each overlapping pair needs its own Rigidbody for individual detection

Physics Materials

Colliders support PhysicsMaterial with adjustable friction and bounciness properties for surface interactions.


Raycasting

Raycasting projects invisible rays to detect colliders in the scene.

Physics.Raycast

// Basic: check if anything is ahead
Vector3 fwd = transform.TransformDirection(Vector3.forward);
if (Physics.Raycast(transform.position, fwd, 10))
    Debug.Log("Something ahead!");

// With hit info
RaycastHit hit;
if (Physics.Raycast(transform.position, -Vector3.up, out hit, 100.0f))
    Debug.Log("Distance to ground: " + hit.distance);

// With layer mask
int layerMask = 1 << LayerMask.NameToLayer("Enemies");
if (Physics.Raycast(origin, direction, out hit, maxDist, layerMask))
    Debug.Log("Hit enemy: " + hit.collider.gameObject.name);

// Mouse-to-world raycast
Ray ray = Camera.main.ScreenPointToRay(Mouse.current.position.ReadValue());
if (Physics.Raycast(ray, out hit, 100))
    Debug.DrawLine(ray.origin, hit.point);

RaycastHit Properties

PropertyTypeDescription
pointVector3World-space hit position
normalVector3Surface normal at hit point
distancefloatDistance from ray origin
colliderColliderCollider that was hit
transformTransformTransform of the hit object

Other Cast Methods

MethodDescription
Physics.RaycastAll()Returns all intersections along the ray
Physics.RaycastNonAlloc()Fills a pre-allocated buffer (no GC alloc)
Physics.SphereCast()Sweeps a sphere along a direction
Physics.BoxCast()Sweeps a box along a direction
Physics.CapsuleCast()Sweeps a capsule along a direction
Physics.Linecast()Checks for colliders between two points

Overlap Queries (no direction, area check)

MethodDescription
Physics.OverlapSphere()Find all colliders within a sphere
Physics.OverlapBox()Find all colliders within a box
Physics.OverlapCapsule()Find all colliders within a capsule
Physics.CheckSphere()Returns true if any collider overlaps the sphere
Physics.CheckBox()Returns true if any collider overlaps the box
Physics.CheckCapsule()Returns true if any collider overlaps the capsule

QueryTriggerInteraction

Controls whether casts/overlaps detect trigger colliders:

  • QueryTriggerInteraction.UseGlobal -- uses Physics.queriesHitTriggers
  • QueryTriggerInteraction.Collide -- always detect triggers
  • QueryTriggerInteraction.Ignore -- never detect triggers

Collision Detection

Collision Detection Modes

ModeDescriptionUse Case
DiscreteChecks collisions at end of each physics step. High efficiency.Default for most objects
ContinuousChecks collisions over the entire step. Prevents tunneling.Fast objects hitting static geometry
Continuous DynamicContinuous detection against both static and dynamic collidersFast objects hitting other fast objects
Continuous SpeculativePredictive CCD using speculative contactsKinematic bodies, general CCD

Collision Callbacks

void OnCollisionEnter(Collision other) {  // First frame of contact
    if (other.gameObject.CompareTag("Player"))
        Debug.Log("Player hit this object");
}
void OnCollisionStay(Collision other) { }  // Every physics frame while touching
void OnCollisionExit(Collision other) { }  // Contact ended

Trigger Callbacks

void OnTriggerEnter(Collider other) {  // Entered trigger volume
    if (other.CompareTag("Player"))
        Debug.Log("Player entered trigger zone");
}
void OnTriggerStay(Collider other) {   // Each frame inside trigger
    other.attachedRigidbody?.AddForce(Vector3.up * 12f, ForceMode.Acceleration);
}
void OnTriggerExit(Collider other) { } // Left trigger volume

Collision Matrix

PairCollision EventsTrigger Events
Static + DynamicYes--
Static + KinematicNo--
Static + StaticNo--
Dynamic + DynamicYes--
Dynamic + KinematicYes--
Kinematic + KinematicNo--
Trigger + Dynamic/Kinematic--Yes
Static Trigger + Dynamic/Kinematic--Yes

At least one dynamic (non-kinematic) Rigidbody is required for collision events. The physics engine only applies forces to GameObjects with Rigidbody or ArticulationBody components.


Joints

Joints connect Rigidbody components together or to fixed points in space.

Joint TypeDescriptionUse Case
FixedJointLocks two bodies together (implemented as a spring)Attaching objects, breakable connections
HingeJointRotation around a single axisDoors, pendulums, chains
SpringJointElastic connection maintaining distanceBungees, tethers
CharacterJointBall-and-socket with constrained anglesRagdolls (hips, shoulders)
ConfigurableJointFully customizable constraintsAny specialized connection

Joint Properties

  • Connected Body: The other Rigidbody (null = fixed to world)
  • Anchor / Connected Anchor: Local-space attachment points
  • Break Force / Break Torque: Threshold to destroy the joint
  • Enable Preprocessing: Stabilizes the joint simulation

For industrial/robotics applications requiring precise articulation, use ArticulationBody instead of regular joints.


2D Physics Differences

Unity's 2D physics uses a separate engine optimized for 2D workflows.

Aspect3D2D
EnginePhysXBox2D
RigidbodyRigidbodyRigidbody2D
ColliderColliderCollider2D
Physics classPhysicsPhysics2D
VectorsVector3Vector2
RotationQuaternion (3-axis)float (Z-axis only)
GravityVector3Vector2
ForceModeForceModeForceMode2D

Rigidbody2D Body Types

TypeDescription
DynamicFully simulated, responds to forces and gravity
KinematicMoved via script, detects collisions but not affected by forces
StaticImmovable, for level geometry

2D Collider Types

BoxCollider2D, CircleCollider2D, CapsuleCollider2D, PolygonCollider2D, EdgeCollider2D, CompositeCollider2D, TilemapCollider2D

2D-Specific Features

  • Effectors 2D: Area, Buoyancy, Platform, Point, Surface effectors for force interactions
  • Constant Force 2D: Applies persistent force/torque
  • Physics Material 2D: Friction and bounce properties
  • LowLevelPhysics2D API: Independent low-level physics pathway

See reference file references/physics2d-api.md for full 2D API details.


Common Patterns

Player Movement with Rigidbody

public class PlayerMovement : MonoBehaviour
{
    public float moveSpeed = 5f;
    public float jumpForce = 7f;

    private Rigidbody rb;
    private bool jumpRequested;

    void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Update()
    {
        // Capture input in Update (legacy Input Manager; see unity-input for new Input System)
        if (Input.GetButtonDown("Jump"))
            jumpRequested = true;
    }

    void FixedUpdate()
    {
        // Apply physics in FixedUpdate (legacy Input; see unity-input)
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");
        Vector3 move = new Vector3(h, 0f, v) * moveSpeed;
        rb.linearVelocity = new Vector3(move.x, rb.linearVelocity.y, move.z);

        if (jumpRequested)
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
            jumpRequested = false;
        }
    }
}

Ground Check with SphereCast

// Cache collider reference in Awake() -- avoid GetComponent in hot paths
private CapsuleCollider capsule;
void Awake() => capsule = GetComponent<CapsuleCollider>();

public bool IsGrounded()
{
    float radius = 0.3f;
    return Physics.SphereCast(transform.position, radius, Vector3.down,
        out _, (capsule.height / 2f) - radius + 0.1f,
        LayerMask.GetMask("Ground"));
}

Hover Pad with Trigger

public class HoverPad : MonoBehaviour
{
    public float hoverForce = 12f;

    void OnTriggerStay(Collider other)
    {
        if (other.attachedRigidbody != null)
            other.attachedRigidbody.AddForce(Vector3.up * hoverForce, ForceMode.Acceleration);
    }
}

Non-Allocating Raycast (Zero GC)

private readonly RaycastHit[] hits = new RaycastHit[10];

void DetectEnemies()
{
    int count = Physics.RaycastNonAlloc(transform.position, transform.forward,
        hits, 50f, LayerMask.GetMask("Enemies"));
    for (int i = 0; i < count; i++)
        Debug.Log("Hit: " + hits[i].collider.name);
}

Anti-Patterns

Do NOT use Update for physics forces

// BAD: Forces applied at variable frame rate cause inconsistent behavior
void Update()
{
    rb.AddForce(Vector3.forward * 10f); // WRONG
}

// GOOD: Use FixedUpdate for physics
void FixedUpdate()
{
    rb.AddForce(Vector3.forward * 10f); // CORRECT
}

Do NOT move Rigidbody with Transform

// BAD: Bypasses physics, breaks collision detection
transform.position += Vector3.forward * speed * Time.deltaTime; // WRONG

// GOOD: Use Rigidbody methods
rb.MovePosition(rb.position + Vector3.forward * speed * Time.fixedDeltaTime); // CORRECT
// Or apply forces:
rb.AddForce(Vector3.forward * speed);

Do NOT use MeshCollider when primitives suffice

MeshCollider on a simple box-shaped object is wasteful. Use BoxCollider instead -- much cheaper and equally accurate for simple shapes. Reserve MeshCollider for complex concave geometry.

Do NOT allocate in physics callbacks

// BAD: GC allocation every collision
void OnCollisionEnter(Collision other) {
    var enemies = GameObject.FindGameObjectsWithTag("Enemy"); // WRONG
}
// GOOD: Cache in Start(), reuse in callbacks

Do NOT ignore layer masks in raycasts

Physics.Raycast(origin, direction, out hit);                        // BAD: hits everything
Physics.Raycast(origin, direction, out hit, 100f,
    LayerMask.GetMask("Ground", "Obstacles"));                      // GOOD: filtered

Key API Quick Reference

CategoryKey Members
Physics (static)Raycast, RaycastAll, RaycastNonAlloc, SphereCast, BoxCast, CapsuleCast, Linecast, OverlapSphere, OverlapBox, CheckSphere, CheckBox, ClosestPoint, ComputePenetration, Simulate, SyncTransforms
Physics propertiesgravity, defaultContactOffset, bounceThreshold, sleepThreshold, defaultSolverIterations, queriesHitTriggers, queriesHitBackfaces, simulationMode
Rigidbodymass, linearDamping, angularDamping, useGravity, isKinematic, linearVelocity, angularVelocity, interpolation, collisionDetectionMode, AddForce(), AddTorque(), MovePosition(), MoveRotation(), Sleep(), WakeUp()
CallbacksOnCollisionEnter(Collision), OnCollisionStay, OnCollisionExit, OnTriggerEnter(Collider), OnTriggerStay, OnTriggerExit

See references/physics3d-api.md for full method signatures, parameters, and overloads. See references/physics2d-api.md for the complete 2D physics API.


CharacterController

For non-physics-driven character movement (FPS controllers, NPCs), use CharacterController instead of Rigidbody. It handles slopes, steps, and collision sliding without physics simulation. See references/character-controller.md for full API, patterns, and CharacterController vs Rigidbody comparison.

Related Skills

  • unity-foundations -- GameObject hierarchy, components, transforms, layers
  • unity-scripting -- MonoBehaviour lifecycle (Update vs FixedUpdate), coroutines
  • unity-2d -- 2D game development patterns, sprite rendering

Additional Resources

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

adopt

無料

Brownfield onboarding — audits existing project artifacts for template format compliance (not just existence), classifies gaps by impact, and produces a numbered migration plan. Run this when joining an in-progress project or upgrading from an older template version. Distinct from /project-stage-detect (which checks what exists) — this checks whether what exists will actually work with the template's skills.

日本語の概要は準備中です。原文の説明を表示しています。

IdoCohen560/claude-unity-game-studio222026年7月8日 更新

Creates an Architecture Decision Record (ADR) documenting a significant technical decision, its context, alternatives considered, and consequences. Every major technical choice should have an ADR.

日本語の概要は準備中です。原文の説明を表示しています。

IdoCohen560/claude-unity-game-studio222026年7月8日 更新

Validates completeness and consistency of the project architecture against all GDDs. Builds a traceability matrix mapping every GDD technical requirement to ADRs, identifies coverage gaps, detects cross-ADR conflicts, verifies engine compatibility consistency across all decisions, and produces a PASS/CONCERNS/FAIL verdict. The architecture equivalent of /design-review.

日本語の概要は準備中です。原文の説明を表示しています。

IdoCohen560/claude-unity-game-studio222026年7月8日 更新

art-bible

無料

Guided, section-by-section Art Bible authoring. Creates the visual identity specification that gates all asset production. Run after /brainstorm is approved and before /map-systems or any GDD authoring begins.

日本語の概要は準備中です。原文の説明を表示しています。

IdoCohen560/claude-unity-game-studio222026年7月8日 更新

Audits game assets for compliance with naming conventions, file size budgets, format standards, and pipeline requirements. Identifies orphaned assets, missing references, and standard violations.

日本語の概要は準備中です。原文の説明を表示しています。

IdoCohen560/claude-unity-game-studio222026年7月8日 更新

Generate per-asset visual specifications and AI generation prompts from GDDs, level docs, or character profiles. Produces structured spec files and updates the master asset manifest. Run after art bible and GDD/level design are approved, before production begins.

日本語の概要は準備中です。原文の説明を表示しています。

IdoCohen560/claude-unity-game-studio222026年7月8日 更新

IdoCohen560 のスキルをすべて見る

このスキルの問題を報告する