👋

Cluster Creator Kitのトリガー、ギミック、オペレーションの関係について調べたメモ

2020/12/24に公開

これはCluster Creator Kit Advent Calendar 2020 24日目の記事です。
昨日の23日はfaidraさんの「clusterでそれなりに同期するストップウォッチを作った|faidra|note」です。

自分の記事を書くのに手いっぱいでまだしっかりと読めてませんが、かなりテクニカルかつCluster Creator Kitの内部にまで把握してストップウォッチを作られてる印象です。
自分は当初、Cluster Creator Kitのソースコードを読む事を記事のネタにしようと思っていたんですが、既に自分が見ようと思っていたところより深い所を見た上で応用に使っている感じだったので、後で読み直したいと思います。

概要

Cluster Creator Kitで作る仕組みの主な構成要素である、トリガー、ギミック、オペレーションの3要素の関係を調べて整理してみました。
もちろんアイテムも大事ですが、仕組みを作るという点でトリガー、ギミック、オペレーションに注目していきます。

トリガーから始まりオペレーションしてギミックがワールドに変化を与える流れ

自分がCluster Creator Kitを触るのは、GAME JAMとかゲームワールド杯とかのイベントで、慌てて調べながらという事が多く、あんまりちゃんと理解しないままで、そのせいでGAME JAM中にうまくいかず時間を無駄にしてしまう事が割とありました。
先日のGAME JAM 2020 Winterでも、2つのアイテムを連携させようとしてうまくいかず、しばらくの間手が止まってしまったというのもあり、これを機に理解を深めたいと思い調べています。

整理していく過程で見えてきた事なんかも書いていますが、急遽ネタを変えたのもあって、まずは調べて整理してみたまでが中心になっています。

環境

Unity 2019.4.11f1
Cluster Creator Kit 1.11.0

ソースコードを読む話はどうした

前述の通り、Advent Calender登録時には、Cluster Creator Kitのソースコードから読み取れる事をまとめる記事にしようかなと思っていました。
clusterでゲームワールドを作る際、割と同期周りで頭を悩ませることが多かったので、その同期周りのヒントを求めていたんですが、今回のAdvent Calenderの1日目で中の人からの解説があり、また先日のCluster GAME JAM 2020 Winterの直前に改善が入り、軽く触ってみた感じだとかなり改善されている様だったので、探る必要が無さそうになりました。
実際、しっかりとしたゲームワールドを作ろうとしてみたり、サーバーに居る人数が多かったりすると、やっぱり同期への考慮は必要になるかもしれませんが、2ユーザーで見る限りは割と同期されてる様に見えました。

ソースコードを読むほうのネタを期待していた方が、もし居たら申し訳ないです。

ギミック(Gimmick)

ギミックに付随してアタッチされるコンポーネントの表

まずはギミックを整理しました。
これは、Unityの素のCubeに各ギミックをアタッチしていき、何が付随してアタッチされるのかを書き出した表です。

  • Movable Itemに付くギミック
  • Itemに付くギミック
  • Game Objectに付くギミック
  • Game Objectに付きPlayerに作用するギミック

UI系はちょっと例外として除くと、どうやらこの4種類に分類する事が出来ます。

  • Play Audio Source Gimmick
  • Set Game Object Active Gimmick
  • Timelineの再生・停止のPlay/Stop Timeline Gimmick
  • Animation Controllerの状態遷移をさせるSet Animator Value Gimmick

こうして分類してみると、これら画像で赤にしてるギミックを付ける先は、アイテムではなく素のGame Objectでも構わないというのが、自分としては新しい発見でした。

ギミックとオペレーション(Logic, Timer, Lottery)のTarget

ギミック・オペレーションへのメッセージの送り元であるTargetを整理した表

今度はギミックがSignalやInt等のメッセージを送ってもらう元である、Targetについて整理しました。
ついでに、オペレーションも同じようにメッセージを送ってもらう元のTargetを持っているので、同列に並べています。
なお、赤のGame Objectに付くギミックの中で、TargetのLocalPlayerの有無で差が出てますが、LocalPlayerはUI用らしいので今回は気にしない事にします。

ギミックがアイテムに付くのかGame Objectに付くのかという前述の分類と、各ギミックが指定できるTargetの分類は対応していて、同じ分類・色分けが出来ました。
オペレーションも、Item Logic等をアタッチするとItemも付随してアタッチされるし、Targetも同じだしで、アタッチ先も同じ様に対応していました。

  • Item Logic(Timer, Lottery)はItemに付くオペレーション
  • Global Logic(Timer, Lottery)はGame Objectに付くオペレーション
  • Player Logic(Timer, Lottery)はGame Objectに付きPlayerに作用するオペレーション

つまりこういう事になります。

  • (Movable) Itemに付くギミック、オペレーションは、他のアイテムからメッセージを貰う事は出来ない。
  • Game Objectに付くギミック、オペレーションからは、指定したアイテムからメッセージを貰う事が出来る。
  • Game Objectに付いてPlayerに作用するやつは、Targetに追加でPlayerを持っている。

