【UE4】なるべく手軽に壁走りを実装してみる
こちらはUnreal Engine 4 (UE4) Advent Calendar 2017 - Qiita6日目の記事になります。
0.目次
1.はじめに
良い単語が思いつかなかったので「壁走り」としましたが、実現したかったのは某レースゲームの機体がコース上を浮いて走るやつです。 UE4を始めた頃から定期的にチャレンジしていて、現状で一番楽な方法の紹介です。
こんな感じのを作れます
HoverCar test #UE4 pic.twitter.com/OuK6sB1qis
— tamfoi (@tamfoi) 2017年1月16日
バージョン:4.18.2
2.実装
Pawnに実装しました(Characterではうまくいきませんでした)
まずはBlueprint全体です(移動処理とかPawnの構成とかは割愛します)
2.1.落下処理
落下処理は下記のようにしました。
Add Input Vectorとかを使うほうが良いのでしょうが、空中で慣性移動させるのがパパっとできなかったのでこの形にしました。
(ただこれだと下方向の速度をGetVelocityで取得できないですね…)
2.2.レイキャスト
地形の法線を取得するために下記のようにPawn真下にレイキャストするようにしました。
2.3.地形に合わせて姿勢変更
レイキャストが成功したら取得した法線に合わせて姿勢を変更します。
Make Rot From ZXノードで姿勢を作るというのにたどり着くのにだいぶかかりました...
2.3.姿勢を元に戻す
レイキャストに失敗したら姿勢を元に戻す処理です。
ゲームのデザインによってはいらないと思います。
3.おわりに
もっといい方法があったら是非共有してもらいたいです。
コース制作周り(Splineとか天地ひっくり変えるようなコース作ろうとすると難しいです)とかカメラ周り(SpringArmのRotation Lagをいれていると一定角度を越える時に変な方向にいってしまったりします…)とかの問題もあるので先は長そうです!
【UE4】配列から指定個数を重複なく取り出すマクロ
0.目次
1.はじめに
配列の中からランダムで数個だけ処理させたい…って思うことがたまにあったので配列から指定個数を重複なく取り出すマクロを作ってみました。
バージョン:4.16.2
2.実装
実装は下の画像のようになっています。
流れとしては、
- 元の配列を壊さないためにローカルにコピー
- コピーした配列をシャッフル
- 取り出したい数だけループを回してリターン用の配列に格納
- 結果を返して終わり になってます。
3.おわりに
社会人になってから余裕がなくて記事を書いてなかったのですが、作業してたら自分の前書いた記事を読んでそういやそうだったってなる場面がありました。 やっぱりこういう形で残しておくのは大切だと思ったので久しぶりに軽めですが書いてみました!
【UE4】RootComponent以外のCollisionを移動時の衝突判定に使う方法と問題点
0.目次
- 0.目次
- 1.はじめに
- 2.RootComponent以外のCollisionを移動時の衝突判定に使える場合何が嬉しいか
- 3.RootComponent以外のCollisionを移動時の衝突判定に使う方法
- 4.問題点と対策案
- 5.おわりに
1.はじめに
RootComponent以外のCollisionを移動時の衝突判定に使う方法がありましたのでメモしておきます
追記:Characterですと上手く機能しませんでした。Pawn(もしくはFloatingPawnMovement)でないとダメなのかもしれません
バージョン:4.15
2.RootComponent以外のCollisionを移動時の衝突判定に使える場合何が嬉しいか
以下の画像のように設計したいとします。
Playerや各Enemyは様々な形をしていると思うので、使いたいCollisionの形も様々だと思います。
しかし、移動時のSweepのことを考えるとRootComponentにCollisionを指定しなければならないのでこの設計ですとPawnBaseの時点でCollisionの形を一つに決めてしまわなければなりません。
ですので、Collisionの形を変える可能性があるのならこの設計は諦めてActorComponent等になるべく処理を流してPawnにAttachしていくという風になるかと思います。
仮にRootComponent以外のCollisionを移動時の衝突判定に使えれば、PawnBaseにはSceneComponent等を指定しておいてCollision自体は継承先で作るという風に出来ます。
3.RootComponent以外のCollisionを移動時の衝突判定に使う方法
まず、以下のようにPawnを組んだとします。
この状態で、特に何もせずに移動処理を組むと以下のように壁を貫通します。
そこで、以下のようにすればRootの子であるCapsuleを移動時の衝突判定に使うことが出来ます。
以下のようにCapsuleが考慮されるようになりました
4.問題点と対策案
上記のGIFを見ていると分かると思いますがRootの子であるArrowが取り残されていることがわかると思います
この方法を使うと指定されたComponentを親から相対的に移動させるという結果になるからです…困りました…SetActorLocationなどを使う場合に思ったようにいかなくなります…対策をいくつか考えてみました
SetActorLocationの代わりに次のような関数で対応できます
GetActorLocationの代わりに次のような関数で対応できます
そもそも、常にRootの位置を同期すればいいので、以下のようにすれば上記の関数を作らなくても良いかもしれません
5.おわりに
地味にこの方法ですとCapsuleを回転させることが出来るので嬉しいです
まだ軽く試した程度なので、まだ気づいていない問題点もあるかもしれません
【UE4】AIを空中で移動させる時に使えそうなノード
0.目次
1.はじめに
AIの移動処理を作る時に地上ならばナビメッシュがあるのでAIMoveToなどを使えば簡単に作れますが、空中ですと現状のUE4ではナビメッシュが無いので使えるものと使えないものがあります。
今回はよく使いそうなノードでどれが空中で使用出来るか調べたもののまとめです。
バージョン:4.15
2.移動に使うノードと空中での使用可否
※MovementComponentにはFloatingPawnMovementを使用しています
ノード名 | 使用可否 | 補足 |
---|---|---|
AIMoveTo | × | |
MoveToLocationorActor | ◯ | UsePathfindingを外せば使用可能。Accelerationは考慮されず最大速度で移動する |
SimpleMovetoActor | × | |
SimpleMovetoLocation | × | |
MovetoLocation | ◯ | UsePathfindingを外せば使用可能。Accelerationは考慮されず最大速度で移動する |
MovetoActor | ◯ | UsePathfindingを外せば使用可能。Accelerationは考慮されず最大速度で移動する |
AddMovementInput | ◯ | Accelerationが考慮される。Taskで瞬間的に呼んでしまうとほんの少ししか移動しない上にスピードがいつまで経ってもでないのでService等で毎フレーム呼ぶかDelayで少し待ってからFinishExcuteを呼ぶ等の工夫をする |
AddInputVector | ◯ | Accelerationが考慮される。こちらもAddMovementInputと同様Taskで瞬間的に呼んでしまうと問題があるかと思います |
AddActorXXOffset | ◯ | 可変フレームへの対応をする必要あり。FloatingPawnMovementを完全に無視した状態になります |
SetActorXXLocation | ◯ | 可変フレームへの対応をする必要あり。FloatingPawnMovementを完全に無視した状態になります |
3.おわりに
どのノードも一長一短な感じで悩みます。こうしたら良いよとか楽だよっていうのがあったら教えてほしいです。
RoborecallのDroneの実装を見たのですがMoveToLocationが使われていました。(というか移動はどのAIも同じものを使ってるっぽいです)
あと驚いたのですがUsePathfindingがONの状態で使われていたので、私の使い方が良くないのか、もしくはナビメッシュを拡張しているのかもしれません。ナビメッシュの表示をしてみたら色々違います(特にジャンプポイントの量に驚いた)
【UE4】VectorFieldをBlenderで作る-導入編-
0.目次
- 0.目次
- 1.はじめに
- 2.Blenderを用意
- 3.Blender Vector Field Editorをダウンロード
- 4.Blenderにプラグインを導入
- 5.Blender Vector Field Editorの使い方
- 6.おわりに
1.はじめに
VectorFieldについてはドキュメントが参考になると思います
本来であればMaya等を使用して作成するのですがBlenderで作成出来るようにするプラグインをフォーラムで公開してくれています
今回は導入までのメモです
2.Blenderを用意
プラグインの都合で古いバージョンでないと動きません
今回は、2.70aを使用しました
3.Blender Vector Field Editorをダウンロード
下記リンクにGitHubへのリンクがありますのでダウンロードします
4.Blenderにプラグインを導入
ダウンロードしたzipを解凍するとFGA_VectirFieldsがあると思います
それを「blenderのあるディレクトリ\blender-2.70a-windows64\2.70\scripts\addons」の中にいれます(Blender内からインストールする方法もあります)
Blenderを起動し、ユーザー設定->アドオンを開きます
そこで「FGA Vector Field Tools」を探して有効化します
プラグインが導入出来ていれば下記のようにParticleSimulationというタブが追加されています
5.Blender Vector Field Editorの使い方
詳しい使い方は先程紹介したフォーラムにwikiへのリンクがあるのでそちらを参照してください(私もまだ把握出来てません)
作ったものはfga形式でエクスポート出来るのでそれをUE4に持っていってGPUパーティクルで使用します
6.おわりに
適当に弄ってみて次のようなものが出来ました
Blender内ではこんな感じ #UE4Study pic.twitter.com/cVOiNQXato
— tamfoi (@tamfoi) 2017年1月9日
BlenderでVectorField作ってUE4に持ってきてみた #UE4Study pic.twitter.com/4KhiVV0BGt
— tamfoi (@tamfoi) 2017年1月9日
【UE4】独自のコリジョンプリセット等を追加する方法
0.目次
1.はじめに
メッシュやコリジョン等の詳細やLineTrace等で選択する
ObjectChannels(ObjectType、オブジェクトチャンネル、オブジェクト応答)
TraceChannels(トレースチャンネル、トレース応答)
CollisionPreset(コリジョンプリセット)
を追加する方法です。
バージョン:4.14
2.プロジェクト設定を開く
プロジェクト設定->エンジン->Collisionを開くと以下の画面になります
2.1.ObjectChannelsを追加する
ObjectChannelsの新規オブジェクトチャンネル…を押すと次の画面が出ます
設定を済ませて承認すると以下のようになります
コリジョンの設定で選べるようになっているはずです
2.2.TraceChannelsを追加する
TraceChannelsの新規トレースチャンネル…を押すと次の画面が出ます
設定を済ませて承認すると以下のようになります
コリジョンの設定やLineTraceで選べるようになっているはずです
2.3.CollisionPresetを追加する
Presetの新規…を押すと次の画面が出ます
設定を済ませて承認すると以下のようになります
コリジョンの設定で選べるようになっているはずです
3.おわりに
透明な壁があって弾は貫通するけど、人は通れないとか…設定したくなったら使うと思う
設定しだすと沼にハマりそう