みつまめ杏仁

アンリアルエンジン(UE4)でGUIを作るためにゴニョゴニョしてます。UIデザイナーの皆様の助けになれば幸いです。

A と B を交互に切り替える処理でハマった話

TVのリモコンを握っている状況をイメージしてください。

TVが点いていない状態で電源ボタンを押すと起動して、点いている状態で押すと待機モードになります。

どちらの操作も同じボタンを押すことで切り替わります。

このように、A と B の2つの状態があって、一つの関数を呼ぶだけでスイッチングできないかなと思って試してみました。

 

実行するたびに、2つの処理を交互に切り替えたいので、引数で切り替えるのは無しです。

f:id:hiyokosabrey:20161119231759p:plain

ようするに関数を単純に呼び出す(Call)だけでスイッチングしたいのです。

呼び出す側は「関数の中身なんか知ったこっちゃねぇ。」という状況が理想。

さらにシンプルなノードでできると尚良し。でやってみたのがこれ。

f:id:hiyokosabrey:20161119232657p:plain

XOR ノード は 「排他的論理和」というやつで、同じものが来たら反転するというひねくれものです。違うもの同士は足します。↑の場合チェックボックスにチェックが付いている状態なので、

f:id:hiyokosabrey:20161119233741p:plain

結果をすぐに変数にセットしてるので、内容が反転したことになります。

f:id:hiyokosabrey:20161119234253p:plain

 

できれば変数を使わない方法でシンプルにできないかと思ってやってみたのがこれ。

f:id:hiyokosabrey:20161119234611p:plain

結果はというと・・・

f:id:hiyokosabrey:20161119234644p:plain

ここでようやくハマった話。

 

この MultiGate ノードを使ったつなぎ方は一度経験していて、当時はうまくいってました。で今回は「なんで?」となったのです。

結論を言ってしまうと、MultiGateノードは関数内に置くときは取り扱い注意 です。

単に「ランダムな結果を返せ」だったら is Random にチェックを付ければ問題ないです。今回のように上から実行ピン(Out 0 → Out 1 → Out 2 ・・・)を順番に流す場合はうまく働いてくれないことが分かりました。

関数の外に置いてみるとうまく働いてくれます。

f:id:hiyokosabrey:20161119235946p:plain

Epicの公式ドキュメントにそれらしい記述が見つけられなかったので、当たり前の仕様なのか、バグなのかはプログラマじゃないのでなんとも言えないですが、ちょっと謎です。

 

もっとシンプルに切り替えるノードを思い出しました。FlipFlop ノードです。

「MultiGateはそういう仕様なんだ、でもFlipFlopなら状況を打開できるかも・・・」

と淡い期待を抱きつつ・・・

f:id:hiyokosabrey:20161120000725p:plain

こちらも関数内に置いて使うと、Aのピンしか流れません。

外に出してみるとうまく動きます。

 

結局、外部から呼び出してスイッチングしたかったので、カスタムイベントにつなぐことで解決しました。

f:id:hiyokosabrey:20161120001714p:plain

これでバッチリです。

ちなみにマクロの中で使う分には問題なく動作します。

ですが、そのマクロを関数の中に置くと、切り替わらないという結果になります。

 

あくまでも推測ですが、

切り替えるには、状態を保持しておく値が必要で、関数内からはその値が参照できなくなるんじゃないかと思ってみたり。

 

 

ではでは

今回はこの辺で。

ステキなノーディングライフを!