Targetの所に注目して整理してみると、こういう風になっている事が分かります。
ちなみに、先日のGAME JAMで自分は、Item Logicが他のアイテムからメッセージを貰って動いて欲しくて、でもそれが出来ないので考えていた仕組みの組み直しが必要になってしまいました。
ふんわりとした理解の中では、アイテムからアイテムにメッセージングして連携が、普通に出来るだろうと思ってしまうんですが、残念ながら簡単には出来ない様です。

トリガー(Trigger)

トリガーが何に向けてメッセージを送るかのTargetを整理した表

最後にトリガーも、Targetに何が指定できるのかを整理しました。
トリガーはほぼ一緒だけど例外が混ざってる様です。
色分けもしていますが、ギミック・オペレーションの色分けとは分類が違います。見分けやすい色を選ぶと同じ色を使ってしまってますが、ギミック・オペレーションの同じ色のと対応はしてないです。

  • On Collide Item Triggerだけ、TargetにCollidedItemOrPlayerを持つ
  • On Join Player Triggerだけ、TargetにPlayerを持つ
    • そしてTargetにOwnerは持たない
  • 恐らくOn Collide Item Trigger(とOn Create Item Trigger)だけ、Target Ownerの扱いに注意が必要。

トリガーはそもそも数も多くないし、例外の2つも名前の通りではあるので、特に意外という事もないです。

On Collide Item TriggerのTarget Ownerの扱いに注意が必要な事

On Collide Item TriggerとOn Create Item Trigger以外のトリガーについては、そのトリガーが発火する直前に、発火する操作を行ったユーザーにOwnerが移ります。
なので、Target Ownerにした時のOwnerが誰かがはっきりしていて、迷ってバグを作ったりする余地はなさそうに思います。

On Collide Item Triggerの場合は、アイテムのOwnerが関わらない形で、コライダーを持つ他のアイテムやGame Objectとの衝突があれば発火します。
なので、仕組みを作ってる時に想定してたユーザーではない別のユーザーがOwnerになっている可能性が割とあり、ここがバグに繋がりやすい所だと思います。

そして、On Create Item Triggerに関しても、On Collide Item Triggerと一緒に使う場合は同様に注意が必要になります。
On Create Item TriggerのTargetのOwnerは、そのアイテムが生成されるきっかけとなったトリガーのOwnerになります。
つまりOn Collide Item Triggerがきっかけでアイテムが生成された場合は、On Create Item TriggerのTarget Ownerも想定してたユーザーではない場合があり得る事になります。

2つのアイテム間でメッセージをやり取りする事は、基本的には出来ない

ここまで調べて整理した上で分かった事を一つまとめとして書きたいと思います。
既に何度か軽く触れてはいますが、2つのアイテム間でメッセージをやり取りする事は、基本的には出来ない様です。

  • Globalを経由すれば出来るが、prefabから生成したアイテムが同じメッセージkeyを使ってしまう。
  • 衝突を利用すれば、衝突したアイテム間でメッセージをやり取りできる。
    • 衝突したけどメッセージをやり取りしたいアイテムとしたくないアイテムは、レイヤーで多少は制御できる。
    • でも、意図しないアイテムやプレイヤーが衝突してしまって、想定外のトリガー発火をしてしまう可能性が割とあるので、バグに繋がりやすい。

基本的にと書いた通り、全くできない訳ではなく、例えばこの様なやり方なら出来る様です。
今回のAdvent Calenderでも、とてもテクニカルなやり方で、2つのアイテム間でメッセージのやり取りが出来そうな事が書かれてた気もするので、色々とやりようはあるとは思います。
逆に言えば、Globalを経由するか衝突を利用するか、もっとテクニカルなやり方を用いるかなど、2つのアイテム間でメッセージをやり取りするには、何かしら頭を捻る必要がある事になります。

全てのトリガーはTargetにSpecified Itemを持ってる様な・・・

と、ここまで書いてから、全てのトリガーにはTargetにSpecified Itemを持ってる事を思い出しました。
Item系オペレーションで何かしらした後にメッセージを他のアイテムに送る事は、やはり難しいと思うんですが、ちょっと基本的に出来ないは言い過ぎな感じになってしまいました。
トリガー、オペレーション、ギミックの3要素では、トリガーのタイミングでなら他のアイテムにメッセージを送れるが、アイテムに付くギミック、オペレーションの中に入ったら、そこから他のアイテムにメッセージを送る事は、基本的に出来ないと書くと、より正確でしょうか。

調査不足な気もしてきましたが、ちょっと今から別のまとめ的なものをひねり出す時間も前項を書き直す時間も無いので、今回の記事のメインは調べて整理した事という事で一つお願いします。

明日

明日のCluster Creator Kit Advent Calendar 2020は、25日最終日で、9191(クイクイ)さんの「VRアフガニスタン写真展~新しい年へ語り継ぎたいこと」の予定です。

Notes

Discussion