VisualScripting奮闘記(外伝)

何が分からんのか分からんのじゃ Vol.1

VisualScriptingによってゲームが簡単に作れる!とか言ってるけど、それは基本的な知識がある人だから出来るのであって「マジで何も知らん人間」には無理な話なんじゃろがい!

そうかもしれん。
…し、そうでないかもしれん。

初心者向けに解説してるつもりでも「当たり前のように使ってるけど、そもそもそれ何」って物は正直山盛りあると思う。俺もある。
生きてきた中で何とな~く?自然と?誰かが話してるのを小耳にはさんで?知った?みたいな?
そんな情報がフンワリ頭の片隅にあって、それがカンに繋がって、結果が出てるだけなんじゃないんかい!!

と言われたら、そうかもしれん。
…し、そうでないかもしれん。

というわけで、このシリーズは「そもそもが分からんので何をどう聞いたらいいかも分からん」という人に向けて、俺が勝手にしゃべるので、何となく小耳にはさんだ気持ちになってくれたらいいな、という程度の温度感でやって行こうと思う。

第一回は0と1についてだよ。

0と1

プログラミング的な何かが僅かにでも耳を掠めた事がある人なら、コンピュータは0と1しか使えない、なんて話くらいは聞いたことがあるはず。

まぁ真偽は知らんけど、この0と1は本当に色んな形で登場する。
こいつに対する触り始めはもうシンプルにアリかナシかだと思っていい。
0はナシ、1はアリ。0はOFF、1はON。

しかし一言に0と1と言っても、ここで言う0と1は何らかの力を持った0と1である。
ゲーム風にいうなら三角形の0-1もあれば四角形の0-1もあるのである。

何言ってんだコイツと思うだろうが、このVisualScriptingって奴はパズルの様な側面があり、三角形の形をした0-1のくぼみや、四角形をした0-1のくぼみがあり、それぞれにあった0-1を使わなければ扉が開かない仕組みになっているのだ。

数字と文字列

ノードによっては直接数字を入力できる物もあるが、無い場合もある。
そういったノードに入力される0と1は、決まった「型(カタ)」の0と1でなければならない。

AとBの大きさを比較するノード。Bには入力欄があるがAにはない。

そもそもこの「1」というのは数字でもあるが、文字列でもある
「トマトが1個」は文章であり、「トマトx1」は数式であるように、1という物を扱う時、それぞれに対応した「型」の1を示す必要がある。

というわけでここからが本題である。

型と色

VisualScriptingでは型はある程度色で別けられているので、一目見れば(一応)その情報がどの型であるかが分かる。

Float フロート 水色
フロートという型は、所謂小数点を扱える数字ノード。
ここに1と入れればそれは数字の1として扱われる。

Floatノード。水色の出力がある。

Integer インテジャー 薄翠色
インテジャーという型は正数を扱う数字ノード。
Int(イント)と略される。色が近すぎてパッと見判別がし辛い。
ここの1もFloat同様数字の1として扱われる。

Integerノード。ほんのり翠。

String ストリング オレンジ色
ストリングという型は文字列を扱うノード。
ここに1と入れた場合、それは数字ではなく文字の1として扱われる。

Stringノード。分かりやすいオレンジ。

FloatとIntegerは数字ノードなので、足し算や掛け算といった基本的な計算が出来る。

Multiplyは掛け算するノード。

因みに足し算はAdd、引き算はSubtract、割り算はDivideである。
これらの計算ノードにも型が有るので、計算対象をよく見る必要がある。
…が、Float型とInt型は型が違っても同じ数字ノードなので計算ノードにつなぐことができる。
Vector3の鍵穴が付いたMultiplyにFloatの鍵やIntegerの鍵は入らない。

Tips

Stringノードに入力された文字が数字だったとしても、それは数字ではなく文字として扱われるので、Float x Stringといった計算で結果を得る事は出来ない。

鍵穴の形が違うのでそもそも繋がらない。

ノードが対応しているInputは大抵の場合色で判別できる。
Floatは水色、Integerは薄翠で示され、Stringはオレンジで示される。
これはInputに限らず、Outputも同様で、出口の色でどの型が出てくるかが分かるが、色弱体質である場合、この判別はとても難しいと思う。
なので、色に頼れる人は頼るのも手であるが、繋いでいるノードの名前をしっかり確認するようにはしよう。

0と1とBoolean

0と1と同等の機能を持つBoolean(ブーリアン)という物がある。
BooleanはしばしばBool(ブール)と略される。

✅が付いてるとTrue。外れてるとFalse。

Boolも原則0と1であるが、これは数字ではなく、True(トゥルー)False(フォルス)であらわされる。
Trueが1でFalseが0だと思って貰って問題ない。

Ifノード
このBoolが使われる代表的なノードがIfノードである。
Ifノードは入力に対してTrueかFalseかをチェックして、それぞれに対応したフローに分岐させるノードである。

紫の入力にBoolが入る。

Boolの入出力は紫色で示される。
例えばAndやOrなんかはGoogle検索で使う事もあり、なじみ深いと思う。

