Skip to content

第04回 物理と衝突判定

前回: 第03回 Prefabとインスタンス / 次回: 第05回 GUIの実装

前回の振り返り

Prefab を使って Game Object を再利用する 考え方に触れました

  • Scene 上の GameObject を Prefab として保存しました
  • Prefab から Instance を複数配置しました
  • Instance 側の変更が Override として扱われることを確認しました
  • Project 内を整理しながら、再利用しやすい制作手順を扱いました
  • 今回は、置いたオブジェクトに物理挙動と当たり判定を加えます

今回の目的

物理挙動と衝突判定の入口を扱う

  • Rigidbody の役割を説明できるようにする
  • Collider の役割を説明できるようにする
  • 物理で動くオブジェクトと、判定だけを持つオブジェクトを区別する
  • 簡単な落下、接触、反発を Unity 上で確認する

今回の授業内容

物理と衝突判定

  • Rigidbody の役割に触れる
  • Collider の役割に触れる
  • 実習1: Cube を落下させる
  • 通常の衝突と Is Trigger の違いに触れる
  • 実習2: ぶつかり方を調整する
  • 衝突イベントでログを出す

物理と衝突判定入門

物理法則に従って 物体を自然に動かす方法

全部コードで 動かしてられるか

剛体物理シミュレーション

形が変わらない物体として動きを計算する

  • ゲームエンジンの多くは物理エンジンを搭載しており 物体の速度、衝突、反発などを計算でシミュレーションできます
  • 現実の物体は衝突の際に変形しますが、変形すると重心も変わってしまいます 重心が変化すると回転の計算も複雑になるため、ゲームでは簡略化して、 物理オブジェクトを変形しない 剛体 として扱います
  • 剛体物理シミュレーションでは、物体の位置や回転を物理法則に従って計算します 制限はありますが、物理オブジェクトの自然な動きを簡単に実現できます

Rigidbody コンポーネント

物理演算で動かすためのコンポーネント

  • Rigidbody は剛体の意味です
  • Rigidbody を追加すると、重力や力の影響を受けられます
  • Use Gravity が有効なら、再生時に下へ落ちます
  • Mass は重さを表します
  • Constraints を使うと、動きや回転を制限できます
  • 物理で動かしたいオブジェクトには Rigidbody を追加します

Collider コンポーネント

形に当たり判定を持たせるコンポーネント

  • Box Collider

  • Sphere Collider

  • Capsule Collider

  • Mesh Collider

  • Collider は、ぶつかる範囲を表します

  • 見た目の形と当たり判定の形は、必ずしも同じではありません

  • 床や壁にも Collider が必要です

動くものと受け止めるもの

Rigidbody と Collider の組み合わせで考える

  • 落ちる Cube RigidbodyBox Collider

  • Box Collider

  • Box Collider

  • 判定だけ使うエリア ColliderIs Trigger

  • 何を動かしたいのか、何で受け止めたいのかを分けて考えます

実習1: Cube を落下させる

重力で動く状態を作る

  1. Plane を置いて床にする
  2. Cube を床より上に置く
  3. Cube に Rigidbody を追加する
  4. 再生して落下することを確認する
  5. Cube と床の Collider を Inspector で確認する
  • 落ち続ける場合は、床に Collider があるかを確認します

Is Trigger

ぶつからずに通過を検出する設定

  • 物理エンジンは最適化されていて高速に動作するため、 命中判定を扱うのにも便利です
  • 通常の Collider は、物理的に衝突しますが Is Trigger を有効にすると、通過するだけで物理的な衝突は起きなくなります
  • 衝突は起きませんが、物体が Trigger に入ったことはイベントで検出できます ゴール判定、アイテム取得、危険エリア侵入などの検知に向いています
  • 物理的に押し返したい場合は、Trigger ではなく通常の Collider を使います

物理マテリアル

摩擦や反発を調整するための設定

  • 摩擦を下げると滑りやすくなります
  • 反発を上げると跳ね返りやすくなります
  • 床やボールのように、ぶつかり方を変えたいときに使います
  • 今回は細かい数値よりも、設定を変えると動きが変わることを確認します

実習2: ぶつかり方を調整する

Collider と物理設定を試す

  1. Cube の Mass を変更する
  2. Constraints で回転を止める
  3. 床に物理マテリアルを設定する
  4. 摩擦や反発を変えて挙動を確認する
  • 変更した設定と、実際の動きの違いをメモします

衝突イベント

ぶつかった瞬間に関数が呼び出される

cs
using UnityEngine;

public class HitLogger : MonoBehaviour
{
    void OnCollisionEnter(Collision collision)
    {
        Debug.Log("Hit: " + collision.gameObject.name);
    }
}
  • OnCollisionEnter は、通常の Collider 同士が 接触したときに自動で呼ばれます 今回は、ログで接触のタイミングを確認します
  • 接触を得るためには、Collider 同士の どちらかに Rigidbody が必要です 注意してください

Trigger イベント

進入した瞬間に関数が呼び出される

cs
using UnityEngine;

public class TriggerLogger : MonoBehaviour
{
    void OnTriggerEnter(Collider other)
    {
        Debug.Log("Trigger: " + other.gameObject.name);
    }
}
  • OnTriggerEnter は、Is Trigger が設定された Collider へ他の Collider が入ったときに 自動で呼ばれます
  • ゴールやアイテム取得の処理などで使われます
  • 今回は、Collider が進入したことを ログで確認しています

実習3: 接触したらログを出す

判定が起きた瞬間を確認する

  1. Cube に HitLogger を追加する
  2. 床や壁にぶつかったときのログを確認する
  3. Trigger 用のエリアを作る
  4. TriggerLogger を追加する
  5. 通過時のログを確認する
  • ログが出ない場合は、Rigidbody と Collider の組み合わせを確認します

よくあるつまずき

物理や判定が動かないとき

  • Rigidbody を付け忘れている
  • Collider を付け忘れている
  • Collider のサイズが見た目と合っていない
  • Trigger にしたため、物理的にぶつからなくなっている
  • Script を GameObject にアタッチしていない

今回のまとめ

今日のポイント

  • Rigidbody は、物理演算で動くための Component です
  • Collider は、ぶつかる範囲や通過判定を持つ Component です
  • 通常の衝突と Trigger は、目的に応じて使い分けます
  • 次回は GUI を扱い、画面上に情報を表示します

おつかれさまでした!

次回予告 第05回 GUI の実装

文字が出ないと ゲームにならない