はじめに
前回に引き続き猫でも分かるシリーズを見ることに
今回はコリジョンについてとの事。元々社内SEをやっていたのでコリジョンといえば親会社が設定したIPが重複していたりしていきなりネット繋がらなくなったとか問い合わせを受けるような事を想像しましたね。
ということでコリジョン=衝突でありおそらくこの認識のままであっているでしょう。今回はそれのゲーム版を学びます。
参照元
猫でも分かる UE4を使ったゲーム開発 超初級編 #3:コリジョンを使ってコインを拾ってみよう!
www.youtube.com
猫でも分かる UE4を使ったゲーム開発 超初級編 #3:コリジョンを使ってコインを拾ってみよう!
対象者
この講座(動画)の対象者として下記のような方が挙げられている
これは私にピッタリです。
講座の流れ
コリジョンとは?
2のエリア(領域)が接触または重なり合っているかをチェックする為の機能
- アクタを囲むエリアを設け衝突を判定する
- ヒットボックスとか言われるものであろうか??
- このエリアは箱型であったり球型であったりする模様
- コリジョンは当たり判定のみを役割としており、その後のアクションは別の仕組みが担当する模様
- ゲームによって設定されるコリジョン例の紹介がある
- 格闘ゲームなどは打たれる部位によって反応(アクション)が変わるため、コリジョンを多数つけるとの事
- 格闘ゲームのポリゴンをそのままコリジョンにすればいいのでは?と考えられる方もいる
- それを実装すると処理が重くなりすぎるとの事
- 処理が重くならないように四角や丸などに置き換えているとの事
- 衝突以外にも重なり合っているか判定にも使える。
- 例えばコインを取る場合など
- コリジョンの使用例
- 監視カメラの画角に泥棒が入ったか判定
- アクタが海の中に入っているか判定
- アクタがゴールテープに接したかどうかなど
このようにコリジョンは様々な用途で使え、幅がかなり広がるとのこと。
UE4のコリジョン機能について
コンポーネントで提供している
- 前回使っていたようなThirdPersonキャラクターもカプセルコンポーネントがあったから壁にあたったりすることが可能となっていた
- コリジョンの種類(3つ)
- 形状はシェイプから変更可能
- トランスフォームから変えても同じ結果となる
- 用途
- コンポーネントを腕につけたり頭に付けたりして各部位毎の当たり判定などに使える
コリジョン用のアクターがある
- コリジョンアクターの種類(4つ)
- 左からカプセル、球、ボックス、ボリューム
- ボリュームのみ各頂点を修正してより複雑な形にできる
- 修正方法はモードをブラシ編集モードにし頂点をドラッグする
- 用途
- 罠を設置したりできる
- あるポイント通過したなどに判定
コリジョン用のイベントノード
- コリジョンイベントノードの種類(3つ)
- イベントHit
- 接触時
- イベント ActorBeginOverlap
- 重なった時
- イベント ActorEndOverlap
- 離れた時
- アクター毎ではなくコンポーネント毎にイベントは設定可能
ピンの説明
- Other Actor はそのコリジョンに重なったりヒットしたアクターを指す
- 敵ならダメージを食らう
- 回復系アイテムなら回復させるなどに使える
- Other Compはあたったコンポーネント
- Hit Locationはヒット位置
- 頭があたったなどであれば頭を斜めにするなどが可能
- コリジョン用のアクターのコンポーネントからも情報が取れる
- こちらのほうが色々な情報がある
コンポーネントに用意されているイベントもある
- イベントノードとコンポーネントのイベントノード同じ種類のものを並べていた図
- こちらのほうが細分化されている様子
コリジョンのフィルター機能
- 用途
- 監視カメラで泥棒のみを監視したい場合
- 敵の要塞に潜入した際、敵が監視する対象をプレイヤーが操作しているアクターのみに絞る
- バリア機能。外側から来る敵の攻撃はバリアの中だと無効化する等
基本コリジョン設定とフィルター概要
※公式ドキュメントより(リンクは最後に掲載)
- 球と壁がある
- 球と壁どちらにもコリジョンの設定が必要
※公式ドキュメントより
- 球体には Object Type = PhisicsBodyとする
- Object Responses 何に対しどういったコリジョンをするかを設定
- 壁側には PhysicsBodyのBlock(縦軸)にチェックが入っている
- これによりPhisicsBodyが衝突した時、PhisicsBodyはすり抜ける事ができなくなる
- 壁側のPhysicsBodyをOverlapにするとぶつかってもすり抜けるようになるとの事
- Object Type毎にこの部分を変更することでフィルターを実現するという話
※公式ドキュメントより
- Overlapを検出する場合、検出したい側に Generate Overlap Eventsにチェックを入れる
- 例を見ると球体のObject ResponsesのWorldDynamicのOverlapにチェックが入っている
- これによってWorldDynamicが重なった時に球側で検出可能となる
- 壁の方にはPhysicsBodyのBlockにチェックが入っているがこれは間違っている模様。実際は右隣のOverlapが正しいとのこと。
- これによってPhysicsBodyが重なったときに検出が壁側で検出可能となる
- Object ResponsesのIgnore(無視)について
- Blockしないしイベントも発生しない
- ThirdPersonCharacterのCasuleComponentのコリジョン設定
- オブジェクト応答はすべてBlockになっていて全てにぶつかる設定になっている
- 全てグレーアウトしているのは現在プリセットによって一律に設定されている為
- 一番上の Custom … を選択すると全て個別に設定可能となる
- WrldStatic、WorldDynamic、Pawn、PhysicsBody、Vehiecle、Desctructible以外にも属性を増やせる
- 増やし方は最後にまとめておく
コリジョンを使ってキャラクタが拾えるコインのBPを作ってみよう!
- ブループリントクラスを右クリックメニューから選択して作成
- 作成場所(フォルダ)は特に指定がなかったためBlueprintsに作成する事に
- 親クラスは Actorにする
- 動き回るコインの場合は異なった親クラスを指定する
- BP_Coinという名前をつける
- BP_Coinをダブルクリックしブループリントを開く
- Static Meshを配置
- Static Mesh の Static Mesh に Shape Torus を選択
- レベルに配置
- レベル上で位置やサイズを修正
- XYZ全て一律に変更する時は右端の鍵マークをクリックして変更すれば全て一律に変更される
- マテリアルにGoldを選択
- レベル上の修正をブループリントに反映させる
- BP_CoinのブループリントよりSphereCollisionを配置
- Sphereのシェイプを大きくしてoverlap範囲を広げる
- コンパイルする
- コリジョン確認用にプレイ中も表示させるため、Hidden in Gameのチェックを外す
- 右クリックして OnComponentBeginOverlap を追加
- overlapしたら消す為に、DestroyActorというノードを追加し接続
- ThirdPersonCharactorのブループリントを開き、コリジョンより ObjectTypeを確認
- 動画中では別のものになっていたためPawnに修正していた
- BP_Coinのブループリントを開き、コリジョンプリセットを Customに設定後、Pawn以外はignoreにする
- 完了
範囲に入っている時ずっと検出し続ける方法
見ている方からの質問での回答
- 疑似監視カメラを設置するためブループリントクラスを追加
- Actorを選択
- 名前を BP_SeveranceCamera とした
- BP_SeveranceCameraのブループリントを開く
- コンポーネント Cube と Box Collision を続けて追加
- CubeのトランスフォームとBox Collisionのシェイプを調整し図のようにする
- Box Collision の Hidden in game のチェックを外しプレイ中も枠が見えるようにしておく
- 下準備完了
- この範囲にキャラクターが入っているか入っていないかを検出する方法はいくつかある
- 一つは保存しておく方法
方法1. 範囲に入っている事を保存する方法
- Box Collisionのコンポーネントより Begin OverlapとEnd Overlapを追加
- 変数を追加、変数名は CharacterIsInside とした
- 変数をイベントグラフに2度配置。どちらも Setにする
- 接続して Beginの方の Character is inside のチェックを入れる
- 各単語の先頭を大文字にするキャメルケースで変数名を付けていたら、頭文字にスペースが入っている事に気づく。ものすごく親切設計😃
- 後は Character is insideをGet で配置し ブランチと紐付ける事で入っていれば True 入っていなければ False で判定可能となる
方法2. Is Overlapping actor を使う方法
- Is Overlapping Actor を配置
- Begin overlap の other actorを変数に昇華させ状態を保存する
- 変数名は Graymanとする
- 変数 GraymanをGetで配置
- Tick、Is Overlapping Actor, ブランチを図のように接続
- True は重なっている
- False は重なっていないで判定可能となる
- 方法1のほうが処理負荷的にも軽く、複雑でもないとの事
領域に入ったら点灯するライトをつくる方法
見ている方からの質問での回答
- BP_SeveranceCameraのブループリントより Spot Lightコンポーネントを追加
- トランスフォーム、回転を使っていい感じにライトを配置
- Use Inverse Squared Falloffをオフにする
- これは、ライト フォールオフによって、実世界により近いライトの挙動がレプリケートされるオプションです(公式より)
- 領域に入ったらライトを光るようするためには色々方法はあるが今回はVisibleをon/offすることで実現するとの事
- これは、ライト フォールオフによって、実世界により近いライトの挙動がレプリケートされるオプションです(公式より)
- デフォルト状態としてチェックを外しておく
- SpotLightのプロパティを変更するため、SpotLightをイベントグラフへドラッグ
- Set visibility ノードを配置し接続する
- 上記をコピーして2つにする
- Begin OverlapとEnd Overlapと接続する
- Begin Overlapの際は、New Visibility にチェックが入っている事に注意
- 結果 領域内にいる時のみ光るライトが完成。
最後に
色々用途がありそうな上に簡単に実装できることがわかった。これは良いですね。今回もすごく勉強になりました。
しかし講師の方は、Blueprintで作成したもののサイズやマテリアルなどはレベル上で修正し、ブループリントに反映させる事が多い。
そうしたほうが他のものを見ながらできるからそうしているのであろうか?
メモ
- アウトライナのタイプがハイパーリンクになっているものをクリックしてもブループリント編集ウィンドウに移動できる
- コリジョンの可視化
- 公式ドキュメント
- レース応答とオブジェクト応答の違い
- 見ている方の質問からの回答
- 視線などを表現するために線を飛ばすことをトレース応答
- 監視カメラなどを表現する場合はもう少し範囲が広いためオブジェクト応答のほうが良いとの事
- こちらで行える事はオブジェクト応答でも行えそうという印象があった。単純な事に使う場合に使うのだろうか?
- 2点間の距離計測によく使用するとの事
- コリジョン同士の衝突などがオブジェクト応答
- 視線などを表現するために線を飛ばすことをトレース応答
- 見ている方の質問からの回答
- 変数について
- 変数名は基本英語で付ける
- キャメルケース ThisIsAPen
- スネークケース this_is_a_pen
- 上記が多く使用されている記法だが、どちらを使ってもブループリントでノードを配置するとスペースを入れてくれる模様
- 左キャメル、右スネーク。むちゃくちゃ読みやすい親切設計に感動
- 変数に昇華機能
コリジョンの頻度を変えるメモ
質問の回答として紹介されていた方法
例えばBoxのコリジョンを変える
- Boxをドラッグ
- Set Collision Enabledを配置し接続
- このノードでコリジョンを有効にしたり無効にできる
- これを使って1秒毎に無効/有効を繰り返す
- 遠くにあるので衝突を無効化して近くに来たら有効にするなどの使い方がされる
コリジョン属性の増やし方
最大18個まで