
概要
Boltが正式に無償化したということで、今回はBoltなどのビジュアルスクリプティングで気を付けたいことを1つ共有したいと思います。
この話はBoltに限らずUE4のBluePrintなどでも当てはまると思います!
Boltについて
【無償化】Bolt ビジュアルスクリプティングがすべての Unity ユーザーにご利用いただけるようになりましたhttps://t.co/mVWuMbiiMo pic.twitter.com/qkA1MyYXzR
— ユニティ・テクノロジーズ・ジャパン (@unity_japan) 2020年7月22日
Boltの参考動画
以下の動画が参考になると思います!
補足
Unit (Boltにおけるノード) は <Unit名> で表現します。
以下のSet Variable Unitは <Set Variable> として記載します。

問題
早速ですが私がぶち当たった問題を簡単に表現したグラフを見てみましょう。
以下のグラフには問題があります!

良かったらちょっと考えてみて下さい!
処理の流れとしては以下を想定して実装しています。
TimeCount+deltaTimeの結果をTimeCountに格納Set Variableした値をDebug.Logで出力- やりたいことは更新後の
TimeCountの確認
答え
初期変数を以下とすると、ログには何が出力されるでしょうか?
TimeCount = 2.96deltaTime = 0.02
答えは 3.00 です!
deltaTimeが2回足されたものになっています!

※理由がわかっている人はこの後の話はつまらないと思いますw
要注意ポイント
おそらくほとんどの人が気にしたと思いますが、以下の赤色と橙色の丸で囲った部分が要注意ポイントです!

Unitは「そのUnitのOutputが要求されたときに、そのUnitが処理してOutputを出力」します。
そして、今回の<Add>は<Set Variable>と<Debug Log>の2つからOutputが要求されているため、
1フレームに2回<Add>が動くことになります。
<Add> は処理したときのOutputの値を所持することはなく、要求毎にOutputを出力します。
処理の流れ
1. Set Variableが実施
<Set Variable>が<Add>のOutputを要求<Add>が自身の処理を実施- Outputは
<Time>のdeltaTimeと<Get Variable>のTimeCountを取得して加算したもの
- Outputは
<Add>がOutputを<Set Variable>に渡す<Set Variable>がOutputをTimeCountに格納
2. Debug.Logが実施
<Debug.Log>が`のOutputを要求 <Add>が自身の処理を実施- Outputは
<Time>のdeltaTimeと<Get Variable>のTimeCountを取得して加算したもの - この時点で取得された
TimeCountは「1.」でdeltaTimeが加算されたものになっている
- Outputは
<Add>がOutputを<Set Variable>に渡す- <Debug.Log>がOputputをコンソールに出力
詳細に処理の流れを説明するとこんな感じでしょうか 。

「<Add>が2回動く」、「2回目の<Add>が使用するTimeCountが加算済みのものになっている」ことで、ログには2回加算されたTimeCountの値が出力されたんですね。
解決策
Set Variable のOutput から取得
<Set Variable>のOutputは処理した時のものが保持されるようです。

ついでに以下のように、<Set Variable>が保持されているかの確認もしてみました。
変数から直接取得
今回やりたいことは更新されたTimeCountの値を知りたいだけです。
よって単純に変数から取得すれば問題ありません。

プログラマーはコーディングしているときは意識することなくこの形を取っていると思います。
今回紹介したパターンはビジュアルスクリプティング特有かもしれませんね。
複雑なグラフでの例
今回はシンプルな例で紹介しましたが、実際は以下のようにたくさんのUnitから成るグラフでも発生すると思います。

こちらの例でも<Add>から2回Outputの要求が発生するため、同様の問題が起きます。
雑感
いよいよBoltが無償化しましたね。
実は自分、2年ほど前にBoltを買ってたんですが1回も使ってませんでした。。。(無償化してから使うというUnityユーザのプチあるあるw)。
Playmakerとかもちょいちょい触っていたんですが、これからはBoltも触っていこうと思います。
UE4のBluePrintを触ったことがあったせいか、わりとすんなり扱うことができました。
(ちなみにBoltのControl Schemeという設定のデフォルト名は「Unreal」だったりしますw)
Bolt2というものも予定されているようなので、Unityでもノードベースのビジュアルスクリプティングがもっと盛り上がりそうですね!
BluePrintにもあるInterfaceとかも導入されると個人的にはうれしいです。
それでは~。
