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

9 min read読了の目安(約8100字

Cluster Creator Kit Advent Calendar 2020の5日目の記事です。

(※この記事は「準備編」です。Logicのキホンは分かっていたり、トリガー・ギミックについてはもう全然不安とかないって人は「本編」から読んじゃってください~)


どうも、vinsといいます。
この間のcluster ゲームワールド杯で「クイズ・正解にタッチ!」を作りUnity Japan賞を頂きました(^-^)
クイズ・正解にタッチ!

この記事がオススメなのは……

この記事がオススメなのは……

  • clusterでワールドを作ったことがある人
  • そのとき、トリガーとギミックをいちおう使ったことがある人(カンペキに理解してなくてもいいです。この記事でも少し説明してます)
  • でもLogicってのがなんか良く分からない

です!

Logic使ってますか~?

clusterのゲームワールドでLogicが使えるようになって4ヶ月くらい。
HPやMPがあるゲームを作ったり、脱出ゲームのフラグに使ったり……
ゲームっぽいゲーム」を作るにはゼッタイ必要なものなんですが。

「むずかしい! わからない!」と感じる人も多いみたいです。

ちなみにLogic登場は夏のcluster GameJam(2日間でゲーム作成大会)のホントに直前。
GameJamで使おうとがんばって泣いた人も多いハズ……

これまではクセがあった……

初登場のときのLogicにはちょっと? クセがありました

今じゃあまり関係ないけど、こんなクセ
  • プレイヤーじゃなくて、アイテムにHPやMPを持たせないといけなかった
  • HPとかを画面に表示するのも、アイテムにHP表示をくっつけるとかしかなかった

なので、これまでのclusterは「手に持った銃にHPがあって、銃のHPが0になるとゲームオーバー……」みたいな作り方をしないといけなかったのです。。。
とうぜん「銃を捨てたらどうなるの? VRの人は銃を2つ持てるけど、それはいいの?」みたいなメンドーな話が出ることに……

……このあたりのクセもあって、よけいに「Logicむずかしい! わからない!」も増えていたと思います。

しかし!

でも、2020年11月25日、ついに!

  • プレイヤーがHPやMPを持つ
  • フツーのゲームみたいにHPとかを画面に表示する

これがclusterでデキるようになりました。めでたい。

よくあるこんな感じのゲーム

Logic自体のむずかしさはまだありますが、「なんでこんなヘンな作り方しなきゃいけないの?」はだいぶ減りました。
clusterでスッキリとゲームを作れる時代のはじまりです!

今こそLogicをはじめよう

これから冬のcluster GameJamもあります。
Logicを使ったゲームを作れるようになると、グンとできることが増えますよ!

というわけで、この冬こそclusterでLogic始めていきましょう。

でもまずはトリガーとギミックの理解から!

「Logicわかんない! だけどトリガーとギミックなら使ったことあるよ!」って人はいると思います。
それは重要なことです。
Logic使うなら、まずはトリガーとギミックを知っておかないといけません。

トリガーとギミックってなんだっけ


なんだっけ

  • 「何かが起きたぞ」→トリガー(当たった、ボタン押した、アイテム拾った……)
  • 「何かをさせるぞ」→ギミック(音を出す、弾を出す、アイテム動かす、アイテム消す……)
    とりあえずこんな感じですかね。

開発者さんもこう言っている

こちらはclusterの開発者・ねおりんさんのTweet。
オペレーションってのはひとまず、Logicのことだと思ってもらえればいいです。

トリガーとギミックの間にはさんで色々やるものが、Logic(オペレーション)。
なので、Logicを理解する前に、まずトリガーとギミックを理解しなくちゃいけません!

トリガーとギミックでやれることを、より広げていくのがLogicと考えてもいいです。
逆にLogicだけ使えるようになっても、何も起こせない……

トリガーとギミックは、公式の的当てゲームを理解できればOK!

トリガーとギミックについては、cluster公式の的当てゲームを作る記事が良くまとまっていると思います。
なので、的当てゲームの記事を見て、自分でもマネできるようにしましょう。

cluster公式より引用、的当てゲーム

テンプレートワールド 「シューター」でもいいですが、こちらはLogicの話も入っているワールドです。
けっこうフクザツなので、今読んでいるこの記事を読み終わってからさわったほうがいいかも?

的当てゲームの記事を読むときのヒント

的当てゲームの完成形は↓こんな風↓になってます。

  • 銃(Gun)といくつかの的(Target)がワールドの中に置いてある
  • 弾(Bullet)はPrefabになっていて、銃を使うと出てくる

PrefabというのはフツーにUnity使っていてもちょっと???ってなりやすいとこです。
なんで、ひとまずは何も考えずに公式の的当てゲームの記事にある 「弾」アイテムのPrefabを用意する をマネしてみてください。

的当てゲーム、トリガーとギミックの流れ

的当てゲームは、主に4つの部分からできています。
「銃を使う」「弾が出る」「弾がぶつかる」「的の動き」。

さらに中身を見ていくなら……
1.銃を使う
銃を拾い、「使う」ボタンを押すとUseItemTriggerが発動!
CreateItemGimmickが呼ばれて、「2.弾が出る」へ。
PlayAudioSourceGimmickも呼ばれて、バァーンと音がなる!
2.弾が出る
弾が出た瞬間、OnCreateItemTriggerが発動!
AddInstantForceItemGimmickが呼ばれて、弾のスピードが決まる(前に飛び始める)。
その後、弾が何かにぶつったら「3.弾がぶつかる」へ。
3.弾がぶつかる
弾が何かにぶつかるとOnCollideItemTriggerが発動!
DestroyItemGimmickが呼ばれて、弾が消える。
さらに、当たった相手が的ならば「4.的の動き」へ。
4.的の動き
3.弾がぶつかる」のOnCollideItemTriggerからつながってる!
PlayAudioSourceGimmickが呼ばれて命中音がなる!
SetAnimatorValueGimmickで、的がクルクル回る。

……トリガー・ギミックが苦手な人は、こういうのを読むと

こうなるかもしれませんが
元記事にはスクショの画像とかも多いんで、ゆっくり1つずつ理解していってくださいね。

元記事とこの記事と両方読むとわかりやすく……なるような気がします。。。

的当てゲーム、特にムズカシイところ

  • 弾をPrefabにするところ。(操作方法も、なんでそうするのかもちょっとムズカシイ)
  • 「3.弾がぶつかる」でOnCollideItemTriggerCollidedItemOrPlayerが指定されていて、そこから「4.的の動き」のギミックが呼ばれるところ。
  • 的を動かすときのSetAnimatorValueGimmickの部分。
     
    ↑この辺に関係してるとこは、特に気合いを入れて公式の的当てゲームの記事を読んでください。

(……というかUnityのアニメーションが全体的にムズカシイ……ぶっちゃけ的当てゲーム記事の、的が回るとこだけ無視してもOKな気がする!?

トリガー・ギミックだけだと何がマズイのか?

やーっと本題のLogicに入れます。

ながかった
的当てゲームを見ればわかるとおり、トリガー・ギミックだけでもちゃんとゲーム作れているように見えますね。
でも、それだけじゃ限界があるんです!

この的当てゲーム、連射しようと思えばいくらでも連射ができてしまいます
単純な的当てゲームならいいですが、もっとフクザツなゲームだと……

  • ワールド内に弾が増えすぎて、めちゃくちゃ重くなる
  • 連射スピードだけで勝負が決まるつまらないゲームになってしまう
    みたいな問題が。

弾がムダに多く飛びすぎるとcluster本体にもメーワクがかかります。
あんまり異常に増えると、制限されて弾が出なくなることも……

じゃあどうしよう


どうしよう
連射スピードが速すぎる問題を解決したい……どうすればいいでしょう?

問題は、「銃を使う」トリガー と 「弾が出る」ギミックが直結していることです。
「銃を使ったら、無条件で弾が出る」。
これを、
「銃を使って、しかも○○だったら、弾が出る」。
こうできればいい。

実際にやってみた

実際にやってみた例が、↓の動画です。
ボタンを押せばいくらでも音はなりますが、弾は0.5秒に1回しか出ないようになっています。

今回の記事を最後まで読めば、Logic使ってこういうゲームワールドが作れるようになる……はずです。

そろそろLogicに踏み込んでいこ~

さて、何回も書いてますが……
Logic(オペレーション)は基本的に、トリガーとギミックの間にワンクッションはさんで流れを変えるためものです。

Logicをはさんだ例

トリガー「使う」ボタンを押したぞ!
Logic 連射が速すぎないか? MPは足りてるか?
ギミック 弾を出したり、出さなかったり
トリガー「弾が当たったぞ!」
Logic その敵、HPがまだあるか?
ギミック 敵を消したり、消さなかったり
トリガー「正解と思うものにタッチしたぞ!」
Logic 答えが合っているか?
ギミック 正解エフェクトを出したり、ハズレエフェクトを出したり

どれもトリガーとギミックを直結させず、ワンクッションはさんで、処理を変えています。

Logicを使うときは「変数」も理解しないといけない!

ところで、↑に出てきた例……
「HP」とか「MP」とかどうやって作ればいいんでしょうか?
「連射が速すぎないか」も、前回弾を出したときから何秒たったとか、どうやってチェックすればいいんでしょうか?
これをやるには、「数字を(一時)保存しておく」機能が必要なはずです。

そんな機能clusterにあったっけ
そういう機能、あるんです。

ParameterTypeとは?

変数の話の前に、「ParameterType」の話をしないといけません。

まず、「的当てゲーム」に出てきた、トリガーから送られる「メッセージ」ですが……
弾を撃てなら「fire」、弾を消せなら「destroy」、的に当たったら「hit」とか名前がついていました(名前はKeyってとこに書くんでしたね)。

で、こういう「メッセージ」にはKeyだけでなく「ParameterType」というのも設定されていました。
ただ、ぜんぶ、Signalでした。

cluster公式より引用、的当てゲームの記事の「トリガーを引いたら弾が出る」ギミックを作る

トリガー・ギミックだけ使っている場合は、ほとんど「ParameterType」がSignalでOKなことが多いです。

で、「ParameterType」とはなんだったか?

なんだっけ

cluster公式によるとこうです。

Parameter Type
メッセージの型(値の種類)を指定します。ギミックによって、読み取れる型に制限があります。

で、↓の4種類があります。(公式の情報をまとめ直しました)

Signal Bool Float Integer
値を持たない、一時的なもの オン/オフ(フラグ) 実数(要するに小数) 整数

さっぱりわからん! という人も多いでしょう。
実際、トリガーとギミックを使うだけならSignalだけで十分なことが多いです。
BoolとかFloatとかIntegerなんて知らずにSignalを選んでいるだけで、割とどうにかなります。

が! Logicではこいつらが主役になるんです!
BoolとかFloatとかIntegerの「メッセージ」を送ると、送った先にその値が保存されます
これを使って、ヒジョーに色々なことができるんです。
銃の連射速度を制限したり、もちろんHPやMPを作ったりも!

Integer(整数)を使えば、HPが48で5ダメージ受けたからHPが残り43! とかできます。
Bool(オン/オフ フラグ)を使えば、カギを取ってフラグを立ててから閉まったドアの前にいったら開く、とかできます。


だからどうすればいいか教えろって言ってるだろ

……となる人も多いと思うんで、そろそろ具体的な話をしていきましょう。
本編」に続きます。