【cluster】Logic使ったゲームワールドを作ろう パターン編1

6 min read読了の目安(約5500字

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

(※この記事は「パターン編1」です。よくあるLogicのパターンとかを説明します。「準備編」「本編」ほど丁寧な解説ではないです。。。)


この記事で作るのは……

公式記事「オペレーション機能を使ったHPやMPの作り方(https://creator.cluster.mu/2020/11/07/operation-how-to/)」のシンプル版って感じです。
あの記事はLogic初心者が読むにはちょっとキツいと思いますが、この記事を読み終わってから読めばいくらか理解しやすいと思います。

準備

ボール(Sphere)を配置し、MovableItemをつけます。位置は床からハミでない感じでテキトーにしてください。

最初からついているもの、自動でつくものとか合わせてだいたいこうなります。

HP表示部分

↓の画像のように、Sphereを右クリックして、UI Textを選びます。

Canvas Textというのが Sphereの子として作られました。
さらにEventSystemというのもできますが、これはあとで削除します

別にいまEventSystem削除してもいいですが、何度も作られちゃうかもしれません。

Canvasの設定

で、Canvasを選択し、こんな風に変更してみます。

Canvasの設定変更
CanvasRenderModeWorldSpaceに。
Scaleは全部0.02に。
PosXは0、PosYは1、PosZは0。


そうすると、だいたいこんな風に見えると思います

ボケボケですが、いちおうテキストっぽいものが見えるようになりました。
このテキストは、ボールを動かすとちゃんとついてきます。

Textの設定

つづけて、Textを選択し、こんな風に変更。

Textの設定変更
Scaleは全部0.1に。
TextはとりあえずHP 20とか書いておく。
Font Size300くらいに。
Alignmentは両方中央に。
Horizontal OverflowVertical OverflowはどっちもOverflowに。


ボールからやや上に、クッキリテキスト表示

SetTextGimmickをつける

このTextに、SetTextGimmickを追加してください。
設定はこんな風に。

SetTextGimmickの設定変更
KeyHP
ItemSphereに(ボールをドラッグ&ドロップで動かしてきて、Itemの上で離す。もしくはItemの右のほうにある◎みたいなボタンをクリックして、Sphereを選ぶ)
ParameterTypeInteger
Formatには HP {0:D2} と書く(意味はまたあとで)

最後のFormatは全角で HP {0:D2} とか書いちゃダメですよ! HP {0:D2} です。
ここ以外も、全角は使わないほうがいいと思いますが……

ここに書いた部分は、Logicとかが完成してから効いてきます。

Logicっぽいところを書いていこう

またSphereを選択し……
OnCreateItemTrigger ItemLogic ItemTimer DestroyGimmickを追加します。

設定はこんな感じ!

Logicの流れ
ゲームが始まったら、OnCreateItemTriggerが自動で呼ばれる。変数HPが15になる
ItemLogichitというメッセージが来たら、HPを4減らす。マイナスにはしない。
その後、HPが0以下ならDestroyTimerというメッセージを自分(This)に送る。
ItemTimerDestroyTimerというメッセージが来たら、0.5秒後にDestroyというメッセージを自分(This)に送る。
DestroyGimmickDestroyを受信したら、自分(This、つまりSphere)を破壊する。

Logicの部分をさらに解説

Subtractは引き算って意味です。

HPから4を引いて、それをまたHPに入れる。Constant も 右上部分もInteger!!

慣れてても、Signalのままにする(あるいはSignalにし忘れる)ミスはほんとーによくやります……

さて、次です。
HPが減ってもマイナスにはしないという部分。

「最小値が0ってことは、 Min を使えばいいんだな!」

すいません、実は逆です……Maxを使います。
HP0を比べて、大きい(最大の)ほうをHPに入れる。

  • HPが6なら、0より6のほうが大きいから、6を入れる。
  • HPが-3なら、-3より0のほうが大きいから、0を入れる。

……というわけです(最小・最大を指定するClampのほうが直感的で分かりやすいかも……)

あとは消える部分

最後は0以下ならDestroyTimerメッセージを送る。LessThanOrEqualって英語が長くてコワいと感じるかもしれませんが、要するに「以下」です。
ここは変数に値を入れたいわけじゃないから、Signalですよ!

で、DestroyTimerを受信したItemTimerは0.5秒後にDestroyメッセージを送る。ここは分かりやすいと思います。

計算についてもっと知りたければ

SubtractとかMaxとかLessThanOrEqualとかの計算。
もっと知りたい方向けの記事は、【cluster】Logicでの「計算」一覧です。

ところで攻撃する部分は?


ところで、ItemLogicが発動するためのhitってどっから来るの?

……という点に気づいた人はエラい。
はい、cluster公式の「的当てゲーム」と全く同じ銃と弾を作ってください。


めんどくさい

そのほうが解説が短くて済むんで……

で、的当てゲームの銃で撃つと

こんな風になります(銃のデザインがアレなのはともかく)。
弾が当たるとHPが減って……でも、HP表示まで転がってる……

なので、とりあえずSphereが回転しないようにします。
SphereについているRigidBodyConstraintsを開いて、Freeze Rotationに全部チェックを入れてください。

こんな感じ

こんな風に、回転しないようになります。
当たるとHPが減っていって、HPが0になると0.5秒後に消滅。
ひとまずこれで完成です!

その他

  • SetTextGimmickのとこにあったHP {0:D2} について。HP 15とかHP 08とか、指定された変数を表示しろって意味ですね。ライフ {0:D2}とかすれば当然 ライフ 15 とかライフ 08とかに変わります。
  • このときただの {0} でもいいんですが、{0:D2}とすると自動的に2桁(04とか08とか13とか)で表示されます。
  • 小数なら {0:F2} とすると小数点2桁まで表示とかできます。0.04 0.28 1.10とかケタをそろえて表示できるわけですね。
  • EventSystemがまだワールドに残っていたら消してください。
  • Logicで出てくる「Add」とか「LessThan」とか「Clamp」とかの計算についての一覧はこちら

「パターン編2(https://zenn.dev/vins/articles/ef2d93ca6c4400/)」につづく。