この記事では、clusterで複雑なギミックをつくるために必須な「Logic」について公式記事「的あてゲームをつくる」をベースにclusterクリエイター・vinsさんが解説します。Logicを理解するために必須なトリガー・ギミックが分からない……という方は「準備編」からどうぞ
今回Logicでやっていくこと
こんにちは、vinsです。前回の記事では、Logicを理解するための前準備としてトリガー・ギミックについて解説しました。今回は実際にLogicを使っていきます。
(vinsはLogicに関して自分の勉強会でも話しているので、そちらも見て頂くとLogicへの理解が深まるかもしれません。)
銃の連射速度を制限する例
準備編にも動画を載せましたが、こんな感じの銃を作っていきます。
連射すると音はたくさん鳴りますが、弾は0.5秒に1回しか出ません。
銃はこんな感じ
いきなり見ても???となるかもしれませんが、


とりあえずメインになる銃は↑の感じです。
トリガー・ギミックを知ってたら分かるとこをまず見ていきましょう。
名前 | 何をするか |
---|---|
Audio Source | 撃ったときの音を指定 |
Item | clusterのアイテムに必ずつけるもの |
Movable Item | しかも、動くアイテムだ |
Grabbable Item | しかも、持てるアイテムだ |
Use Item Trigger | 「使う」ボタンを押すとOnUseメッセージを自分(This)に送る |
Play Audio Source Gimmick | OnUseメッセージが来ると音を鳴らす |
ここまではトリガーとギミックを使える人ならわかるはず!
サッパリだ……という人は、「準備編」から読んだほうがいいかもしれません。。。
そしてこっからが本番!
Logicです。

最終的にやりたい流れはこんなとこです
名前 | 何をするか |
---|---|
Item Logic | OnUseメッセージが来たとき、FireWaitFlagがOFFならFireExecメッセージを送る。その後で、FireWaitFlagをONにする |
Item Timer | FireExecメッセージが来たら、0.5秒後にFireWaitFlagをOFFにする |
Create Item Gimmick | FireExecメッセージが来たら、弾を出す |
初見の人はぜんぜんわからないかもしれませんが、1つずつ説明していきます。
※「自分(This)に送る」表記は省略します。
今回の銃の話では、ぜんぶThisなので。
Logicの流れを見てみよう
まず、まさに「Logic」の名前がついたItem Logic。

その部分だけ抜き出した画像がコレです。1つずつ見ていきましょう。
キホンの部分
まず一番上のほう……
KeyにOnUseと書いてあります。
なので、ワールド内で銃のボタンを押してUse Item TriggerからOnUseメッセージを受け取るとLogicが動き始めます。
ちなみにPlay Audio Source Gimmick(音を出す)もOnUseで動くようになっています。Keyが同じなら、1つのメッセージで2つ以上のギミックとかLogicとかを動かせる。コレはトリガーとギミックを使える人なら知ってますよね。
Logicの中でなにしてる?
で、何をするか。
「連打しても、0.5秒に1回しか弾が出ない」ってのをやりたかったわけです。

そこでFireWaitFlagという「メッセージ(*1)」を作ります!
メッセージというのは、何かを通知したり、データを(1つ)入れて記録しておく箱のようなものです。
(*1)プログラミング経験者の場合、「変数」と考えて頂くのが早いと思います。
FireWaitFlagはBoolのメッセージを使っています。
Boolのメッセージには、「ON」と「OFF」を入れることができます。
これがONになっているときは弾を出さないようにする。
そして、0.5秒たったら自動でOFFになるようにしていきます!
ちなみにFireWaitFlagというのは私が考えた名前というだけで、好きな名前でいいです!TamaTomeruとかでも全然かまいません。
(漢字とかを使うのは……ちょっと打ち間違いとかが怖いですが、それでも別にいいです。)
メッセージを作るってどうすればいいの?
さて、メッセージを作る方法ですが……。
Signalではない、BoolやIntegerやFloatのメッセージを送れば、そのデータは自動で保存されます。そのワールドを出るまで残ります。
(繰り返しになりますが、プログラミング経験者の方は「変数」と考えてください)
HPやMPを保存したり、フラグを保存したりできるイイやつです!

じゃあ、改めてLogic見てみよう

というわけで、改めてLogicのとこの画像です。
赤い文字で書いてあるとこを見てください。
一番上、FireExecと書いてあります。
その下は、=Equals(イコール)。
FireExecのメッセージは毎回送られるとは限りません。
ここのLogicでは、=Equalsが選ばれているからです。
その下に書いてある「条件」がOKのときだけ、メッセージが送られます!
では、「条件」はどうなっているか?
- 「RoomState This」の「FireWaitFlag」
- 「Constant Bool」の「OFF」(チェックが入っていないから「OFF」!)
これがイコール、同じときにOKと判定されます。
ここも1つずつ見ていきましょう。
やりたいことは、FireWaitFlagがOFFのときだけFireExecメッセージを送る、です。(んで、FireExecメッセージが来たらCreate Item Gimmickで弾を出すわけですね)
条件の書き方
まず、「メッセージ」の中身を見たいときはRoomStateを選びます。
(RoomStateって何? と思われる方が多いのですが、「以前保存したメッセージの中身をチェックしたい」ときに使うと考えればいいと思います。)
今回は銃にデータを保存するので、Thisを選びます。
そして「FireWaitFlag」と記入!
これが「メッセージ」の名前になります。
そして、今回は「OFFかどうか?」をチェックしたいので……
ConstantのBoolを選び、チェックボックスはOFFにします。
Constantってのは定数、決まった値ってことです。コンスタント。

