【UE4】自作アクションゲームにAutoPlayを仕込んでみた
はじめに
ぷちコンで作ったもろもろ紹介編2です。
元記事
今回はCEDECに行った際に聞いたAutoPlayのお話をもとに作ってみました。
講演はこちら。
資料はCEDiLにあります。
実際にAutoPlayしたものがこちら。
考え方
講演の内容をもとに(正確な内容はあやふやですが)AutoPlayの実装方法を簡単に説明します。
-------事前準備-------
マップにConeを置く
そのConeにはいくつかActionを登録しておく
-------実行時---------
ConeのActionを実行する
次のConeについたら上へ戻る
これだけです。AIは使わなくても実装できます。
Actionというのは絵に描いてあるような移動だったり、ジャンプだったりと なんでもいいわけです。
管理、保守など調整しやすいように難しいことはしません。
実装
実際に実装してみると、このConeのBPだけで大部分はまかなえてしまいました。
(あとはループ処理のためのConeManagerを作ったりしたくらい)
方針
ポイントを整理しておきます。
今回は予めConeを配置したあとにNextConeとして次のConeを登録しておく
今ActionをしているConeとNextConeのみCollisionを有効にする(例外あり)
くらいだと思います。
一つ目はConeと同じ型の変数を公開しておき、レベル上で設定していきます。
こんな感じ。
二つ目はそのほうが安全だよねってくらいです。
そして"例外あり"とは、スタート地点はCollisionを有効にしておかなきゃそもそも動かないのでという意味だったり、不具合対処の意味が大きいです。
この辺はまたあとで触れます。(※)
実際のBPはこちら(1-2日で作ったので一応整理したけど散らかっている感)
ConstractionScript
一応確実にジャンプして欲しい場面(大きな穴とか)があるので
全体像
BeginPlay
ここでCollisionの設定をしています。
BeginOverlap
NextConeのCollisionをEnableにしたあと、Wait秒待ちます。
落ち着いてジャンプしてもらうためです。
Debug用にPrintStringしてるだけです。Duration0は便利ですね。
到着判定
NextConeにたどり着いたかどうかをチェックします。
今回はVecLengthでやりましたが、2点間の距離でもいいと思います。
そして、先程の※のお話(ポイントの2つ目)がここで出てきます。
後述するRandomJumpを使っていたりすると、偶然Coneをスキップされてしまい、 Gateが開いたまま移動処理が残ったりする場面が多々ありました。
実装方法に問題があるのは分かっていますが、今回は一定距離が離れたりした場合でも到達したとみなして、処理を打ち切ることにしました。
Move
一応Axisの向きも内積でなんとなく求めておきます。
このMoveActionはキー入力の移動と同じ処理をするだけです。そのために追加したイベントです。
Jump
こちらのJumpは一度だけ確実にジャンプする必要があるときに使います。
JumpActionも先程のMoveActionと同じです。
RandomJump
適当なタイミングで適当に長押し(したフリをして)ジャンプします。
Reset
今回はループさせたかったので、Reset処理を追加しました。
ループさせる必要がないならDestroyしてしまってもいいかもしれません。
(そうするとさっきの※のお話はなくなるはず)
AutoPlayのメリット
最初は なんかすげぇでも作れそう とおもったので勉強がてら作りました。
何がいいかというとテストプレイ(周回系)が楽です。
- 実装に疲れたから、眺めて確認したい
- どうせちゃんと動くだろうから、操作したくない
- Twitterを見たい
などAutoPlayにしておけばこんなに便利です。
あとプレイ動画を撮るのも楽ですね。コミケ等の展示時に流していると面白いかもです。
まとめ
このくらいのスピード感で作ってました。
オートプレイ UE4なら作れるかもしれない
— てんちょー@9/30-10/2東京 (@shop_0761) 2016年8月26日
暇というわけではないけど、ぷちコンのオートプレイを作ってみよう
— てんちょー@9/30-10/2東京 (@shop_0761) 2016年8月28日
AutoPlayできたー
— てんちょー@9/30-10/2東京 (@shop_0761) 2016年8月28日
意外にあっさりできましたね。
ちなみに途中で操作介入できます。(意図的にジャンプさせたり)
なにかわからないことがあれば@shop_0761までお願いします。