AndはAとBがどちらもTrueだった場合はTrue、違う場合はFalse。
OrはAまたはBの何れか一つでもTrueだった場合はTrueとなる。
Exclusive OrはAかBがTrueだった場合はTrue、どちらもTrueだった場合はFalseとなる。

他に良く使うところでは入力Aと入力Bを比較するGreaterEqual(AがB以上であるか)、LessEqual(AがB以下であるか)等がある。
それぞれYesであればTrue、NoであればFalseが出力される。

この場合は2は0よりも大きいのでTrueとなる。

LessEqualの最も分かりやすい使用例は、現在のHPが0以下になったらGameOverに分岐する、といった形で使う。

Tips

このIfノードの入力にIntegerやFloatを直接繋ぐ事は出来ない。
例え同じ0や1であったとしても、型が違うので繋ぐことはできない。
当然Stringで1を入力しても、型が違うので繋ぐことはできない。

Float1を繋ぐことはできない。

これが最初に言った三角の0-1穴には三角の0-1鍵、四角の0-1穴には四角の0-1鍵を使わねばならない、という話である。

Tips

FloatとInteger

この二つの型同士で計算する事は出来るが、それによって出てくる結果はFloatになる。

Multiply(掛け算)ノードはInput、Output共にFloatとなっているが、Integerを繋ぐことも出来る。
IntegerとIntegerを掛けても、OutputsがFloatである以上、出てくる数字はFloatになる。

これがどういう問題を引き起こすかというと、VisualScriptingではSwitch on Integerというノードがあり、これは入力されたIntegerによってその後の処理を分岐させるノードであるが、ここで入力して良いのはIntegerのみである。

入力されるIntegerによって分岐されるSwitch on Integerノード。

計算結果が1、2、3…であれば問題なく分岐されるが、1.1、2.5、3.4、といった数字だった場合、ここでエラーになる。
そこで役立つのがFloorというノードである。

Floorというノード (水色)
Floor(フロアー)というのは小数点を切り捨てるノードである。
つまり、何らかの計算で小数点が出てきてしまう可能性がある時、このノードを挟む事で、小数点を切り捨てて整数にしてくれる。

小数点を切り捨てるFloorノード。

Switch on Integerの前にFloatを使った計算が挟まる場合は、Floorを使って整数化させることでエラーを回避する事が出来る。
Floorが繋ぐことができるのは基本的に同じ色であるFloatだけである。
(Integerも繋がるが、そもそも整数なので繋ぐ意味はない)

Clampというノード
Clamp(クランプ)というノードは、入力されたあらゆる数字や色をFloat0~1の中に丸め込む(0以下をカットし、1以上をカットする)ノードである。
音屋で言うならコンプレッサーの様な物。
99という数字が入力された場合は1になり、3という数字が入力された場合も1になる。
0.5という数字が入力された場合は0.5のままであり、0が入力された場合も0のまま。
-523という数字が入力された場合は0になり、-28963という数字が入って来ても0になる。

入力された数字を0~1の範囲に丸め込むClamp01ノード。

Clampはノードによっては最小数値と最大数値を自分で設定できる。

入力された数字(Valur)を-100~5000の範囲に収めるClampノード。

Random
場合によっては数字をランダムで設定したい事もあると思う。
そういう時はRandomノードを使うわけだが、VisualScriptingのRandomは出力がFloatとIntegerで違うノードになっている。

左がFloat、右がInteger。分かりにくい。

Switch on Integerを使う場合はIntegerで無ければならない。
武器の攻撃力にブレ幅がある場合はRandomFloatを使う手もあると思う。

ゲームを遊んでいると、しばしば「一見整数ダメージしか出てないが、内部では小数点計算されている」というケースを見かける事もあると思うが、これは計算自体はFloatで行い、画面上にダメージ(UI)を表示する前にFloorで小数点をカットし、表示される情報をコンパクトに纏める、といったことをした結果である。

実際に作って見ると、いじわるではなく気づかいの一つであるのが分かるが、それはそれとして、正確な情報が欲しい気持ちも良くわかる。

Tips

余談ながらSwitch On IntegerをRandomRangeで分岐させる場合、表示されている数字よりも1多い数字を指定しないと、最大値(↓の場合2)が出ない。

0、1、2それぞれに分岐させるには、RandomRangeを0~3にする必要がある。

何でかはしらん…
一生0~2で良いじゃんって思って生きてる…
六面体ダイスを作ろうと思ったら0-6ではなく0-7にする必要がある事を覚えておこう。

おわり

というわけで様々な形で登場する0と1について書いてみた。
が、どちらかというとFloatとIntegerの話がメインだった気もする。

こういうのってエンジニアには基本も基本ドキホンの神みたいなところがあるので、わざわざ説明するとか意味が分からんと思うけど、分からんもんは分からんし、分からんが故に調べ方も分からんのだから、誰かが勝手に話してるのを小耳にはさむくらいのノリで知れるチャンスがあるべきだと思うのだ。

次回は未定。