そして、「FireWaitFlag」が「OFF」と「=Equals(イコール)」をチェックしている。つまり、「FireWaitFlagがオフかどうか?」をチェックしているってことです!
このチェックがOK(FireWaitFlagがOFFだ!)のときだけ、FireExecメッセージを送ってくれるようになります。
↓にまた同じ画像が出てきているので、確認してみてください。
まだまだ続くよLogic

さて、その次の部分(青い文字のとこです)。
今度はFireWaitFlagが指定されてて、その右はBool。
次のとこに「=」が選ばれてますね。
そして、「Constant」「 Bool」でチェックボックスがONになってます。
これは……FireWaitFlagをONにしろ、という意味になります!
「=Equals」と「=」はパッと見に「同じじゃね?」と思ってしまいそうなんですが、実はゼンゼンちがいます。
「=」は、その下にある値をそのまま送れ! って意味です。
今回の場合、「Constant」「 Bool」でONが指定されているので、この「ON」という値をそのままFireWaitFlagの中に入れてくれます。
そして重大な注意ポイント!

FireWaitFlagの右のほうが、SignalじゃなくてBoolなんです!
ON/OFFが設定できるBoolの値を入れたいので、Boolを指定するんです!

「Constant Bool」のほうにBoolあるのにもっかい指定すんの? と思うかもしれませんが、そうです! 2カ所で指定してください!
よくわからない人は、「メッセージに値を入れたいときはSignal以外で!」と覚えましょう!
このLogicで、何が起きるか?
で……、こうすると結局なにが起きるんでしょうか?
メッセージは初期状態だと0とかOFF(False)とかが入っています。
なのでFireWaitFlagも、最初はOFFになってます。
- さて、銃のボタンが押されました! OnUseメッセージが発動し、Item Logicが呼び出されます!
- FireWaitFlagはOFFです、だからFireExecメッセージが発動します!
その後で、FireWaitFlagがONになります。

これの水色の部分ができました!
その後、何が起きるのか?
ItemLogicさんによるキビシイ(?)チェックを通り、FireExecメッセージが無事発動しました。
こっからどうなるでしょう。
フツーに弾を出す
まずCreate Item Gimmickが呼ばれて、弾が出る部分はcluster公式の的当てゲームを作る記事と何も変わりませんね。

Create Item Gimmickわからん……という人は「準備編」やcluster公式の的当てゲームを作る記事に戻ってみましょう。
Timerを使う
一方、Item Timerのほうはまだ使ったことがないという人もいるかもしれません。
でもそんなにムズカシイもんじゃないです。
指定した時間だけ待ってから、メッセージを送ったり値を設定したりできるもんです。

TargetとKeyは弾を出すギミックと同じ。
なので、このItem TimerもFireExecメッセージが発動したときに呼ばれます。で、Delay Time Secondsで何秒遅らせるか指定してます。今回は0.5秒ですね。
そしてTriggersで、0.5秒後にやりたいことを書いていきます!
Triggers部分 |
---|
メッセージはFireWaitFlagを指定。 |
ParameterTypeはBool。FireWaitFlagはONとOFFだけ入れたい変数だからですね。 |
そしてBool Valueと書いてあるチェックボックスはOFFにしておく。 |
これで、「0.5秒後にFireWaitFlagをOFFにしろ!」という意味になります!

ついにこれで、全部できました!
これを出発点に、Logicで色々できるようになりますよ!
ほかに、Timerで知っておくと良いこと
- 待ち時間以内(今回なら0.5秒以内)にまたFireExecが来るとタイマーは0秒から数え直しになります。今回は弾を出した後はFireExecが発動しないようにItem Logicを書いてあるから問題ないですが、Timerが短い時間で何度も呼ばれるようにするといつまで経っても何も起きません。
- カン違いしがちなのですが、「Timer発動→○秒経過→何か起きる」は自動でループしません。「1秒たったら弾を出す→また1秒たったら弾を出す→また1秒たったら……」みたいのをやりたい場合は、TriggersのSizeを2以上にして、Item Timerを再発動させると良いでしょう。
- FireWaitFlagのようなメッセージの値を直接設定するのではなく、Signalのメッセージを弾を出すとか音を出すとかのギミックに送っても、Item Logicなどのロジックを呼び出しても全然OKです(というかそっちのがメイン?)