C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

UE4: 柄の付いた道具の当たり判定

1. 導入

例として「つるはし」の当たり判定を考えてみる。

f:id:USAGI-WRP:20171020041221p:plain

岩につるはしが当たって効果がある部分は"柄"(一般に木製の棒; stick)ではなく、その先に装着した"頭"(一般に鋼鉄製; head)の部分だけ。便宜上のゲーム表現では柄は当たり判定なし、頭だけ当たり判定ありで、「キャラクターがつるはしを振るうアクション」を行うとそんな当たり判定のつるはしオブジェクトがプレイヤーに合わせて出現するような実装をしたい場合がままあります。

リアリティーを求める場合は柄の当たり判定も実装して力のかかり具合と材質から柄がダメージを受け破壊されてしまう要求もあるかもしれませんが、今回はそこまでせず、古典的なアクションゲームにありがちな便宜上の当たり判定の実装をしたい事にします。

2. 前提となる状態

  1. つるはしの見た目のメッシュデータ Tsuruhashi を UE4 でインポートできている
  2. Tsuruhashi をメッシュとして設定した StaticMeshActor の Tsuruhashi_Blueprint を配置できている

例示の簡単のためモデルデータをレベルエディターへドラッグアンドドロップすれば生成される状態で紹介します。 C++ コードで実装する場合、実行中に動的にオブジェクトを生成する場合も本質的には同様です。

3. つるはしの頭の部分にだけ当たり判定を付ける

  1. Tsuruhashi_Blueprint オブジェクトの RootComponent の StaticMeshComponent に +Add Component で Cube を追加する
  2. 追加した Cube の Tsuruhashi_Blueprint オブジェクト内での Location と Scale を適当に設定して当たり判定としたい空間を占めるように設定する
  3. 追加した Cube のプロパティー Collision の
    1. Generate Overlap Events が ON になっている事を確認(デフォルトでON)
    2. Collision PresetsOverlapAllDynamics に設定
  4. Tsuruhashi_Blueprint オブジェクトの RootComponent の StaticMeshComponent のプロパティー Collision の
    1. Generate Overlap Events を OFF に設定
    2. Collision PresetsNoCollision に設定
  5. Tsuruhashi_Blueprint オブジェクトを Edit Blueprint して Event Graph に Event ActorBeginOverlap に当たり判定に伴う処理を実装する
    • note: 動作確認目的では Event ActorBeginOverlapOther Actor から Get Object Name して Print String すれば十分
  6. 動作確認が済んだら Cube のプロパティー Rendering の Visible を OFF に設定

以上のように当たり判定用に Cube あるいは必要に応じて Sphere や Cone などをコンポーネントとして追加して組み立てると一部分に当たり判定を持つ「つるはし」のような道具の実装は簡単にできる。

f:id:USAGI-WRP:20171020051120p:plain

f:id:USAGI-WRP:20171020051006p:plain

f:id:USAGI-WRP:20171020051203p:plain

4. 応用

  • プレイ中の視認によるデバッグ目的や、エンドユーザーへ当たり判定の表示機能を提供したい場合は §3 で追加した Cube の Visible を適当なトリガーで ON/OFF できるようにし、マテリアルも当たり判定の可視化用に適当な半透明の黄色ベタなどを設定するとよい。
  • 当たり判定の可視化が UE4Editor の開発環境の表示機能だけで十分でメッシュとマテリアルによる表示が不要な場合は StaticMeshComponent の Cube や Sphere ではなく Box CollisionSphere CollisionCapsule Collisionコンポーネントとして追加するとよい。
    • note: C++ コードの場合は UBoxComponentUSphereComponentUCapsuleComponent を ctor 等で生成して SetupAttachment する。
  • アクター単位でなくコンポーネント単位で当たり判定を行いたい場合は Event Graph で Event ActorBeginOverlap を定義せずに Bind Event to OnComponentBeginOverlap を定義し、その TargetCube コンポーネントを与え、 EventOnComponenBeginOverlap_Cube などお好みのユーザー定義イベントを束縛させるとよい。
    • note: C++ コードの場合は OnComponentBeginOverlap.AddDynamic で実装する。

f:id:USAGI-WRP:20171020050834p:plain

f:id:USAGI-WRP:20171020051220p:plain

5. 参考

  1. UShapeComponent | Unreal Engine API Reference
  2. Unreal Engine | イベント
  3. Event ActorBeginOverlap | Unreal Engine Blueprint API Reference
  4. Unreal Engine | 5.オーバーラップしているアクタをテストする
  5. OnComponentBeginOverlap | Unreal Engine API Reference
  6. Unreal Engine | 動的デリゲート
  7. UE4: C++ クラスで実装したアクターのコンポーネントの OnComponentBeginOverlap.AddDynamic 等がうまく動作しない時に確認すること - C++ ときどき ごはん、わりとてぃーぶれいく☆