てんちょーの技術日誌

自分がつまづいたこととかメモ

【UE4】自作アクションゲームにAutoPlayを仕込んでみた

はじめに

ぷちコンで作ったもろもろ紹介編2です。

元記事

shop-0761.hatenablog.com

今回はCEDECに行った際に聞いたAutoPlayのお話をもとに作ってみました。

講演はこちら。

cedec.cesa.or.jp

資料はCEDiLにあります。

cedil.cesa.or.jp

実際にAutoPlayしたものがこちら。

youtu.be

考え方

講演の内容をもとに(正確な内容はあやふやですが)AutoPlayの実装方法を簡単に説明します。

f:id:shop_0761:20160922233931p:plain

-------事前準備-------

  1. マップにConeを置く

  2. そのConeにはいくつかActionを登録しておく

-------実行時---------

  1. ConeのActionを実行する

  2. 次のConeについたら上へ戻る

これだけです。AIは使わなくても実装できます。

Actionというのは絵に描いてあるような移動だったり、ジャンプだったりと なんでもいいわけです。

管理、保守など調整しやすいように難しいことはしません。

実装

実際に実装してみると、このConeのBPだけで大部分はまかなえてしまいました。

(あとはループ処理のためのConeManagerを作ったりしたくらい)

方針

ポイントを整理しておきます。

  • 今回は予めConeを配置したあとにNextConeとして次のConeを登録しておく

  • 今ActionをしているConeとNextConeのみCollisionを有効にする(例外あり)

くらいだと思います。

一つ目はConeと同じ型の変数を公開しておき、レベル上で設定していきます。

こんな感じ。

f:id:shop_0761:20160922235034p:plain

二つ目はそのほうが安全だよねってくらいです。

そして"例外あり"とは、スタート地点はCollisionを有効にしておかなきゃそもそも動かないのでという意味だったり、不具合対処の意味が大きいです。

この辺はまたあとで触れます。(※)

実際のBPはこちら(1-2日で作ったので一応整理したけど散らかっている感)

ConstractionScript

一応確実にジャンプして欲しい場面(大きな穴とか)があるので

f:id:shop_0761:20160922235517p:plain

全体像

f:id:shop_0761:20160922235538p:plain

BeginPlay

ここでCollisionの設定をしています。

f:id:shop_0761:20160922235553p:plain

BeginOverlap

NextConeのCollisionをEnableにしたあと、Wait秒待ちます。

落ち着いてジャンプしてもらうためです。

f:id:shop_0761:20160922235611p:plain

Debug用にPrintStringしてるだけです。Duration0は便利ですね。

f:id:shop_0761:20160922235629p:plain

到着判定

NextConeにたどり着いたかどうかをチェックします。

今回はVecLengthでやりましたが、2点間の距離でもいいと思います。

そして、先程の※のお話(ポイントの2つ目)がここで出てきます。

後述するRandomJumpを使っていたりすると、偶然Coneをスキップされてしまい、 Gateが開いたまま移動処理が残ったりする場面が多々ありました。

実装方法に問題があるのは分かっていますが、今回は一定距離が離れたりした場合でも到達したとみなして、処理を打ち切ることにしました。

f:id:shop_0761:20160922235644p:plain

Move

一応Axisの向きも内積でなんとなく求めておきます。

このMoveActionはキー入力の移動と同じ処理をするだけです。そのために追加したイベントです。

f:id:shop_0761:20160922235657p:plain

Jump

こちらのJumpは一度だけ確実にジャンプする必要があるときに使います。

JumpActionも先程のMoveActionと同じです。

f:id:shop_0761:20160922235721p:plain

RandomJump

適当なタイミングで適当に長押し(したフリをして)ジャンプします。

f:id:shop_0761:20160923001012p:plain

Reset

今回はループさせたかったので、Reset処理を追加しました。

ループさせる必要がないならDestroyしてしまってもいいかもしれません。

(そうするとさっきの※のお話はなくなるはず)

f:id:shop_0761:20160922235738p:plain

AutoPlayのメリット

最初は なんかすげぇでも作れそう とおもったので勉強がてら作りました。

何がいいかというとテストプレイ(周回系)が楽です。

  • 実装に疲れたから、眺めて確認したい
  • どうせちゃんと動くだろうから、操作したくない
  • Twitterを見たい

などAutoPlayにしておけばこんなに便利です。

あとプレイ動画を撮るのも楽ですね。コミケ等の展示時に流していると面白いかもです。

まとめ

このくらいのスピード感で作ってました。

意外にあっさりできましたね。

ちなみに途中で操作介入できます。(意図的にジャンプさせたり)

なにかわからないことがあれば@shop_0761までお願いします。