Unityで親子オブジェクトの当たり判定を管理する方法(初学者向け)
public delegate void CollisionDetectedHandler(GameObject collidedObject, GameObject sourceObject); および public event CollisionDetectedHandler OnCollisionDetected; は、C#で独自のデリゲート型とイベントを定義して、オブジェクト同士の当たり判定を処理する仕組みを作るためのコードです。
1. デリゲート ( delegate ) とはデリゲートは、C#でメソッドを参照するための型を定義するものです。簡単に言えば、「メソッドへの参照」を保持できる型です。 delegate void CollisionDetectedHandler(GameObject collidedObject, GameObject sourceObject); では、次の内容が含まれています:
- void : メソッドが何も値を返さない(戻り値なし)。
- GameObject collidedObject : メソッドが呼び出されるときに、衝突したオブジェクトの情報( GameObject 型)を受け取ります。
- GameObject sourceObject : 衝突元のオブジェクト( GameObject 型)を受け取ります。
このデリゲート型は、当たり判定に関連するメソッドがどういった引数( GameObject 型のオブジェクト2つ)を受け取り、何も値を返さないという構造を定義しています。
例: void OnCollision(GameObject collidedObject, GameObject sourceObject)この OnCollision メソッドは、 CollisionDetectedHandler デリゲート型と互換性があり、引数に GameObject を2つ取り、戻り値を返しません。
2. イベント ( event ) とはイベントは、ある条件が発生したときに通知する仕組みです。イベントはデリゲートと組み合わせて使われます。 event キーワードを使うことで、特定のデリゲート型を持つイベントを定義します。
public event CollisionDetectedHandler OnCollisionDetected; では、次のことを実現しています:
- OnCollisionDetected というイベントを宣言。
- OnCollisionDetected イベントは、 CollisionDetectedHandler デリゲート型のメソッドを持つことができ、外部のオブジェクトがそのイベントにメソッドを登録できる。
- イベントが発生すると、登録されたメソッドが順番に呼び出されます。
OnCollisionDetected イベントは、通常、衝突が発生したときに発火(通知)されます。この例では、 OnCollisionEnter や OnTriggerEnter で衝突が検知されたときに、登録されたメソッドを呼び出す形になります。
private void OnCollisionEnter(Collision collision) < // イベントが誰かに登録されている場合、そのメソッドを呼び出す if (OnCollisionDetected != null) < OnCollisionDetected.Invoke(collision.gameObject, this.gameObject); >> イベントの登録 void Start() < // 子オブジェクトのイベントにメソッドを登録 childObject.GetComponent().OnCollisionDetected += OnCollision; > // 子オブジェクトの衝突を処理するメソッド void OnCollision(GameObject collidedObject, GameObject sourceObject) 4. まとめ- デリゲート ( delegate ) はメソッドのシグネチャ(引数や戻り値の型)を定義するものです。この場合、 GameObject 型の2つの引数を持ち、 void を返すメソッドを参照するために使用されます。
- イベント ( event ) は、特定のタイミング(この場合は衝突)で通知を行い、複数のメソッドを登録して実行するための仕組みです。
- OnCollisionDetected イベントを使うことで、他のオブジェクトが衝突時に何かの処理を行うようにすることができます。
4. 設定手順
- 親オブジェクトに ParentCollisionHandler スクリプトをアタッチします。
- インスペクタで、 childObject1 と childObject2 に子オブジェクトをドラッグして設定します。
- 各子オブジェクトに BoxCollider と Rigidbody を追加します。
5. どうしてこうするの?
- 親オブジェクトがまとめて管理できる: 子オブジェクトの当たり判定がいくつもある場合でも、親がそれらをまとめて管理できるので、スクリプトがシンプルになります。
- イベントを使う: CollisionNotifier を使って、子オブジェクトが当たり判定を通知し、それを親が受け取ります。これにより、効率的に衝突処理を実現できます。
まとめ
訪問数 350 回, 今日の訪問数 1回 【Winform】中級:JSON ベースのタスク管理アプリの作成 Unity製ゲーム一覧 Unity技術資料:電気工事従事者向け簡易回路接続シミュレーションよろしければシェアお願いします
C#におけるDelegateの最新リファクタリング手法 Next Unityにおける親オブジェクトでの子オブジェクトの当たり判定の管理方法 Prev関連記事
【Unity】Git管理の詳細 Bone(ボーン)とRenderer(レンダラー)の基礎解説1. はじめに Unityで3Dキャラクターを扱う際、Bone(ボーン)とRen .
【Unity】隠れた相手が現れたら見つける コルーチンをより使いやすく 【学習】入力の取得(キー入力、マウス入力)これまでの学習では、 スクリプトで Start と Update を書いた In .
ディスカッション
コメント一覧 コメントをどうぞ コメントをキャンセルこのサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。
この記事のトラックバックURL カテゴリー 新着Unity の学習初期では、C# の理解を優先して次のようなコードを書くことがあ .
これまでの学習では、 Unity エディタの画面構成を学んだ GameObjec .
履歴 アクセスの多い記事- ClickOnceでの配布時に発生するセキュリティエラーを回避する方法
- C#のソースコードからクラス図を作成(VisualStudio2022)
- C# プロジェクトファイル (.csproj) の構成と編集、GitHub Desktop での変更保存方法
- Visual StudioにおけるDebugビルドとReleaseビルドの違い
- 1つのソリューションに複数のプロジェクトを作成(VisualStudio 2022)
Copyright © 2026 ソフトライム All Rights Reserved.
WordPress Luxeritas Theme is provided by "Thought is free".