今回はvinsさんによるclusterスクリプトの解説記事です。
スクリプトを使うと何ができるようになるのかの解説がされています。さらに「使ってみたいけどプログラミングとか難しそう…」という方でも挑戦できるよう、コピペしてそのまま使えるコードや改変時の注意も解説しています!
Cluster Conference 2022でとつぜん発表されたスクリプト機能。ワールドづくりの可能性を大きく広げるものです。
でも、何に使えるかわからないしムズかしそう……という人も多いですよね。今回の記事では
- 初心者は、どうやってスクリプトを使い始めるといいか
- スクリプトを使うと何ができるのか
この2つを説明していこうと思います。
Unityで使う場合と、ワールドクラフトで使う場合の違い
スクリプトはUnityでつくったワールドでも、ワールドクラフトでも使えます。当然Unityで使った方ができることの幅は広いです。ただ、
- Unity……「中上級者が、それまでできなかった高度な動きや処理をスクリプトで実現」
- ワールドクラフト……「スクリプトを使わないと、動かしたり音を出したりできない」

という違いがあります。Unityの場合、基本的なワールドをつくるときはスクリプトを使わなくても特に問題ないのです。ある意味では、ワールドクラフトのほうがスクリプトを使うメリットが大きいとも言えます。
(Unityでスクリプトを使うメリットは後述します)
ワールドクラフトでスクリプトを使う場合、PCでの作業が必要
ただ、残念ながらワールドクラフトでスクリプトを扱う場合、PCでの作業が必要です。最初にUnityからクラフトアイテムをアップロードしないと、スクリプトは使えないのです。ワールドクラフトでUnityの細かい操作を知る必要はありませんが、
- Unityをパソコンにインストールする
- clusterのテンプレートプロジェクトなど、cluster用に作られたサンプルをダウンロードして開く
- サンプルシーンを開き、自分が使いたいアイテムの形をつくったり既存のモデルデータから選んだりする
- Scriptable Itemというコンポーネントをそこにつける
- クラフトアイテムとしてアップロードする
……という作業をする必要はあります。
vinsは2~4をよりカンタンに済ませられるサンプルプロジェクト入りの記事を別に公開しておりますので、よろしければご活用ください。

スクリプトはコピペでも十分できる
スクリプトというと、ムズかしいプログラムの文法やテクニックを全部覚えないと始められないと思っている人もいるでしょう。でも最初はコピペで十分なのです。
まずは最も基本的なスクリプトから始めましょう。
スクリプトを使ってできることのひとつに、モノを動かすことがあります。その中でも特にシンプルな例として、モノを左右に行ったり来たりさせるスクリプトを考えてみます。

以下のようなスクリプトが考えられます。
const hayasa = 1.0;
const nagasa = 2.0;
const muki = new Vector3(1,0,0);
$.onUpdate(deltaTime => {
if (!$.state.shokika) {
$.state.shokika = true;
$.state.ichi = $.getPosition();
$.state.time = 0.0;
}
$.state.time += deltaTime;
let _ichi = $.state.ichi.clone();
let _muki = muki.clone();
const nagasa_now = Math.sin($.state.time * hayasa) * nagasa;
_ichi.add(_muki.multiplyScalar(nagasa_now));
$.setPosition(_ichi);
});
これを見た瞬間、初心者の方は「わからない! やりたくない!」と思ってしまうのも当然だと思います。でも、中身は理解しなくてもいいのです。Cluster Creators Guideや私がZennで書いているスクリプトをコピペするだけで色々な表現が可能です。
さらに、数値の改変がしやすくなっているスクリプトでは、これを改変するのもかなりカンタンにできます。例えば先ほどのスクリプトの一行目、
const hayasa = 1.0;
ここの数値を
const hayasa = 3.0;
こう変えるだけで、動く速さを変えられるのです。これくらいなら、できそうだと思いませんか?
(数字には全角を使わず半角にする、など改変のときハマりやすいポイントの注意はこちらの私の記事で紹介しています)
改変のときは親子関係や名前に注意
注意点として、スクリプトによってはアイテムの親子関係や名前をしっかり指定しないと上手くいかないモノもあります。
例えばCluster Creators Guide内にある「動くクラフトアイテムをつくってみよう!」の「ドア」のスクリプトを見てみましょう。

