Appearance
第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 ColliderSphere ColliderCapsule ColliderMesh ColliderCollider は、ぶつかる範囲を表します
見た目の形と当たり判定の形は、必ずしも同じではありません
床や壁にも Collider が必要です
動くものと受け止めるもの
Rigidbody と Collider の組み合わせで考える
落ちる Cube
RigidbodyとBox Collider床
Box Collider壁
Box Collider判定だけ使うエリア
ColliderとIs Trigger何を動かしたいのか、何で受け止めたいのかを分けて考えます
実習1: Cube を落下させる
重力で動く状態を作る
Planeを置いて床にするCubeを床より上に置く- Cube に
Rigidbodyを追加する - 再生して落下することを確認する
- Cube と床の Collider を Inspector で確認する
- 落ち続ける場合は、床に Collider があるかを確認します
Is Trigger
ぶつからずに通過を検出する設定
- 物理エンジンは最適化されていて高速に動作するため、 命中判定を扱うのにも便利です
- 通常の Collider は、物理的に衝突しますが
Is Triggerを有効にすると、通過するだけで物理的な衝突は起きなくなります - 衝突は起きませんが、物体が Trigger に入ったことはイベントで検出できます ゴール判定、アイテム取得、危険エリア侵入などの検知に向いています
- 物理的に押し返したい場合は、Trigger ではなく通常の Collider を使います
物理マテリアル
摩擦や反発を調整するための設定
- 摩擦を下げると滑りやすくなります
- 反発を上げると跳ね返りやすくなります
- 床やボールのように、ぶつかり方を変えたいときに使います
- 今回は細かい数値よりも、設定を変えると動きが変わることを確認します
実習2: ぶつかり方を調整する
Collider と物理設定を試す
- Cube の
Massを変更する Constraintsで回転を止める- 床に物理マテリアルを設定する
- 摩擦や反発を変えて挙動を確認する
- 変更した設定と、実際の動きの違いをメモします
衝突イベント
ぶつかった瞬間に関数が呼び出される
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: 接触したらログを出す
判定が起きた瞬間を確認する
- Cube に
HitLoggerを追加する - 床や壁にぶつかったときのログを確認する
- Trigger 用のエリアを作る
TriggerLoggerを追加する- 通過時のログを確認する
- ログが出ない場合は、Rigidbody と Collider の組み合わせを確認します
よくあるつまずき
物理や判定が動かないとき
- Rigidbody を付け忘れている
- Collider を付け忘れている
- Collider のサイズが見た目と合っていない
- Trigger にしたため、物理的にぶつからなくなっている
- Script を GameObject にアタッチしていない
今回のまとめ
今日のポイント
- Rigidbody は、物理演算で動くための Component です
- Collider は、ぶつかる範囲や通過判定を持つ Component です
- 通常の衝突と Trigger は、目的に応じて使い分けます
- 次回は GUI を扱い、画面上に情報を表示します