CyanTriggerでVRC脱出ゲームを作りたい③ーパスワードギミック・正解の判定編 前半ー
前回の記事では、"CyanTrigger"を用いて数字が書かれたボックスがInteractする度に切り替わるギミックを作りました。
"Interact"と"OnCollisionEnter"を応用することで、例えばボタンをInteractすると隠し扉が開き鍵が出現するギミックなど、さまざまな演出が可能です。これはもう「"CyanTrigger"完全に理解した」と言っても過言ではないかもしれません。
しかし、ワールド作成中に問題が生じました。
どうやってパスワードが合っているか判断するのか全く分からない
過言でした。理解しただなんて、おこがましいにもほどがありました。
"Interact"と"OnCollisionEnter"だけでなんとかなりませんか?→(おそらく)なりません
どうすれば良いかぜんぜん分からないので、プログラマーのフレンドに泣きながら助けを請いました。
フレンドによると、"CustonEvent"というものを使って値が合っているかを確認し、正解ならアクションを起こすという仕組みにするらしいです。
ここから先はフレンドに教わった方法を私なりにまとめたものです。
具体的な説明に移る前に、今回やりたいことを整理しましょう。
今回やりたいこと
前回の記事で、パスワードギミック作成にあたり、やりたいことを大きく2つに分けました。
①数字ボックスの切り替え
②数字ボックスの値が正解か否か判定するギミックを作る
前回は①について説明しましたので、今回の記事では②数字ボックスの値が正解か否か判定するギミックを作るについて見ていこうと思います。
前回の記事でも言及したように、②は、それぞれの数字ボックスの番号を別の場所に格納しておき、それの数値を判断して、正解と一致していた場合アクションを起こす、という仕組みにしようと思います。
このように値を一旦別の場所に保存しておくこと、後から修正や確認がしやすくなります。
今回の記事では、②のうちの、各数字ボックスと"controller"の紐づけを行っていきます。
準備するもの
前回の記事で作った数字ボックス(切り替えギミック含)
パスワード一致時のクリア音
パスワードギミック作成手順
①数値の送り先をつくるー変数の指定ー
Hierarchyで右クリック→"Create Empty"で空のGameObjectを作成します。今回は"controller"という名前にしました。ここで、各数字ボックスの値がどうなっているかを中央管理することになります。
"controller"のInspectorを開いたら、"Add Component"から"Cyan Trigger"を追加します。
数値を管理したいので、今回は"Variables"(変数)の▶を開きます。
「変数」というのは、とりあえすざっくり、"y=x+5"の"x"や"y"のように、何か数値が入る箱のようなもの、と考えておいてください。
次に+を押して"Int"(整数)を追加していきます。"Name"は"box_A"としました。今回はボックスがA~Dの4つあるので(左から順にA、B、C、Dとします)、intも4つ作ります。数字ボックスの最初に表示されている数字は皆"1"にするので、"Variables"の"Value"にはすべて"1"を入れておいてください。
この"Value"に、横に4つ並んだA~Dの各数字ボックスの数値がどうなっているのかが送られます。
② "Custom Event"を設定する
次に、同じく"controller"の"Add Event"から"Custom"を追加します。先ほど作った変数をそのまま更新することもできますが、後で量産する時に非常に見づらくなるため、それらの面倒な仕事を代わりにやってくれる機能をつくりましょう。
まずは一番左、Aのボックスに入った数値を見たいので、"Name"を"set_box_A"としましょう。
ここでボックスAの数値を設定したいので、"Actions"に"int→int.Set"を追加します。
どのような数値を設定するか伝える必要があるので、追加情報として"Actions"のすぐ上の"Parameters"を追加します。この場合、整数値を送りたいので"+""を押したら"int"を選択して、名前を"value"にします。
そうしたら"Actions"に戻り、"Input"を見ます。"Input"のすぐ右の▼を押して"Variable"を選択します。"Variable"の右のボックスの▼を押すと"value"が選択できるようになっているので、それを入れておきます。
"output"は"box_A"とします。これで、一番左の数字ボックスの数値が上の"Variables"で設定した"box_A"に送られることになります。
B~Dも同様に設定してください。
③各数字ボックスの数値を設定する
③-1 各数字ボックスと"controller"との紐づけ
前回作った1~7の数字が書かれた数字ボックス1("alphabet_box_A_1")の"Inspector"を開きます。前回設定した"CyanTrigger"の"Actions"に"UdonBehavior.SendCustomEvent"を追加してください。
これを追加することで、①でつくった"controller"との紐づけを行っていきます。
"▼UdonBehavior"の"Input"に、①で作った"controller"をドラッグ&ドロップします。これで、"controller"の値と、数字ボックス1の値が紐づけられました。
次にその下、"event Name"の"Input"を見ていきましょう。右の▼を押すと先ほど作った"set_box_A(int)"が選択できるようになっているので、"set_box_A(int)"を入れましょう。
そして、そのさらに下の"value"の"Input"に"2"を入れます。これが"2"になっているのは、数字ボックス1を押した時点では、数字ボックス1は消え数字ボックス2に切り替わっている、すなわち一番左のボックスの値は2になっているためです。
③-2 ボックスAの2~7にも同様の操作を行う
同様に、一番左のボックス(A)の2~7についても③-1の操作を行ってください。
この時、ボックス2では"value"の"Input"は"3"、ボックス3では"value"の"Input"は"4"、……のように増えていき、ボックス7では"value"の"Input"は"1"になります。これは、今回ボックス7を押したらボックス1に戻る、という仕組みにするためです。
なお、"event Name"の"Input"はみな"set_box_A(int)"にしておいてください。
③-3 ボックスを4つ並べる
③-1、③-2で作った1~7のボックス(含ギミック)を、コピペして、それぞれB、C、Dに名前を変えて4つのボックスを好きな位置に配置しましょう。
そして、ボックスBの"event Name"の"Input"は"set_box_B(int)"、ボックスCの"event Name"の"Input"は"set_box_C(int)"のようにDまで修正します。
これで、各数字ボックスの作業は終わりです。これで各数字ボックスの数字が"controller"に送られるようになりました!
お疲れ様です!
今回はプログラミング未経験者には直感的に分かりにくい概念もあったかもしれません。極論よく分からなくても、この手順でやれば動くことは動くと思うので、まずは手を動かしてみてもいいんじゃないかなと思います。
次はいよいよ、"controller"で各ボックスの値がパスワードと一致しているかどうかを判定していきます。
参考にしたサイト等
Special Thanks
りーふでさん