Unreal Engineトップへ戻る

目次

  1. 用語一覧
  2. UnrealEngine4におけるコリジョンの設定方法
  3. 実際にオブジェクト応答をカスタマイズする
  4. トレース応答

用語一覧

  • コリジョン:本項目では衝突検出を意味する
  • コライダー:本項目ではコリジョン形状を持つ存在を意味する
  • Gate:門をイメージしたノードで、Opened状態とClosed状態の二つの状態を持つ。パルスの流れをコントロールするのに利用する

UnrealEngine4におけるコリジョンの設定方法

アクタにコライダーを割り振る

  • ひとつのアクタに複数のコライダーを割り当てることも可能

    ex)Static Mesh コンポーネント, Skeltal Meshコンポーネント, Box Collisionコンポーネントetc

「Collision Enabled」の設定

  • コライダーがコリジョン可能かどうかを設定するプロパティ

    以下の三種類が存在する

    No Collision設定状態に関わらず、コリジョンは完全に無効
    No Physics Collision物理シミュレーション上のコリジョンを持たない
    Collision Enabledコリジョン有りの通常設定

自身のコリジョングループ「Object Type」で割り振る

  • アクタをそれぞれ静的な背景物やキャラクタなどにグループ分けして、グループ単位でコリジョンの関係を考える
  • UE4では、デフォルトで以下の6つのグループ(オブジェクトチャンネル)が準備されている
  • 独自のオブジェクトチャンネルを追加することも可能
    WorldStaticスタティックメッシュやブラシなどの静的な背景物
    PawnプレイヤーやAIがコントロールするキャラ
    VehiclePawnが乗り込む乗り物
    PhysicsBody物理エンジンに制御を任せている剛体
    Destructible物理エンジンの機能で壊れる「壊れ物」
    WorldDynamic可動性の設定がムーバブルになっているスタティックメッシュなど、上記5つ以外のもの

自他の「Object Type」からオブジェクトの応答を設定する

  • 自身のコリジョングループと相手のコリジョングループの関係性によって、以下の3つ応答のどの処理を実行するのかを決定する
    Block(ブロック)コライダーがコライダーの中に入らないようにする
    Overlap(オーバーラップ)コライダー同士の重なりは許すが、その状態を検出してゲームに活かす
    Ignore(無視)お互いを空気同様に扱う

実際にオブジェクト応答をカスタマイズする

下準備

  1. コンテンツブラウザ>[コンテンツ>Blueprints]フォルダ>[PNPlayerPawn]をダブルクリックしてブループリントエディタを開く
  2. [コンポーネント]パネル>[Mesh]>詳細パネルの[Collision]>[コリジョンプリセット]>[CharacterMesh]に変更
  3. [コンテンツ>Maps>Test]フォルダ>[Test_Player_Death]マップを開く
  4. 床のスケールを調節して十分に走れるよう広くする

    scale[x;15, y;15, z;1]くらい

  5. プレイボタンを押して実行
  6. Cキーでコインを貯める
  7. 左シフト押しながらWASDキーで加速移動&コインドロップ
  8. Kキーで死亡

独自のオブジェクトチャンネルとプリセットを追加する

  • 同一フレームで同じ位置にコインが発生した結果、お互いがお互いに食い込んで弾き飛ばしてしまうフィジックスの暴れを直す
  1. ツールバーの[設定]ボタンをクリック>サブメニューの[プロジェクト設定]を選択
  2. [プロジェクト設定]ウィンドウ左部ツリー>[エンジン]>[コリジョン]を選択
  3. [Object Channnels]カテゴリにある[新規のオブジェクトチャンネル]ボタンをクリック
  4. 名前:PickUp, デフォルト応答:Block, [承認]ボタンを押す
  5. コリジョンのプリセットを追加するために、[Preset]グループ>[新規ボタン]をクリック
  6. 以下の設定をして[承認]ボタンを押す
    名前PickUp
    CollisionEnabledCollisionEnabled
    ObjectTypePickup
    説明ピックアップアイテムのプリセット
    無視オーバーラップブロック
    WorldStatic
    WorldDynamic
    Pawn
    PhysicsBody
    Vehicle
    Destructible
    Pickup
  7. プリセットのリストの[OverlapAllDynamic]をダブルクリック>[Pickup]を[オーバーラップ]に設定する
  8. [OverLapAll], [Trigger]にも同様の処理を行う
  9. [NoCollision], [InvisibleWall], [Spectator]のプロファイルを編集>[Pickup]への応答を[無視]に設定する
  10. レベルエディタに戻る>[コンテンツ>Blueprints]フォルダ>[PNPickupCoinActor]をダブルクリック
  11. [コンポーネント]パネル>[StaticMeshComponent]を選択>[Collision>コリジョンのプリセット]を[Pickup]に変更
  12. レベルエディタに戻る>[コンテンツ>Blueprints]フォルダ>[PNPickupScrollActor]をダブルクリック
  13. [Mesh]コンポーネント>[Collision>コリジョンのプリセット]を[Pickup]に変更
  14. コンパイル
  15. プレイ