元記事の注釈にあるとおり、このスクリプトには「Model」という子をつけておく必要があります。そのため、あなたがUnity上でこのスクリプトを活用しようとしたら、子の名前を「Model」にしっかりと変更しなければなりません。また、Scriptable Itemをつけたアイテムの子に見た目の部分を配置する、といったことも当然求められます。
スクリプトの文中に$.subNodeという表記が出てきた場合はこの作業を求められることがほとんどですから、注意しておいてください。
とはいえ、これはUnityでワールドをつくってきた人ならさほどムズかしくないポイントだと思われます。Unityを触るのに慣れていない人は、まずアイテムの親子関係の設定方法や名前の変更操作にしぼってしっかり覚えていくとよいでしょう。
(いずれにしろ、先ほどの私のサンプルプロジェクトを使うと第一歩がやりやすくなると思います)
スクリプトの中身も勉強したくなったら?
コピペや改変によるスクリプト活用に慣れ、いよいよ自分で色々スクリプトを書いてみたくなった場合……
こちらの記事を参考にしてみてください。X方向に行き来するスクリプトの中身について、かなり細かく説明をしています。これを見れば、なんだかよくわからない英語のカタマリのように見えるスクリプトも、だんだんと基本構造がわかってくるはずです。
個人的には、ある程度具体的なスクリプトの意味を理解してからJavaScriptの入門書を読むほうが頭に入りやすいような気がしています。clusterなど、実際に活用する場でどう使われるのかをあまり知らない状態で入門書を読んでも、ピンと来ないパターンが多いのではないかと……
vinsのつくったスクリプト記事
この記事の元となった、「そもそも何ができるのか?」の記事。
改変をどうするかの基本に加えて、スクリプトの基本の意味の説明もしている。一歩前に進みたい人にオススメ。
ワールドクラフト用(クリックで各記事にリンクします)
Unity専用
スクリプトで何ができるのか?
ここからは主にUnityでスクリプトを使う人向けの内容になります。中上級者向けです。
スクリプトを使うと、どんなことが実現可能になるのでしょうか?
フクザツな動きを実現可能
スクリプトを使わない場合、clusterでモノを動かすのは
- 事前に決めていた場所にワープさせる
- 物理法則に従って動かす(必要なタイミングでアイテムに動かす物理的な力を加える。弾が画面に出たら前方への力を加えるなど)
- Animatorでアニメーションさせる(手動で動き指定)
- Cinemachineを活用する
くらいしかできませんでした。
スクリプトを使えば、なめらかな動きや円運動、ランダムな動き、何かに向かって誘導する動き、事前に決めていない場所へのワープ……など色々なものが直接実現できます。
ただしOwnerでないプレイヤーには、ややカクカクして見える部分は変わりません。なので多くのプレイヤーがいるイベントで演出に使う……などにはあまり向いていないかもしれません。
でも、イスに座った1人のプレイヤーに演出を見せる、乗りものに座ったプレイヤーがあちこちに移動したりゲームをしたりする、持ったアイテムから特別な弾が飛んでいく……などの状況では、スクリプトによるフクザツな動きが生きてくるはずです。
なお、動くアイテムにはMovable Itemもつけるのを忘れずに。
「毎フレーム」処理をさせられる
これまでclusterでは、非常に短い間隔で何かの処理をするとしたら「Item Timer」などを0.01秒間隔で呼び出すなどするしかありませんでした。これでは余計な負荷がかかってしまいます。
スクリプトでは、余計な負荷をかけず「実行中常に(毎フレーム)処理させる」ことが可能です! 言ってみれば超短い間隔で、Item Timerなどと比べてもトラブルがとても少ないタイマーを呼べているようなものです。これは先に述べた「フクザツな動き」を実現する基礎でもあり、上記の空飛ぶ乗りものでも活用しています。
他にも、「○○の条件を満たしたらすぐに××を起こす」などの処理がやりやすくなっています。
フクザツな計算や条件チェックがやりやすい
100ゴールド以上持っていたら、カギを手に入れて、100ゴールド減らして入手音。それ以外のときはエラー音を鳴らす……
こんな処理は「ロジック機能」でも可能でしたが、少しフクザツになってくると「ロジック」が大量に必要でした。「ロジック」は短いものならともかく、量が増えると書くのも大変、全体像を把握するのも大変……という欠点があります。

