【UE4】ぷちコンで作ったAIとEQSのお話
はじめに
ぷちコンで作ったもろもろ紹介編2です
元記事
今回のテーマがAIだったので作ってみました。簡単な概要とかは極本23章(P395-)などを参照するかといいと思います。
AIやビヘイビアツリーに関する情報が少ないのでちょっと苦労しましたw
AI トロン編
全体はこんな感じ
やや複雑に見えますがやってることは大きく分けて、移動するか、装備を使うか、の2種類です。
移動するほう
- TargetLocationを見つける
- 移動する
- 条件によってはその場で一回転する
- 待つ
といった感じです。
移動に関してはこちらを見てください。
回転するのは、SetActorRotationを使って1回転させようとすると荒ぶってしまったのでRotatingMovementを使っています。
RotatingRateを(0,0,180)にしてあるので2sだけdelayしてます。すると大体でいいなら1回転します。
で、装備を使う方はこちら
他の装備を使うところもほぼ同じ作りなので写真は割愛します。
処理の流れとしては
- LineTraceでHitしたActorのタグを取得
- そのタグによって分岐
- 現在のトロンの装備によって装備切り替え
- その装備のアクションを実行(BPInterfaceで実装した)
となってます。
ビヘイビアツリーではif文にあたりそうな処理が見当たらなかったのでBlackboardBasedConditionでEqualとNotEqualの2つを作って分岐させてます。
ConditionalLoopは設定した条件である限りループできるので装備のタグがCannonでない間はループし続けます。 そして、その装備をまだ持っていない可能性もあるのでTimeLimitで設定した時間だけループさせて、時間が来たら処理を中断させてます。
ほんとはタグを使ったswitch文的なのが表現出来ればよかったんですが、ビヘイビアツリーはそういう使い方ではないのでやや冗長な感じになってしまっている感はあります。
そしてなぜBPみたいにコメント出来ればいいのに…(そのノードに関するコメントしか書けない
最後にこれ
ChangeSightをしている間はトロンは動きません。ここでBoolをセットしてます。
これAIを単純に止めるだけで良いのであれば、こちらを参照してください。
でも今回はどっちかというとポーズ処理なので、完全に止めてしまうとまずいわけで…
C++にはIsPaused()があるのでこちらを使っても良いかなと思ったんですが、今回はやめました。
AI ボス編
流れとしては
- EQSを使って良さそうな移動先を見つける
- LocationとRotationを生成する
- 時々攻撃したり、ワープしたりする
です。EQSはこちらにチュートリアルがあります。実装した時はまだまだ不安定な時があったので思うように動かなかったりしました。
今回使ったEQSはこれ
というような感じでScoreを設定して、場所を探っていけます。ほんとはもっといい感じにしたかったんですが、EQSのTraceが上手く使えなかったので断念しました…
まとめ
と、書いてみると意外と大したことない感じの中身でもそれっぽく動いてくれるので便利です。ただ使用例とかが少ないのでいまいちイメージが掴めないってのが現状な気がします。 ぜひ一度作ってみて、こんな処理してるよみたいなのが見たいので挑戦してみてください。
【UE4】 UE4上で簡単なアニメーションを1から作ってみた
はじめに
ぷちコンで作ったもろもろ紹介編3です
元記事
既存のアニメーションに加算していく記事は見かけたので、今回は1から作ったのでまとめてみたいと思います。
作り方
SkeltalMeshをダブルクリックとかしてCreateAsset→CreateAnimation→FromReferencePoseします。(FromCurrentPoseでもいいと思います
適当なところに保存します。
すると1フレームだけのアニメーションファイルが出来ます。
これじゃ使いにくいので、下のバーを右クリックしてフレームを追加します。今は1フレームしかないのでInsertしようがAppendしようが変わらないと思います。
で、設定したいボーンを選択して、上のKeyを押すとトラックを追加できます。
後は加算アニメーションと同じ要領で作れると思います。試しに頭をぐるぐる回すものをつくりました。
参考
まとめ
このくらいの簡単なアニメーションならいいのですが、複雑なものまで…となると正直使いやすいかと言われると微妙です。どんどん改良されて使いやすくなるといいですね。
【UE4】LineTraceを使わずに銃の当たり判定を作ってみた【小ネタ】
はじめに
ぷちコンで作ったもろもろ紹介編4です
元記事
本来、LineTraceを使うところをちょっと違うアプローチで作ってみました。ほんとはBeamParticle自体に当たり判定を付けたかったんですが…w
作り方
無駄に2点間の距離を計算するノードを使っていますが、普通に(Vector)-(Vector)のLengthを取れば良い気がします。
- このイベントが発火したタイミングでのPlayerLocationを取っておく
- 1s後のPlayerLocationと比較してその距離が300以下の時にTrue
- BeamTargetを今のPlayerLocationにセットしてApplyDamage
としてます。Falseの時は取っておいたPlayerLocationのzを0にした値をBeamTargetにしてます。
これのいいところは、敵正面だけでなくちょっとしたホーミングのような感じになるところです。なので割と当たります。デバッグ時も普通に食らってました。
すっごいあっさり終わってしまった…
【UE4】MaterialBillBoardを使った視点=照準のやつを作ってみた
はじめに
ぷちコンで作ったもろもろ紹介編5です
元記事
色々VRのコンテンツを見ていると視点=照準みたいなのが多いけど、実装方法があんまり書いてないなと思ってました。 結論から言えばHUDで実装すればいいのですが、そこにたどり着くまでにつくったMateriallBillBoard版もメモとして書いておきます。
作ったもの
こんな感じでヒットしてる感は出せます。(HUDだと画面に張り付いてる感が大きい気がします…
作り方
PlayerにMaterialBillBoardコンポーネントを追加しておきます。今回はこんな透過pngを用意しました。
でマスクかけたものを使っています。一応UIかなと思ってUIMaterialにしてます。
で、これをあとはLineTraceでHitしたLocationにSetWorldLocationします。
ただこのままだとEventTickでSetすることになるんですが、そうするとPlayerが後退した時にぶれます。
なので入力の方でSetLocationすると解決しました。きっとTickが悪さしてるような気がします。
簡単なイメージ図だけ
こいつこのまま使うと壁にめり込んでしまうので、ちょっと調整したりしてます。
twitterでのメモも載せておきます。
VRとかでよくある視線=照準になるやつ さすがにLineTraceのDebugTypeから移行したいけど、実装方法がわからぬ
— てんちょー@カノちゃん改変中 (@shop_0761) 2016年4月6日
3Dwidgetなのか、単にHitLocationになんか生成してるのか…#UE4Study
MaterialBillBoardにMaterialを割り当てて、Distance to Sizeにカーブを割り当ててみた
— てんちょー@カノちゃん改変中 (@shop_0761) 2016年4月6日
CurveはLineTraceのMaxを2000だとしたとき Time:0 Value: 0.25, Time:2000 Value:2でAuto補正かけた
これバックしながらだとビルボードがLineTraceのHitした位置から左右にずれる…
— てんちょー@カノちゃん改変中 (@shop_0761) 2016年4月10日
結局HUDで作ったら安定してるけどこれVRだったらどうなるんだろ
— てんちょー@カノちゃん改変中 (@shop_0761) 2016年4月12日
【UE4】第5回ぷちコンでボツになってしまったものたち
はじめに
ぷちコンで作ったもろもろ紹介編6です
元記事
作ったはいいけど、ボツになってしまったものたちをここで紹介させてください…
トロンの装備
Cannon
まずCannonはもともとビームではなく、弾を撃ってました。溜め打ちの実装まで作ったり、溜めてる間はゲージっぽいものを作ったりもしました。(こっちは残ってます
けど、世界観が出来上がっていくにつれてビームの方がいいんじゃない?と言われて修正しました。
弾を打つほうが衝突判定は取りやすかったんです、はい。
空を飛ぶ
トロンはもともと場所を指定したところへ放物線上に飛んで行くような感じで作ってました。もちろん今みたいに複数点を巡回する感じではありませんでした。 なので、遠くへ飛ばすときになにかいるなと思って最初に作ったのがWingです。
すごい壮大な感じになってしまいました。そしてこのwingのアニメーションも作ったんですが、どうもしっくりこないし世界観とのズレを感じてまた作りなおしたのがPropellerです。
なんとかコプター的なイメージで作りました。これは結構いい出来かなーと思ってました。けど常時浮いてるし、それならそもそもこういう装備がいらないんじゃ…ってなったのでさよならしました。
解錠
最初はカードリーダーではなく鍵を作ってました。けどこれ作り方を間違えたのかUV展開が上手くいかず、さらには世界観(ry なので割とすぐにボツになりました。
というか今回作ったカードリーダーの名前が分からなくて、なんとかの森で使ったe+カードリーダーを参考に作りました。
まとめ
と考えて作らないと世界観が(ryってなるのでいい加減イメージを固めてイラストにしてから作り始めるべきだなと思いましたw
こう見るとブレッブレですね… なんとか纏まったのが奇跡かもしれませんw
【UE4】twitterで解決したちょっとしたつまづきをまとめてみた(随時更新予定
はじめに
簡単な疑問とか、AnswerHabに投稿するまでもないような内容はTwitterに投げておくと解決したりします。
それらをどこかにまとめたほうがいいんじゃないか、みたいなお話があったのでまとめておきます。随時増えると思うのでちょくちょく書き足していきたいです。
極み本にて
ピボット
UE4本7章のピボット調整がエディタから編集する方上手くいかない
— てんちょー (@shop_0761) August 15, 2015
そもそもピボット位置が変わってないように見える#UE4Study
これは直接筆者の方からコメントを頂きました。
@minahito 4.8.3があったのでそちらでやってました
— てんちょー (@shop_0761) August 15, 2015
再インポートに成功しましたって出力された後カメラの位置が変わるだけで、該当ページの図のようにはピボットが移動してくれないです…
エディタの再起動もしました
@minahito メッシュを一度消してから再度インポートして、先ほどの動画の通りやってみましたがダメでした…
— てんちょー (@shop_0761) August 15, 2015
ピボットが全く動かなかったです…
と、根本的な解決が出来なかったのでその章のプロジェクトデータを使って次の章に進みました。
後日、他の方も同じような問題に遭遇してたみたいで原因はよく分かってません…
Possess
@shop_0761 あれです。BeginPlayのときにバインドするのは1体目のポーンで、リスポーンすると別のポーンを作ったことになる(2体目……3体目……)ので、バインドが必要なのです。1体1体のポーンにとってはバインドは1回しか行われていないことになります。
— minahito (@minahito) August 21, 2015
今となってはそりゃそうかって感じですね…
どんどん明るくなる
これ地味に困ってました。
UE4でただライト置いてるだけなのにどんどん強くなる(明るくなる)のなんでだろ#UE4Study
— てんちょー (@shop_0761) September 10, 2015
そして解決したのは建築本を見た最近です。これskyLightを置けば多少緩和されるのですが、根本的な解決にはなってませんでした。室内でもわぁっとした感じが残ってしまっていました。
なにが問題だったかというと自動露出です。建築本によると
自動露出が設定されていると、プレイ中に明るい部屋から暗い場所に移ったとき、またはその逆のときに、じんわりと目が慣れてきて周囲が見えてくるという効果が現れます。
まさにこれでした。これを切るにはPostProcessVolumeを使います。
このMinとMaxを同じ値にすると切れます。あとは明るさの調整に寄るので数値は調整してください。(UnBoundとかにしておくと楽
アニメーションBPでのGetController
このころ何やってたか思い出せませんが、一応解決してるっぽいですね…
これをUpdateの方でやればちゃんとできる
— てんちょー (@shop_0761) November 18, 2015
なぜか、AnimBP側からPlayするとnoneとActorが入り交じるけど、ちゃんとViewPortでPlayするとなくなる#UE4Study
ポーズの実装
めっちゃ手抜きPause実装できた#UE4 #UE4Study pic.twitter.com/xBFMjxP6cX
— てんちょー (@shop_0761) January 12, 2016
Splineのノード名が変わったっぽい
SplineのGetWorldLocationatDistanceAlongSplineノードがGetLocationAtDistanceAlongSplineに変わったっぽい#UE4Study
— てんちょー (@shop_0761) January 23, 2016
EventTickでの分岐
EventTickをある時だけ使いたい時ってこういうトグル仕込むのが一番いいのかな#UE4Study pic.twitter.com/nG7kCL7sXS
— てんちょー (@shop_0761) January 23, 2016
@salfanic なるほど!それもいいですねー
— てんちょー (@shop_0761) January 23, 2016
GateはSetTimerとペアで使うことが多いので忘れてましたw
ゲート便利です。
物理アセットで見えてる軸
物理アセットの設定してるんだけど、この軸ってどこで回転させるの…?(軸の向きを揃えたい)#UE4 #UE4Study pic.twitter.com/JRuSgdQuQ4
— てんちょー (@shop_0761) February 29, 2016
これ奥のやつだけY軸が上向いてたので揃えられるのかなーと思ったら、モデルの仕様っぽいので気にしないことにしました。(気にしなくてもなんとかなった
マテリアルのstaticBoolParam
マテリアルのStaticBoolParamってBPから変更できないかな(switchさせたい)#UE4Study
— てんちょー (@shop_0761) March 4, 2016
staticだから変更できないのでLerpに直で0,1を入れろというのを発見した
— てんちょー (@shop_0761) March 4, 2016
そりゃstaticなので変更出来ませんよねってなりました。けど、このLerpで解決するのは面白いですね。
TimeLineノードでループ処理をしたい時
メモ ループ内でTimeLineを使うときhttps://t.co/puCYsV9yGs#UE4 #UE4Study
— てんちょー (@shop_0761) March 4, 2016
ForLoop→TimeLineとやると、ForLoopだけ先にぐるぐる回ってしまうので配列の最後の要素だけにTimeLineの結果が反映される感じになったと思います。
なのでTimeLine→ForLoopとすると配列の全ての要素にTimeLineの結果を反映させることができます。すごい。
BTService内でEventReceiveTickAIを使う時
メモ BTService内とかでEventReceiveTickAIを使うときはCall Tick on Search Startにチェック入れないとそもそも走らないっぽい#UE4Study #ue4con pic.twitter.com/zElq6poSD3
— てんちょー (@shop_0761) March 8, 2016
wavファイルが上手く読み込めない
wavファイルなのにmediaPlayerとして読まれてるのなぜ…#UE4Study
— てんちょー (@shop_0761) March 18, 2016
wavファイルは推奨設定がありました。
これに合わせて編集するといいと思います。けど既存のSEとかは再変換しなきゃなりません。
ぷちコン作ってた時はこちらにお世話になってました。一括で変換できるし軽いので便利です。
TimeLineの長さ
このノードいつからあったんだろ 便利そう#UE4 #UE4Study pic.twitter.com/hqEuYvhECI
— てんちょー (@shop_0761) March 30, 2016
これで、3s、5s、7sとかで発火するイベントを仕込んでおいて長さを変更すれば7sのだけ発火させないみたいなことが出来るのかな…
継承とイベント
こんな風に継承元BPでbindだけしておいて継承先BPで同名Eventで上書きしてるのか プログラム感あるなー#UE4Study pic.twitter.com/icBjTL6cAG
— てんちょー (@shop_0761) April 1, 2016
これはおかずさんのmotionControllerSampleでのBPです。
中身を読んだメモを書きました
RemoteEvent
remoteEventの存在を今知った
— てんちょー (@shop_0761) April 4, 2016
これすでにLoadされてる全てのLevelのLevelBPに対してEventNameで指定したEventを探して実行できるっぽい#UE4Study
これ便利なんですが、GameModeとかGameInstanceに処理を書いたほうが安全では…となりました。
配列のコピー
変数として用意した配列の中身もDetails->DefaultValue->"変数名"を右クリック、コピーで全部中身コピー出来てて感動してる#UE4Study
— てんちょー (@shop_0761) April 4, 2016
テレビみたいに見せたい
billboardと3Dwidgetで画像出すならどっちのがいいのかな テレビみたいにしたいんだけど…#UE4Study
— てんちょー (@shop_0761) April 6, 2016
Billboardだとカメラに追従して回転するので3DWidgetのほうが良かったです。
ランダム生成すると出るエラーのひとつ
Failed to stream mip data from the derived data cache for "Map" Streaming mips will be recached
Failed to stream mip data from the derived data cache for "Map" Streaming mips will be recached
— てんちょー (@shop_0761) April 10, 2016
はConstructionScriptでランダム生成した際に出る模様#UE4Study
これランダム生成した壁とか床とかをStaticにしたら出なくなりました。
Animation Notifiesで落ちる
UE4.11.1 AnimationのNotifiesでPlaySoundを設置してるときに、ctr+zで戻ろうとすると今のところ100%落ちる #UE4Study
— てんちょー (@shop_0761) April 11, 2016
ぱっとTextureを表示した時にボケてから徐々にみえるようになる
犯人はmipmapだった #UE4Study
— てんちょー (@shop_0761) April 17, 2016
Helpみたいにボケると困るものはTextureのここを変更するといいみたいです。
参考
3Dwidgetに設定したWidgetクラス
3DWidgetに設定したwidgetClassを取得する方法をやっとみつけた
— てんちょー (@shop_0761) April 25, 2016
もっと早く知りたかった…#UE4Study pic.twitter.com/bIe1vuwVKY
Viveのコントローラの位置がなんか合わない
これに関してはマジでドキュメントに書いておいて欲しい
ありがとうおぎまふさん!
@shop_0761 PlayerStartに回転がかかっているとか…?
— おぎまふ@C91 一日目 西ひ-10a (@ogimafu) May 19, 2016
ViveのMotionControllerをattachしたものがうまく位置トラッキングしてくれない時にPlayerStartのRotationがすべて0になってるか確認すべき#UE4 #UE4Study
— てんちょー (@shop_0761) May 19, 2016
VR用のパッケージング
UE4でVR用にパッケージングするときにレベルBPでExecuteConsoleCommandにStereo Onをするとよさそう #UE4Study
— てんちょー (@shop_0761) May 27, 2016
hmd mirror on/off
ゆるぼ UE4.12.5でhmd mirror offにした後にhmd mirror onにしても元に戻らないのうちだけですか…?#UE4 #UE4Study
— てんちょー (@shop_0761) July 15, 2016
もともとは
hmd mirror moded 2
— てんちょー (@shop_0761) July 15, 2016
とタイプミスしたせいかも
とタイプミスしたにもかかわらず、hmd mirror offと同じ現象になってしまった模様
解決策はこりん(@k0rin)さんに教えていただきました
@k0rin ありがとうございます!なおりました!!
— てんちょー (@shop_0761) July 15, 2016
これこわいですね…
ちなみにUE4.12.5 7月15日現在では
hmd mirror mode [0-4]
でも発生する可能性がある…と思います
(hmd mirror mode 2ではなった)
2016/11/05 追記 これ Oculus系HMD専用コマンドなので、Viveでやるとダメっぽい
ForLoop→TimelineでTimeline終了時にLoopを回したい
ForLoop→TimeLineの順でTimeLineが終了しだいForLoopを回したいんだけど、こんなことできるのかな#UE4Study
— てんちょー (@shop_0761) September 22, 2016
色々ありましたが、たつのる(@tatsunoru)さんに教えて頂きました。
@shop_0761 これは、ForLoopの内部で「Sequenceノード」が使われているためできなくなっています。Sequenceノードは、Delay系やTimelineに遭遇すると次のシーケンスを走らせるからです。つまり、Sequenceノードを取り除いたForLoopをつ
— たつのる (@tatsunoru) September 23, 2016
ForLoop中にTimeLineやDelayノードを使うためのLoopマクロの一例 #ue4 pic.twitter.com/RXChKYvjC5
— たつのる (@tatsunoru) September 23, 2016
だそうです。ありがとうございます!
参考
てかすでにもんしょさんのとこに書いてあったhttps://t.co/67lCLy2G9C
— てんちょー (@shop_0761) September 23, 2016
違う場所(UnrealProjects以下でない)ところに保存したプロジェクトをもうLauncherに表示したくない
こんな感じのこと
@shop_0761 いや、そこにないプロジェクトなんですよ…一度開いたら登録されてしまって。でもそこから動かしたくないので、登録だけ解除したいなって。
— alwei@デジゲー博D-03a (@aizen76) 2016年11月4日
でなんとか発見しました
@aizen76 こんな感じに書いてますRecentlyOpenedProjectFiles=/Unreal Projects/VRTemplate/VRTemplate.uproject
— てんちょー (@shop_0761) 2016年11月4日
どうやらここを参照しているようです。
なのでここを消したりすればいいんじゃないかと思います。
AppDataは隠しファイルなので、表示するようにしてから探しましょう。
参考