コリジョンプリセットを動的に変更する

  • Kキーを押した時のラグドール処理が開始される直前に、スケルタルメッシュのコリジョンプリセットを[Ragdoll]に切り替えるブループリントを追加する
  1. コンテンツブラウザ>[コンテンツ>Blueprints]フォルダの[PNPlayerPawn]をダブルクリックしてブループリントエディタを開く
  2. [Any Damage]イベントノードの先にある[Set Simulate Physics]ノードの位置にグラフをスクロールする
  3. 近くにある[Mesh]ノードからワイヤーを伸ばし、[Collision]>[Set Collision Profile Name]を選択
  4. [In Collision Profile Name]ピンに[Rigdoll]と入力する
  5. [Set Life Span], [Set Collision Profile Name], [Set Simulate Physics]の順に実行ピンを結ぶ
  6. [Mesh]の出力ピンを[Set Collision Profile Name]と[Set Simulate Physics]のターゲット入力ピンに接続する
  7. コンパイル
  8. プレイ

フロー制御Gateを使う

  • コイン発生と同一フレームでコインが取得されてしまう現象を妨げる
  1. コンテンツブラウザ>[コンテンツ>Blueprints]フォルダの[PNPickupCoinActor]をダブルクリックしてブループリントエディタを開く
  2. [Event Graph]タブをクリックしてグラフの編集を行う
  3. [OnComponentBeginOverlap]ノードの出力ピンからワイヤーを伸ばし、[Utilities]>[Flow Control]>[Gate]を選択
    アクタとコンポーネントコリジョン
    ・OnActorBeginOverlap:アクタの持つ全てのコライダーで発生したオーバーラップに対して呼び出される
    ・OnComponent~:各コンポーネント毎にオーバーラップの設定を行うとき
  4. [Gate]ノードの側で、新しいカスタムイベント>[EnablePickUp]を追加>[Gate]ノードの[Open]実行入力ピンに接続
  5. [Begin Play]ノードの実行出力ピンからワイヤーを伸ばし、[Utilities]>[Time]>[Set Timer]を選択
  6. [Begin Play], [Set Timer], [CoinRotationTimeline]の順に実行入力ピンを繋ぐ
  7. [Set Timer]ノードの[Function Name]入力ピンに「EnablePickup」を設定&[Time]入力ピンを「0.5」に設定
  8. コンパイル
  9. レベルエディタウィンドウに戻る>[コンテンツ>Character]フォルダ>[SK_Ninja_Skeltone]タブをダブルクリックしてペルソナエディタを開く
  10. [CoinSpawnPoint]を一旦削除>[Spine]ボーンの位置で再作成する
  11. [プロジェクト設定]ウィンドウのコリジョン設定>コリジョンプリセット[Ragdoll]を編集
  12. [Pickup]チャンネルに対するオブジェクト応答を[無視]に設定
  13. コンパイル
  14. プレイ

トレース応答

トレース応答とは

  • コライダーは、オブジェクト応答とは別にトレース応答を持つことができる
  • トレース応答とは、一般にレイキャストやラインテストと呼ばれるテクニックと同じで、以下のような処理を実現できる
  1. 視線チェック:あるキャラから別のキャラや地点が見えているかどうか
  2. 着弾チェック:射撃したフレームでレイを飛ばして命中判定をする
  3. 遮蔽チェック:手榴弾の爆発のような範囲ダメージから、遮蔽物や塹壕で身を守ったかどうか
  • トレースチャンネル

    コライダーは、オブジェクトチャンネルと同様に、トレースチャンネルごとに応答設定ができる

  • トレースの種類

    本項目ではライントレースを扱うが、一定距離内にいるポーンをまとめて調べるとき用にスフィアトレースなどのトレースも存在する

