UE4: 柄の付いた道具の当たり判定
1. 導入
例として「つるはし」の当たり判定を考えてみる。
岩につるはしが当たって効果がある部分は"柄"(一般に木製の棒; stick)ではなく、その先に装着した"頭"(一般に鋼鉄製; head)の部分だけ。便宜上のゲーム表現では柄は当たり判定なし、頭だけ当たり判定ありで、「キャラクターがつるはしを振るうアクション」を行うとそんな当たり判定のつるはしオブジェクトがプレイヤーに合わせて出現するような実装をしたい場合がままあります。
リアリティーを求める場合は柄の当たり判定も実装して力のかかり具合と材質から柄がダメージを受け破壊されてしまう要求もあるかもしれませんが、今回はそこまでせず、古典的なアクションゲームにありがちな便宜上の当たり判定の実装をしたい事にします。
2. 前提となる状態
- つるはしの見た目のメッシュデータ Tsuruhashi を UE4 でインポートできている
- Tsuruhashi をメッシュとして設定した StaticMeshActor の Tsuruhashi_Blueprint を配置できている
例示の簡単のためモデルデータをレベルエディターへドラッグアンドドロップすれば生成される状態で紹介します。 C++ コードで実装する場合、実行中に動的にオブジェクトを生成する場合も本質的には同様です。
3. つるはしの頭の部分にだけ当たり判定を付ける
- Tsuruhashi_Blueprint オブジェクトの RootComponent の StaticMeshComponent に
+Add Component
で Cube を追加する - 追加した Cube の Tsuruhashi_Blueprint オブジェクト内での Location と Scale を適当に設定して当たり判定としたい空間を占めるように設定する
- 追加した Cube のプロパティー Collision の
Generate Overlap Events
が ON になっている事を確認(デフォルトでON)Collision Presets
をOverlapAllDynamics
に設定
- Tsuruhashi_Blueprint オブジェクトの RootComponent の StaticMeshComponent のプロパティー Collision の
Generate Overlap Events
を OFF に設定Collision Presets
をNoCollision
に設定
- Tsuruhashi_Blueprint オブジェクトを
Edit Blueprint
して Event Graph にEvent ActorBeginOverlap
に当たり判定に伴う処理を実装する- note: 動作確認目的では
Event ActorBeginOverlap
のOther Actor
からGet Object Name
してPrint String
すれば十分
- note: 動作確認目的では
- 動作確認が済んだら Cube のプロパティー Rendering の
Visible
を OFF に設定
以上のように当たり判定用に Cube あるいは必要に応じて Sphere や Cone などをコンポーネントとして追加して組み立てると一部分に当たり判定を持つ「つるはし」のような道具の実装は簡単にできる。
4. 応用
- プレイ中の視認によるデバッグ目的や、エンドユーザーへ当たり判定の表示機能を提供したい場合は §3 で追加した Cube の
Visible
を適当なトリガーで ON/OFF できるようにし、マテリアルも当たり判定の可視化用に適当な半透明の黄色ベタなどを設定するとよい。 - 当たり判定の可視化が UE4Editor の開発環境の表示機能だけで十分でメッシュとマテリアルによる表示が不要な場合は StaticMeshComponent の Cube や Sphere ではなく
Box Collision
やSphere Collision
やCapsule Collision
をコンポーネントとして追加するとよい。- note: C++ コードの場合は
UBoxComponent
やUSphereComponent
やUCapsuleComponent
を ctor 等で生成してSetupAttachment
する。
- note: C++ コードの場合は
- アクター単位でなくコンポーネント単位で当たり判定を行いたい場合は Event Graph で
Event ActorBeginOverlap
を定義せずにBind Event to OnComponentBeginOverlap
を定義し、そのTarget
にCube
コンポーネントを与え、Event
へOnComponenBeginOverlap_Cube
などお好みのユーザー定義イベントを束縛させるとよい。- note: C++ コードの場合は
OnComponentBeginOverlap.AddDynamic
で実装する。
- note: C++ コードの場合は
5. 参考
- UShapeComponent | Unreal Engine API Reference
- Unreal Engine | イベント
- Event ActorBeginOverlap | Unreal Engine Blueprint API Reference
- Unreal Engine | 5.オーバーラップしているアクタをテストする
- OnComponentBeginOverlap | Unreal Engine API Reference
- Unreal Engine | 動的デリゲート
- UE4: C++ クラスで実装したアクターのコンポーネントの OnComponentBeginOverlap.AddDynamic 等がうまく動作しない時に確認すること - C++ ときどき ごはん、わりとてぃーぶれいく☆