スクリプトなら、これをかなり短く書ける上に、流れもわかりやすくなります。

もちろん、スクリプトに不慣れなうちはこういうものを見るとムズかしいと感じるでしょう。しかし少し慣れればこちらのほうがわかりやすくなってきます。
また、ランダムな値を使いやすいのも嬉しいところです。クジなどに使われるCCKのLottery機能などを使うよりもはるかにカンタンに色々なランダムな値を使えます。
$.setPosition(new Vector3(Math.random()*10,0,0));
例えばこうすれば、Xが0~10のランダムなところにアイテムがワープします。
その他、「繰り返し処理がカンタンにでき、回数もコントロールしやすいfor文」や「数字によって処理をカンタンに分岐させられるswitch文」などプログラミング経験者に嬉しい機能もありますよ。
「配列」機能がつかえる
「10個くらいあるデータ(配列データ)に対して順番に色々処理をする」というのは、ちょっとフクザツなゲームやワールドをつくるときにしばしばやりたくなります。一番わかりやすいのはトランプのようなカードゲームですね。シャッフルしたり、「カード全てオモテにする」という処理を書いたり……
特に「トランプのカードのシャッフル」のような処理は「ロジック機能」でうまくできないものの1つでしたが、スクリプトでは「配列」が使えるのでかなり本格的なカードゲームも可能です!

ただし、データを保存するには$.stateに入れなければならない(*)のですが、$.stateには配列データを入れられないという問題があります。
これを回避する方法としては、「$.state自体を配列のように使う」というテクニックがあります。
clusterスクリプトのサンプルでは
$.state.gold = 100;
$.state.getFlag = true;
のように$.stateの後にピリオドをつけているものが多いのですが、実はこれは
$.state["gold"] = 100;
$.state["getFlag"] = true;
のような形もOKで、同じ意味です。
ここで重要なのが、
const no = 3;
$.state["flag" + no] = true;
のような書き方が可能だということです。これは「$.state.flag3 = true;」と同じ意味になります。
for (let i = 0; i < 10; i++) {
$.state["flag" + i] = true;
}
さらにこのように書けば、「$.state.flag0 = true; $.state.flag1 = true; $.state.flag2 = true;」……と書いたのと同じことになります。アイテムについている10個の子オブジェクトの位置情報を記録、なんてこともカンタンです。ややフクザツなスクリプトをつくりたいときは覚えておきたいテクニックです。
(forのくわしい意味は、JavaScript入門サイトなどで調べて頂ければと思います)
(*)$.stateの中に入れていないデータは、データがリセットされることがあります。
とにかくスクリプトをやってみましょう
最初に書いたとおり、ワールドクラフトでは特に恩恵の大きいスクリプト。動きのあるワールドや音の出るワールドをつくってみたい人は、ぜひトライしてください。
またUnityでも、乗りものにフクザツな動きをさせたい人にはかなりオススメです。他にもカードゲーム的なものがつくりやすくなったことを活かし、教育系の暗記カードをつくったり、パーティーゲームで使える面白いネタカードばかりのワールドをつくったり、色々な可能性がひろがります。
さらにはすわったプレイヤーを色々なところにワープさせられるイス、多様な弾幕攻撃をしてくる敵をつくるなど、細かいテクニックも盛りだくさん。
コピペや改変で始められるものですから、ぜひやってみてください!