敵キャラのアセットとポーンを準備する

  1. [コンテンツ>Characters]フォルダに[PaperNinja_Resource/Characters/Mesh/SK_Rabbit.fbx]をインポート
  2. インポートした[SK_Rabbit] をダブルクリックして開く
  3. [LOD 0]>[エレメント 0]に仮のマテリアルとしてエンジンコンテンツの[BasicAsset01]を割り当てる
  4. [コンテンツ>Blueprints]フォルダに親クラスを[Character]とする新しいクラスブループリント[PNPawn_Rabbit]を作成し、ダブルクリックしてブループリントエディタを開く
  5. [コンポーネント]パネル>[CapsuleComponent]を選択>[詳細]パネル>[Shape]>[Capsule Half Height]プロパティを「44.0」に設定
  6. [CapsuleComponent]の子階層[Mesh]コンポーネントを選択>[Mesh]>[Skeletal Mash]>[SK_Rabbit]を割り当てる
  7. [トランスフォーム(変換)]

    [位置]:z:-44.0

    [回転]:z:-90

  8. [コンポーネント]パネル一番上[PNPawn_Rabbit(セルフ)]をクリック
  9. [詳細]パネル>[Pawn]>[Use Controller Rotation Yaw]のチェックを外す
  10. [コンポーネント]パネル[Character Movement]>[Orient Rotation to Movement]にチェックを入れる
  11. コンパイル

テストマップの準備

  • マップを作成し、敵キャラを四隅に配置する
  1. 新しいレベルを[default]テンプレートで作成>[コンテンツ>Maps>Test]のパスに「Test_Collision_Trace」という名前で保存
  2. コンテンツブラウザの[コンテンツ>Blueprints]フォルダ>マップの四隅にそれぞれ[PNPawn_Rabbit]を配置し、内側を向かせる

    配置例

    x:-400, Y:-400ヨー: 45
    x:+400, Y:-400ヨー: 135
    x:-400, Y:+400ヨー:- 45
    x:+400, Y:+400ヨー:-135
  3. 中央のプレイヤースタート地点の近くに[コンテンツ>Props]フォルダ>[SM_Box01]を配置
  4. [詳細]パネルの[Physics]>[Simulate Physics]と[Override Mass]にチェックを入れる
  5. [詳細]パネルの[Physics]>[Mass in Kg]を55.0に設定
  6. テストプレイして、配置した段ボールを押して動かせるか確認する

敵キャラのあたり判定

  • オブジェクト応答を使用して、敵キャラがプレイヤーを捕まえたときのダメージ処理を作成する
  • 敵キャラは[Pawn]オブジェクトチャンネルにはブロック応答するため、オーバーラップイベントは使用できない

    →[Generate Hit Event]と[OnConmornentHit]イベンを使用する

  1. [PNPawn_Rabbit]ブループリントエディタに戻る>[Event Graph]タブをクリックしてグラフ編集
  2. [コンポーネント]パネルの[CapsuleComponent]を右クリック>[イベントの追加]>[OnComponentHit]を選択
  3. [OnComponentHit]ノードの[Other Actor]出力ピンからワイヤーを伸ばし、[Game]>[Damage]>[Apply Damage]を選択
  4. [Base Damage]入力ピンを「100.0」に設定
  5. [OnComponentHit]と[Apply Damage]を実行出力ピンでつなぐ
  6. [OnComponentHit]の[Other Actor]出力ピンと[Apply Damage]の[Damaged Actor]を繋ぐ
  7. コンパイル
  8. プレイ(プレイヤーキャラが死亡すれば成功)

独自のトレースチャンネルを追加する

  • 敵の視線チェックを行う
  • 空のプロジェクトテンプレートを使用しているため、デフォルトのトレースチャンネルには[Visibility]と[Camera]の2種類しかないので、独自のトレースチャンネルを作成していく
  1. レベルエディタに戻る>ツールバー[設定]をクリック>サブメニュー[プロジェクト設定]>左のメニューから[エンジン]>[コリジョン]を選択
  2. [Trace Channels]カテゴリ>[新規トレースチャンネル…]ボタンをクリック
  3. 以下の設定を行い[承認]ボタンをクリック
    名前Sight
    デフォルト応答ブロック
  4. プリセットのリスト[InvisibleWall]をダブルクリック>プロファイル編集画面[Sight]を[無視]に変更
  5. プリセットのリスト[Pickup]をダブルクリック>プロファイル編集画面[Sight]を[無視]に変更
  6. 同様の処理を[NoCollision], [OverlapAll], [OverlapAllDynamic], [OverlapOnlyPawn], [Trigger]にも行う

