Logic使ったゲームワールドを作ろう【本編】

この記事では、clusterで複雑なギミックをつくるために必須な「Logic」について公式記事「的あてゲームをつくる」をベースにclusterクリエイター・vinsさんが解説します。Logicを理解するために必須なトリガー・ギミックが分からない……という方は「準備編」からどうぞ

今回Logicでやっていくこと

こんにちは、vinsです。前回の記事では、Logicを理解するための前準備としてトリガー・ギミックについて解説しました。今回は実際にLogicを使っていきます。

(vinsはLogicに関して自分の勉強会でも話しているので、そちらも見て頂くとLogicへの理解が深まるかもしれません。)

銃の連射速度を制限する例

準備編にも動画を載せましたが、こんな感じの銃を作っていきます。

連射すると音はたくさん鳴りますが、弾は0.5秒に1回しか出ません

銃はこんな感じ

いきなり見ても???となるかもしれませんが、

とりあえずメインになる銃は↑の感じです。

トリガー・ギミックを知ってたら分かるとこをまず見ていきましょう。

名前何をするか
Audio Source撃ったときの音を指定
Itemclusterのアイテムに必ずつけるもの
Movable Itemしかも、動くアイテムだ
Grabbable Itemしかも、持てるアイテムだ
Use Item Trigger「使う」ボタンを押すとOnUseメッセージを自分(This)に送る
Play Audio Source GimmickOnUseメッセージが来ると音を鳴らす

ここまではトリガーとギミックを使える人ならわかるはず!

サッパリだ……という人は、「準備編」から読んだほうがいいかもしれません。。。

そしてこっからが本番!
Logicです。

最終的にやりたい流れはこんなとこです

名前何をするか
Item LogicOnUseメッセージが来たとき、FireWaitFlagがOFFならFireExecメッセージを送る。その後で、FireWaitFlagをONにする
Item TimerFireExecメッセージが来たら、0.5秒後にFireWaitFlagをOFFにする
Create Item GimmickFireExecメッセージが来たら、弾を出す

初見の人はぜんぜんわからないかもしれませんが、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回しか弾が出ない」ってのをやりたかったわけです。

連打しても、弾は1発しか出ない。

そこでFireWaitFlagという「メッセージ(*1)」を作ります!

メッセージというのは、何かを通知したり、データを(1つ)入れて記録しておく箱のようなものです。

(*1)プログラミング経験者の場合、「変数」と考えて頂くのが早いと思います。

FireWaitFlagはBoolのメッセージを使っています。

Boolのメッセージには、「ON」と「OFF」を入れることができます。

これがONになっているときは弾を出さないようにする。

そして、0.5秒たったら自動でOFFになるようにしていきます!

ちなみにFireWaitFlagというのは私が考えた名前というだけで、好きな名前でいいです!TamaTomeruとかでも全然かまいません。

(漢字とかを使うのは……ちょっと打ち間違いとかが怖いですが、それでも別にいいです。)

メッセージを作るってどうすればいいの?

さて、メッセージを作る方法ですが……。

Signalではない、BoolやIntegerやFloatのメッセージを送れば、そのデータは自動で保存されます。そのワールドを出るまで残ります。

(繰り返しになりますが、プログラミング経験者の方は「変数」と考えてください)

HPやMPを保存したり、フラグを保存したりできるイイやつです!

例えばこんな風にすれば、「FireWaitFlag」が「ON」というフラグを保存できます。

じゃあ、改めて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になってます。

  1. さて、銃のボタンが押されました! OnUseメッセージが発動し、Item Logicが呼び出されます!
  2. 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です(というかそっちのがメイン?)
記事をシェアしてワールド制作を盛り上げよう!
ABOUT US
vins
clusterワールド製作者。数字やLogicが出てくるゲームワールドが好き。「クイズ・正解にタッチ!」ゲームワールド杯2020 Unity Japan賞、「カンヅメRPG」GameJAM2020冬 大賞、ほか大加速祭佳作 GameJAM2021夏 UnityJapan特別賞等。

Cluster Creators Guide|バーチャル空間での創作を学ぶならをもっと見る

今すぐ購読し、続きを読んで、すべてのアーカイブにアクセスしましょう。

続きを読む