2016年7月23日 ※当初の内容が全て不要となるマクロのハックがありました
ずっと不可能だと思っていた、Object継承のマクロライブラリー内でDelayを利用するハックが存在することを知りました。
1秒ごとウェイトしてループするObject型のマクロライブラリーの実装です。通常Object型でDelayは利用できませんが、Collapse化することでなんと使用可能になります。ありとあらゆる場所で使えます。 #UE4Study pic.twitter.com/eCKWoFqSCR
— alwei@C90日-西d64b (@aizen76) 2016年7月23日
なんと、Delayを利用している部分をCollapse化(折り畳み)すると、普通にDelayを利用できるようになります。上記はForLoopにDelayをつけてループさせるというマクロライブラリーのマクロです。当然親はObject型。
このCollapse化はそのままマクロライブラリー内でやるのではなくて、Delayが利用できる場所で一旦作成し、できたノードをそのままコピペするとマクロライブラリー内で利用できるようになります。
4.7 preview 3 - Delay not available in standard macros - UE4 AnswerHub
普通に一年前以上からこの情報があって、全く知りませんでしたよ…マクロライブラリーでDelay使えるとめっちゃ便利なのでぜひ。
2016年1月7日 ※事実と誤解される部分が多いため記事を大幅修正
Delayノードはとても便利なものですが、これをマクロで利用するためには"Actor"を継承したクラスでなければなりません。
しかしマクロライブラリーを作成した際にどこからでも使用できるようにするためにはObject継承のマクロにしなくてはならず、この場合にはDelayノードを利用する事が出来ません。
ではObject継承のマクロライブラリーではDelayを使用する事が不可能なのか?
Task Wait Delayノード
結論から言うとありました。"Task Wait Delay"というノードを使うとObject継承のマクロの中でも使用することが可能です。
マクロの中でDelayノードが使えないと思っていたら、Task Wait Delayというノードが説明読んだ感じ、ほぼ標準のDelayと同じかつ、それ以上の機能を持っている上にマクロ上でも使えるという大発見をした。#UE4Study pic.twitter.com/w08ZDfwY82
— alwei (@aizen76) 2015, 10月 6
基本的に標準のDelayと同じように使えます。
が、ひとつ制限としてターゲットに"Gameplay Task"インターフェースを要求されます。
Gameplay Taskとは?
公式ドキュメントを調べてみてもほとんど資料は出てきません。
ひとまずアクターに対して、Gameplay Taskコンポーネントというものを追加する事が出来るので、それを追加してみます。
このコンポーネントを引数にしてから、そのままマクロに渡す形式してみたところ、マクロの中で無事Delayが呼び出せました。
アクターにGameplay Taskコンポーネントを持たせてそれを引数にすればDelayするマクロとして動作させることが出来た。#UE4Study pic.twitter.com/BW9T97SbY2
— alwei (@aizen76) 2015, 10月 6
Gameplay Taskコンポーネントに依存するので、少し使い勝手は悪いかもしれません。ただマクロの中でDelayが使えるとやはり便利です。
結局Gameplay Taskについては調べてみた感じでは現状だと、UE4のタスクスケジューラーとして呼び出せる仕組みのようですが詳しい事はわかりません。
コンポーネントの説明をみているとGameplayAbilitiesSystemと紐づくモノらしく、これはゲームプレイ用の複雑なスキルシステムを構築するためのモノらしいです。
一応モジュールを追加すればそのシステムも使えるようですが、詳細はまだよくわかっていません。