ライントレースを使う

  • 作成したトレースチャンネルを用いてライントレースを空間い飛ばす
  • 始点:アクタ(ポーン)の位置(身体の中心)
  • 終点:アクタの正面向きベクトルを視線の距離(視力?)分だけ掛け算して始点のベクトルを加算する
  1. [PNPawn_Rabbit]のブループリントエディタに戻る>[Event Graph]タブをクリックしてグラフを編集する
  2. [Tick]ノードの実行出力ピンからワイヤーを伸ばし、[Collision]>[Line Trace By Channel]を選択
  3. [Line Trace By Channel](以下[Line Trace])ノードの[Trace Channel]ピンを[Sight]に設定&[Draw Debug Type]を[For One Frame]に設定
  4. [Line Trace]ノード[Start]入力ピンからワイヤーを左に伸ばし、アクションリスト[Utilities]>[Transformation]>[Get Actor Location]を選択

    この処理でレーザーポインタの視点がウサギの位置となる

  5. [Get Actor Location]ノードの下の空きスペースを右クリックし、アクションリストから[Utilities]>[Transformation]>[Get Actor Forward Vector]を選択

    このノードがワールド座標系におけるアクタの正面向きのベクトルを出力する

  6. [Get Actor Forward Vector]ノードの実行出力ピンからワイヤーを伸ばし、[Math]>[Vector]>[Vector * Float]を選択
  7. Bピン(下側のピン)に「300」と入力

    視線方向に3m伸ばしたベクトルになる

  8. [Get Actor Location]ノードの出力ピンからワイヤーを伸ばして、[Math]>[Vector]>[Vector + Vector]を選択
  9. Bピンと[Vector * Float]の出力ピンを接続

    これで、ウサギの位置から正面に3m進んだところを示すベクトルが完成

  10. [Vector + Vector]の出力ピンを[Line Trace]ノードの[End]入力ピンにつなぐ
  11. コンパイル

トレースヒット情報の活用

  • ヒットしたコライダーから情報を取得する
  • [Line Trace]ノードは以下の2つの出力を有する
    Return ValueBoolean型でトレースに反応するコライダーが有ったかどうかを返す
    Out HitHit Result型の構造体でヒットした位置や向き、対象のマテリアルやアクタ、コンポーネントなどの情報を含む
    ブループリントでは[Break]を使ってバラバラにして使用する
  1. [PNPawn_Rabbit]のブループリントエディタで作業する
  2. [Line_Trace]ノードの[Out Hit]出力ピンからワイヤーを伸ばし、[Break Hit Result]を選択
  3. [Break Hit Result]ノードの[Hit Actor]から出力ピンを伸ばし、[Utilities]>[Actor Has Tag]を選択
  4. [Tag]入力ピンに「Player」と入力する
  5. [ユーティリティ]>[フロー制御]>[ブランチ](or Bキーを押しながらクリック)を選択
  6. [ブランチ]ノードの[True]ピンかを伸ばし、[Print String]ノードを選択
  7. [In String]ピンに[See PNPlayerPawn!]と入力
  8. コンパイル
  9. プレイ(プレイヤを光線に晒してみる&段ボールを置いて敵の視線を遮蔽できるかどうか)

イベントグラフのノードネットワークを関数化する

  • 以上の機能を関数化する
  • 毎フレーム呼び出すのではなく、必要な時にAIから使ってもらえるような仕組みに変える
  1. [PNPawn_Rabbit]のブループリントエディタで作業を再開する
  2. 敵の視線距離をパラメータ化する

    [Vecter * Float]ノードのFloat側のピン(緑のピン)から左へワイヤーを伸ばし、アクションリストから[変数へ昇格]を選択

  3. 追加された[New Var]ノードを選択>[詳細]パネル>[名前]:「SightLength」に変更
  4. コンパイル
  5. デフォルト値が「300.0」になっていることを確認する
  6. [Tick]ノードを除く、[Line Trace]とその左側の全てのノードと、右側は[Actor Has Tag]ノードまでを選択する
  7. 選択されたノードのどれか一つのノードの上で右クリック>サブメニュー[関数に折りたたむ]を選択
  8. [Tick], [New Function 0], [ブランチ]の順で実行出力ピンが繋がっていることを確認する
  9. [マイブループリント]パネル>[関数]>[New Function 0]を選択し右クリック(or F2をクリック)
  10. [名前の変更]:「CanSeePlayerPawn」
  11. [詳細]パネル>[カテゴリ]を[AI]に変更&[Pure]にチェックを入れる
  12. コンパイル
  13. 動作確認後、[Tick]と[ブランチ]ノード間のワイヤーを切断
  14. 終了

Unreal Engineトップへ戻る


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-07-14 (木) 18:54:44 (881d)