てんちょーの技術日誌

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

【UE4】Switchの作り方にこだわってみたくなった話【小ネタ】

今年に入ってまだ全然ブログ更新出来てないので書いてみた。

最近BPのリファクタリング?的な感じでどう組むのが一番いいのか 考える余裕が出来てきて、「あれすれば出来るけど、もっといい方法ないかな」 みたいなことがGGJ中にも思ったりしてて、今回の件に至りました。

そんな堅苦しい感じじゃなく ぼくのかんがえたさいきょうのすいっち みたいな感じです

作りたいスイッチ

押したら終わりではなくて、押して数秒後に元に戻るスイッチを前提に考えて います。UE4本でもありましたね。(P262くらいからのお話)

基本Switchに追加したBoxCollisionをTriggerにしてLerpノードで沈ませてDelayして元に戻すみたいな実装だと思います。 (他にあるなら知りたい)

で、今回やりたかったのはこれ

でできたのがこちらです

実際のActor

f:id:shop_0761:20160215212948p:plain

BP全体図

f:id:shop_0761:20160215212426p:plain

中身

では左側から

f:id:shop_0761:20160215212500p:plain

複数ヒットを避けるためにDoOnceしてます。一巡したらResetするようにしてます。 イベントディスパッチャで拾えるようにしたりしてます。

右側は

f:id:shop_0761:20160215212706p:plain

Switchって変数はStaticMeshで用意した実際に押したら引っ込むところです。 今回の肝はGetUpVectorとTimeLineノードのDirectionピンです。 DirectionピンはTimelineノードが順再生なのか逆再生を取れるピンです。便利。

ここで何してるかというと、GetUpVectorで取った向きにDirectionで取ったTimeLineノードの向きから 押すのか戻すのかを取った後、SwitchMoveOffsetで移動する距離を準備して元のSwitchのLocationに加算したものをLerpかけてます。(すごい呪文みたいになった

これ、さっきのTweetのように一時変数を用意すればこんなことする必要もなくTimeLineノードを逆再生すれば済む話なんです。けど用意するのはなんか嫌だし、出番がそこしか無いのに使うのは美しくない!!そう思ったわけです。

そこでDirectionピンから加算するVectorの符号を変えることで成し遂げました。

であとはDirectionピンからswitchしてSwitchTurnOffTime分だけDelayをかけて逆再生した後にイベントディスパッチャ呼んで終わりみたいな流れです。

実際に動いてるのはこんな感じ

足元にスイッチ、奥には同じように実装したブロックです。 よくよくみるとちゃんとスイッチが浮き沈みしてます!

おわりに

なにかとよくあるSwitchを皆さんどんな風に実装してるか興味あるので どしどし教えて下さい!(勉強したい

今回はまだ腑に落ちない点はSwitchMoveOffsetで手動でボタンの凹み具合を調整しなきゃならないところなので思いついたら更新します。 多分スケールとかから取ったりしたらよさそう。

現状 ぼくのかんがえたさいきょうのすいっち でした。