simplestarの技術ブログ

目的を書いて、思想と試行、結果と考察、そして具体的な手段を記録します。

CubeArtWorld:ギミックの説明

CubeArtWorld とは?

2020年12月頃に公開された3Dサンドボックスオンラインゲームのこと
simplestar-game.itch.io

VRoidHub 連携で自分のアバターで始めることができ、ゲーム内で購入できるワールド編集チケットさえあれば、世界の一区画のキューブを左クリックで破壊、右クリックで配置できる。
有名な他のサンドボックス系ゲームと比べると、配置する際にキューブの形を変えられること、回転を与えられることが大きな違いとして挙げられる。
ほかにもゲーム内で購入できるキャンバス編集権があれば、自分だけのキューブに金属、プラスチック、ライト、空色など様々な絵の具で好きに絵を描いて、日々コピーして数を増やしつつ、これにも形・回転を与えて配置でき、独自の世界表現が可能になっています。

クリエイティブ要素のほかにも、坂道を転がる鉄球や乗って滑るスケートボード、過去の世界へ飛べるタイムゲートなど、動きをつけた絵が撮れる、けど世界に配置し続けられないインスタントなアイテムがいくつか存在しています。
ギミックが登場するまでは、世界はスタティックで、鑑賞するのがメインのキューブアートな世界でした。

f:id:simplestar_tech:20220129103057p:plain

ギミックキューブへの切り替え方

キャンバス所有者のみ Edit ボタンを押して、この Type のドロップダウンから Gimmick を選んで保存できます。

f:id:simplestar_tech:20220129103741p:plain
キャンバス編集権の方のみこのUIをいじれる

ギミックはこれまでのスタティックな世界をダイナミックに変えるアクセント
これを理解できる最小限の解説を以下に続けます

ギミックの再生・発動

f:id:simplestar_tech:20220129104751p:plain
再生ボタン

ギミックを再生するためには、キャンバスパネルを開いてから Play ボタンを押します。
そのほかにも Trigger アクションの条件を満たすか、他のギミックキューブから SendKeys を受け取る、Combine で結合される範囲に配置されていることで発動します。

ギミックの作成

ギミックはアクションと呼ばれる行要素のタイプを選んで、サブタイプ・パラメータを決め、これをリスト形式でつなぎながら、全体の動きをつけていきます。
タイプが多いので、まずは例を示してみます。

城門が開くギミック

何かスイッチのようなキューブを踏むと、「カチッ」と音が鳴り「ゴゴゴゴゴゴゴ」と音を鳴らして遠くの城門がゆっくりと開くギミック
しばらくすると勢いよく門が落下してピタリと門が閉じます

使用されているギミックキューブは足もとのスイッチと、門の二つ、まずは足もとのスイッチ動作をしているギミックアクションを以下に示します。

f:id:simplestar_tech:20220129105941p:plain
スイッチ側

上から順番にタイプと動作を説明しましょう

Trigger

近づいたり、上に乗ったり、下を潜ったりしたときにギミックを発動させるトリガーの役割を果たします。Sub に GetOn が指定されているので、これは上に乗ったら発動するギミックをこの一行で定義しています。Trigger は一番最初の行にしか設置できない制約があります。

Sleep

指定したフレームの数または秒数を待機します。この行は値に 0 を指定しているので待たずに次のアクションへ進みます

Sound

音を鳴らすアクションです。Sub の Switch が「カチッ」の音を意味します。Value は音の高低を指定する値です

ここまでで、上に乗ると「カチッ」と音が鳴る というギミックの完成です。

SendKeys

周囲に Key を送るアクションです。Sub には形状を指定でき、Plane は高さ 1, 幅と奥行きが今回は 8 という形ですね。キューブの配置における回転の影響を受けるので、このスイッチは門扉のもう一つのギミックキューブに届くように SendKeys をしています。

ここまでのアクションで、「カチッ」と音を鳴らした後、遠くのもう一つのギミックを発動させるという意味になります。

Sleep

ここで入れているのは、カチカチ鳴らしすぎないように少し待ちを作っています。

Return

元のギミックキューブに戻る動作となります。Return 後は最初の Trigger で待ち受けている状態になるので、上に乗ればまた「カチッ」と音が鳴ります。

スイッチで起動する側の門のギミックをここで確かめましょう

f:id:simplestar_tech:20220129112105p:plain
門側のギミック
Combine

結合を意味していて、柵の形で一つのオブジェクトになるように PhysicalPlane を Sub に選んでいます。Plane は先ほどの SendKeys と同じ形のイメージで、高さ 1 幅と奥行きが今回は 4 の結合範囲でまとめています。こちらもギミックキューブの回転に依存しているため、うまく回転させて縦方向の板の形状で周囲を結合し、門の形をとります。
Physical と 無印の形状がありますが、形で物理挙動をしたいときに Physical を指定し、物理挙動をあきらめるが、結合した形状の内側にプレイヤーが入りたい場合は無印の形状を利用します。

Sound

音を鳴らすアクションです。Explosion という「ドカーン」という音を 0.5 の速度で再生して、ゆっくりの「ゴゴゴゴゴゴゴ」という音を作っています。

Translate

移動するアクションです。LocalX は今回は回転の兼ね合いで、門を上方向に動かす軸を示しています。-5 は上方向に 5キューブ移動という指定となります。

Sub に Speed を指定すると、直前の移動の速度を変化させることができます。3と大きな数字を指定すると速く動かすことができます。

Sub に Finish を指定すると、直前の Translate の移動が完了するまで待機するアクションとなります。

ここまでのアクションで、門の形で結合して「ゴゴゴゴゴゴゴ」という音をたてながら上へ 5キューブ移動する を実現できるようになりました。

Sleep

上に移動した門が 20秒経過するまで固定されます

Physics

Subに指定した物理制約を与えることができます。SliderY の場合上下方向の軸だけ移動できるエレベータのような動作制約で動くことになります。
このタイプは回転の影響をうけません。

Sleep

門が落下する様子を見せるための待機時間です

Return

もう一度門を開かせられるように、すべてのアクションを取り消して元の状態に戻ります。

ギミックタイプ一覧

アクションを組合わせることで、奥深いギミックが作れるようになると思います。
以下に現在提供されているアクションタイプ一覧を示して説明を終えたいと思います。

タイプ 説明
Trigger 乗る、近づくとギミックが発動する
Sound 音を鳴らす
Material 光ったり、透明になったり、色変化や周囲キューブのマテリアルを指定して見た目を変えます
Logic Keyの値を足したり、引いたり、掛けたりします
Sleep 指定した時間だけ次のアクションの実行を遅らせます
Lock 直前のKeyがここで指定した値と一致しないとReturnします
SkipTo 指定したラベルへアクションをスキップします。条件分岐や繰り返し処理を作れます。
Label ジャンプ先を定義するラベルです
Combine 周囲のキューブをギミックキューブを核にして結合します
Rotate ギミックキューブを中心に回ります。プロペラやスクリューなどの表現に使えるでしょう
Translate ギミックキューブが移動します。すごい勢いで動かすとプレイヤーやボールを打ち出す発射装置になったりします
InstantItem すべてのインスタントアイテムに変化します。過去に行く装置になったり、地雷などが作れるでしょう
Disappear 周囲のキューブを巻き込んで消滅します。突然開く扉や、床が消える落とし穴などになります
Key SendKeys に乗せる情報になります。受け取ったキューブは Key の値を処理できます。Lock に差し込んで錠を鍵で開くイメージです
SendKeys 加工したKeyセットを周囲のギミックキューブへ送信し、ギミックを発動させます
Load ギミックアクションリストは必要なときにロードするのでタイミングがずれることがあります。事前に周囲のギミックキューブのロードを完了させるためのアクションです
Return すべてのアクションを取り消して、元の状態に戻します
Physics 物理挙動をギミックキューブに与えます。制約をつけるとスライダーや回転する歯車、レールに沿って動く、などの動きを作れます
HingeJoint 蝶番のような扉の表現が可能になります。角度をつけなければ回転する車軸としても表現できるでしょう。単体では表現できないので周囲にアンカーを刺す設定をします。
SpringJoint ばねのような弾性のある動きをつけられます。アンカーを刺す向きを指定します。
FixedJoint 複数の結合したギミックをさらに組み合わせて複雑な形状を作るときに、固定ジョイントを活用します