🔄

ModularCS ドキュメント

2024/02/11に公開

0.はじめに

ModularCS(モジュラクス)は
「ClusterScriptが分からなくても使いたい人」 と、
「ClusterScriptを誰かに使って欲しい人」
ために作られたツールです。

ClusterScriptをドラッグ&ドロップで組み立てることができます。
少しでもClusterScriptの世界が加速することを願っています。

1.リンク

2.チュートリアル

2つのチュートリアルを用意しました。
ModularCSの操作や世界観に慣れてもらえると嬉しいです!!

2.1 プレイヤーについてくるアイテムを作る

まずこちらの公式チュートリアルのついてくるペットとほぼ同等のアイテムを作ってみましょう。
スクリプト部分はドラッグ&ドロップ一発で作れますよ!

公式チュートリアルでアイテムの設定まで行ってください。
モデルを用意するのが大変であれば、MovableItemのついたCube でもよいでしょう。

アイテムの設定が終わりましたら、アイテムに「Modular CS Component」を追加してください。

こんな感じになっていればOKです
「エディタを開く」 というボタンがありますので、それを押してください。
以下の画面が出てきます。

ModularCSエディタ
出てきた画面が小さければ、適宜拡大してください。

この画面を操作してClusterScriptを組み立てていきます。
それではプレイヤーについてくるアイテムのClusterScriptを組み立てましょう!

2.2 「パーツ」を組み立てる

ModularCSは、様々な 「パーツ」 を組み立てて、ClusterScriptのプログラムを作るツールです。
今回はこのチュートリアル用に作った「パーツ」を利用します。

「パーツ」は 機能ごとにフォルダ分けして 管理されています。
画面左の 「パーツ一覧」

  • 3:データで何かをさせる、動かす、指示する。
  • アイテムや子オブジェクトに対して
  • 組み合わせ済み処理

という順に開いてください。

このフォルダの中に 「一番近いプレイヤーに向かう」 というパーツがあります。
こういった「パーツ」を 「ドラッグ&ドロップ」で配置 して組み立てます。

「一番近いプレイヤーに向かう」を 「画面更新(毎秒20-90回程度)のタイミングで処理します。」 の下側に配置してください。
「パーツ」をドラッグすると色が変わるので、その場所に配置してください。


このように配置されていればOKです
これでプレイヤーについてくるアイテムは完成です!!
「ModularCSエディタ」の画面は閉じてしまってもOKです。ドッキングさせてもOKです。
シーンを保存をしてから ワールドをアップロードして確認してみてください(ベータ機能を使っているので設定をお忘れなく)。

「移動速度」などの数値を変更すると、それに合わせて動きも変わります。
変更したらアップロードして確認してください。

ModularCSでは、このように「パーツ」を配置してClusterScriptを組み立てます。
複雑な処理を組み込んだ「パーツ」であれば、今回のようにドラッグ&ドロップ一発でアイテムが作れたりします!
テキストエディタも使わないので簡単ですね!

2.3 プレイヤーが乗ったら上にジャンプするアイテムを作る

次に公式チュートリアルのジャンプ台とほぼ同等のアイテムを作ってみましょう。
今回はスクリプト部分をドラッグ&ドロップ5回で作れますよ!

今回は公式とは少し作り方が違います。
コライダーが付いていれば何でも良いです。平べったくしたCubeなどが簡単でよいでしょう。
今回使う機能には Rigidbodyが必要なので追加します。重力はOFFでConstraintsを各種ONにしておきます。

アイテムを配置しましたら、アイテムに「Modular CS Component」を追加してください。

こんな感じになっていればOKです

「エディタを開く」ボタンを押して編集を始めましょう。


今回は「パーツ」を3つ使います。

1つ目

「パーツ一覧」から

  • ((上のフォルダに戻る)を連打して一番上のフォルダに戻る)
  • 1:データを作る、準備する、取り出す。
  • 自分で準備するデータ(下の方にあるので必要ならスクロールしてください)
  • 「3次元データ(位置など)を準備する」

この「パーツ」を 「最初に一度だけ処理します(以下略」 に配置します。
この「パーツ」でプレイヤーがジャンプする方向を指定します。

2つ目

  • ((上のフォルダに戻る)を連打して一番上のフォルダに戻る)
  • 1:データを作る、準備する、取り出す。
  • 特殊な処理専用のデータ
  • 「このアイテムに衝突した物体のデータ。」

この「パーツ」を 「アイテムが別の物体と衝突したタイミングで処理します。」 に配置します。
この処理はかなり右の方にあるので、スクロールして表示 させてから配置します。
この「パーツ」でアイテムに乗っかったプレイヤーを取得します。

3つ目

  • ((上のフォルダに戻る)を連打して一番上のフォルダに戻る)
  • 3:データで何かをさせる、動かす、指示する。
  • プレイヤーに対して
  • 「プレイヤーに速度を加える。」

この「パーツ」を同じく「アイテムが別の物体と衝突(以下略」に配置します。
この「パーツ」でプレイヤーを実際にジャンプさせます。


このように配置できていればOKです

2.4 「データ」を組み込む

ここで新しい要素「データ」が出てきます。
「データ」は「パーツ」で作り出したり、加工したり、使ったりすることができます。

配置した「--3--プレイヤーに速度を加える。」を見てください。赤くなっている枠があります。
この「パーツ」の処理には「データ」が必要で、ここに「データ」を配置する必要があることを示しています。

それでは「データ一覧」から 「(--1--のデータ)3次元のデータ」 を「加える速度」の枠に配置してください。
これにより、「--1--3次元データ(位置など)を準備する。」で指定した方向に、プレイヤーがジャンプするようになります。

続いて 「(--2--のデータ)衝突したプレイヤー」 を「プレイヤー」の枠に配置してください。
これにより、「--2--このアイテムに衝突した物体のデータ。」で取り出したプレイヤー、つまりアイテムに乗ったプレイヤーがジャンプするようになります。


このように配置できていればOKです

配置する際に気づかれたかもしれませんが「データ」は配置できる箇所が限られます。これは「データ」に種類があるためです。
例えば、3次元のデータはプレイヤーの所に配置できません。

最後に、どれぐらいプレイヤーをジャンプさせるか指定しましょう。
「--1--3次元のデータ(位置など)を準備する」のYに「10」を指定しましょう。 結構派手にジャンプしてくれると思います。

これでプレイヤーについてくるアイテムは完成です!!
シーンを保存をしてから ワールドをアップロードして確認してみてください(ベータ機能を使っているので設定をお忘れなく)。

チュートリアルは以上になります!
「パーツ一覧」には他にも様々なパーツを用意しています。
ぜひ一通り眺めてみてください!
Assets/KaomoLab/ModularCS/作例集 にサンプルをいくつか用意しています。

よきClusterScriptライフを!!

2.5 その他の操作や情報

これまでで紹介できなかった操作や情報などを紹介します。

  • 「パーツ」はClusterScriptで書かれています。
    どなたでも「パーツ」を自由に作って配布することができます(重要)。

  • 「ModularCSエディタ」の画面上部が赤くなっているときは、どこかの「パーツ」に「データ」を入れ忘れています。
    数値を入れるべき所が空だったり、文字が入っているようなときも同様に赤くなります。

  • 配置した「パーツ」と「データ」は削除できます。 タイトル部分にカーソルを合わせると「操作」のボタンが出ます。この「操作」ボタンを押すと「削除」が出てきます。

  • 「データ」の内容などを「メモ」に書くことができます。
    具体的にどういう「データ」なのか、などを自分なりにメモする時にお使いください。

  • 「データ」にある「--1--」の数字は、配置した「パーツ」に書いてある「--1--」を指しています。
    この「データ」はどの「パーツ」のだっけ?となった時に参考にしてください。

  • 各種処理で使用できるデータ(アイテムを使ったプレイヤーなど)を取り出す場合は、「1:データを作る、準備する、取り出す」>「特殊な処理専用のデータ」に入っていることが多いです。

  • 「データセット」には様々な「データ」をまとめて入れることができます。

3.「パーツ」の作り方

「パーツ」はClusterScriptで書かれています。
ModularCSは、デベロッパーが作られた「パーツ」を、Boothなどで配布できるようにすることも目指しています。
「パーツ」を作られた場合は、ぜひ配布してください。
ClusterScriptを使いたいどなたかの助けになることを願っています。

ModularCSは、テンプレートエンジンの一種と言えるかもしれません。
「パーツ」内の変数名をユーザの操作に合わせて置換処理し、プログラムとして成立させます。

3.1 「パーツ」の作り方チュートリアル

「パーツ」を作ろうとしてくださり、ありがとうございます。

先述の通り「パーツ」はClusterScriptでできています。
そのため、Visual Studio Codeを使うと楽で良いです。
UTF-8が使用できるならメモ帳などのテキストエディタでもかまいません。

チュートリアルを用意しましたので、ぜひ「パーツ」を作成してみてください!

「パーツ」の書式の詳細についてはこちら。

3.1.1 「パーツ」チュートリアル-ハローワールド

チュートリアル-ハローワールド
/////version:v1
/////id:{1dd14d77-7bc9-4237-aab6-9215f3dae85b}
/////note:チュートリアル-ハローワールド
/////author:かおも
/////input:-
/////output:-
/////local:-
$.log("hello, world");

いわゆるハローワールドです。「パーツ」のほぼ最小構成です。
以下「パーツ」特有の記述について説明します。

  • version行は固定です。文頭に必須なのでコピペしてください。
  • id行は他の「パーツ」と衝突しなければ何でもOKです。GUIDが楽でおすすめです。
  • note行は「パーツ一覧」で表示される説明文です。できるだけClusterScriptやプログラムの用語を使わないでください。
  • author行は「パーツ」にバグがあったときなどの連絡用です。
  • input、output、local行は入出力の「データ」や「パーツ」内部で変数を使用する場合に指定します。今回はどちらも使っていないので「-」指定です。

「パーツ」の作成から、実際に使ってみるまでの流れは以下のとおりです。

  • 「パーツ」を .jsファイルに保存 してください。ファイル名は何でもよいです。note行に記載した内容をそのままファイル名にするのが楽かもしれません。
  • 文字コードは「UTF-8」です。BOMの有無はどちらでも可です。
  • 「Assets/KaomoLab/ModularCS/パーツ置き場」以下のフォルダに配置してください。
  • ModularCSエディタを開いてください。既に開いていたら「パーツを読み込み直す」を押してください。
  • エラーが出なければ「パーツ」はModularCSに取り込まれています。

ModularCSエディタの「パーツ一覧」にて「パーツ」を配置したフォルダを開いて下さい。
以下のようにnote行に記載した名称の「パーツ」があればOKです。


この「パーツ」を「最初に一度だけ処理します(以下略」に配置した場合、スクリプトは以下のようになります。

//最初に一度だけ処理します(最初の画面更新直前のタイミング)。
$.onStart(() => {
    //1:チュートリアル:ハローワールド
    $.log("Hello world");

});

ヘッダの各行は削除され、本文+note行を引用したコメントのみが出力されます。

3.1.2 「パーツ」チュートリアル-Inputを使う

次は入力の「データ」を扱う「パーツ」を作ってみましょう。

チュートリアル-Inputを使う
/////version:v1
/////id:{942f7b87-ac0b-49da-9324-767411fb6526}
/////note:チュートリアル-Inputを使う
/////author:かおも
/////input:Input:String:world:cluster:world部分
/////output:-
/////local:-
$.log("hello, " + _world_);

新しく登場した内容について触れていきます。

  • id行の更新を忘れないで下さい。
  • input行の項目については分けて順に触れます。
    • 「Input」を指定すると、画面上でテキストボックスが表示されます。
    • 「String」は「データ」の型(Vector3型などの型)を示しています。
    • 「world」は変数名です。実際にコーディングする場合は、前後に「_」を付与して下さい。つまり「_world_」となります。
    • 「cluster」は初期値です(「Input」を指定した場合)。ここは空でも可です。
    • 「world部分」は画面上に表示される説明文です。
  • スクリプト中の「_world_」はinput行で示された変数です。この箇所はスクリプトに組み立てられる際に指定された値などに置換されます。

文で説明すると冗長で分かりづらいのですが、スクリプトになると分かりやすいと思います。
以下のようになります。

//最初に一度だけ処理します(最初の画面更新直前のタイミング)。
$.onStart(() => {
    //1:チュートリアル-Inputを使う
    $.log("hello, " + "cluster");

});

「_world_」の部分が「"cluster"」となっています。「String」を指定しているので、「"」で囲まれています。
例えば「String」の代わりに「Number」を指定すると「"」で囲まれません。

画面上のテキストボックスにcluster以外の文字を入れると、スクリプト上でもその文字になります。

//最初に一度だけ処理します(最初の画面更新直前のタイミング)。
$.onStart(() => {
    //1:チュートリアル-Inputを使う
    $.log("hello, " + "ブンブン");

});

3.1.3 「パーツ」チュートリアル-Stateを使う

次は入力の「データ」をドラッグ&ドロップで指定できる「パーツ」を作ってみましょう。

チュートリアル-Stateを使う
/////version:v1
/////id:{84caa2fa-4b14-4c37-9c32-b6835036859c}
/////note:チュートリアル-Stateを使う
/////author:かおも
/////input:State:String:hello::hello部分
/////input:Input:String:world:cluster:world部分
/////output:-
/////local:-
$.log(_hello_ + _world_);

  • input行が1行追加されています。変数毎に1行追加して下さい。
  • 「State」を指定すると、ドラッグ&ドロップで、同じ型の「データ」を配置できるようになります。

他の箇所は「Input」を指定したときと同じです。
ここの「State」では「String」を指定しているので、別の型(例えば「Number」)の「データ」を配置することはできません。

この「State」は内部で少し特殊な扱われ方をしています。
実際にスクリプトになっているのを見てもらうのが良いかもしれません。

スクリプトにするには、「State」な「データ」を出力する「パーツ」が必要なので、以下のフォルダにある「パーツ」を配置して下さい。

  • 1:データを作る、準備する、取り出す。
  • 自分で準備するデータ
  • 「文字のデータを準備する」


このように配置してください

するとこのようなスクリプトになります。

//最初に一度だけ処理します(最初の画面更新直前のタイミング)。
$.onStart(() => {
    //1:文字のデータを準備する。
    $.state._1_data = "ハロー";

    //2:チュートリアル-Stateを使う
    $.log($.state._1_data + "cluster");

});

「State」を指定すると、変数の「_hello_」は$.stateに置換されます。
このように $.stateを経由して「パーツ」間で値をやり取り(ドラッグ&ドロップ)できるようにしています。
つまり逆説的に 「State」ではSendableな型のみ指定が可能 となります。
例えば「String」「Number」「Vector3」等は可能ですが、「SubNode」等は不可です。

3.1.4 「パーツ」チュートリアル-Const(deltaTime)を使う

$.onUpdateで提供されているdeltaTimeを使う「パーツ」を作ってみましょう。

チュートリアル-Const(deltaTime)を使う
/////version:v1
/////id:{1ee2f38f-ee22-44cb-a896-227092c08af2}
/////note:チュートリアル-Const(deltaTime)を使う
/////author:かおも
/////input:Const:Number:deltaTime::
/////output:-
/////local:-
$.log("deltaTime:" + deltaTime);

  • input行で「Const」を指定して下さい。「Const」は$.onUpdate等のコールバックで与えられる値を使う場合に指定します。
  • $.onUpdateのdeltaTimeはNumberなので「Number」を指定します。
  • 変数名にはdeltaTimeをそのまま指定します。
  • input行の残りは空文字列でOKです。
  • 「Const」の場合は例外で、スクリプト内ではdeltaTimeをそのまま記載して下さい。前後の「_」は不要です。

ここの変数名や型は、公式ドキュメントを参照して指定して下さい。例えば、$.onInteractのプレイヤーのハンドルであれば、「PlayerHandle」と「player」を指定して下さい。

作った「パーツ」を「画面更新(中略)のタイミングで処理します」に配置してください。
ここで気づかれたかもしれませんが、「Const」を指定すると「パーツ」を配置できる処理が限定されます。
具体的には、型と変数名が一致している処理に限定されます。
ここでは「Number」な「deltaTime」を指定しているので、$.onUpdate相当の処理のみに配置できます。

作られたスクリプトを確認してみましょう。

//画面更新(毎秒20-90回程度)のタイミングで処理します。
$.onUpdate(deltaTime => {
    //1:チュートリアル-Const(deltaTime)を使う
    $.log("deltaTime:" + deltaTime);

});

このように「Const」だけは、指定した変数名の置換処理を行いません。

3.1.5 「パーツ」チュートリアル-outputを使う

今度は「データ」を出力する「パーツ」を作ってみましょう。

チュートリアル-outputを使う
/////version:v1
/////id:{72a94c4b-3c30-4d74-9411-26e9f84b353f}
/////note:チュートリアル-outputを使う
/////author:かおも
/////input:-
/////output:State:Number:random:0-1の乱数
/////local:-
_random_ = Math.random();

  • input行はここでは「-」を指定していますが、必要に応じてこれまでのように「State」などを指定できます。
  • 現時点ではoutput行で指定できるのは「State」(と「InnerState」)のみです。
    • したがって、型も「Number」などのSendableな型のみ指定可能です。
    • 「random」は変数名です。input行のときと同じく、コーディング時には前後に「_」を付与して下さい。
    • 「0-1の乱数」は「データ一覧」に配置される時の説明文です。
  • output行で指定した変数にはconstやletの指定は不要です。ここでは「_random_」となります。

output行で指定した変数は、処理に配置した際に「パーツ一覧」に「データ」として現れます。
実際に「最初に一度だけ処理します(以下略」などの処理に配置して確認して下さい。

またその時のスクリプトは以下のようになります。

//最初に一度だけ処理します(最初の画面更新直前のタイミング)。
$.onStart(() => {
    //1:チュートリアル-outputを使う
    $.state._1_random = Math.random();

});

「_random_」はこのように変換されるため、先述の通りconstやletの指定は不要となります。

3.1.6 「パーツ」チュートリアル-localを使う

「データ」として出す意味がないけども「パーツ」内部では変数として必要というケースは多々あるはずです。
ここではそのような「パーツ」を作ってみましょう。

チュートリアル-localを使う
/////version:v1
/////id:{3ea7b19f-39bc-44fc-a4ba-3311af9d503a}
/////note:チュートリアル-localを使う
/////author:かおも
/////input:Const:Number:deltaTime::
/////output:-
/////local:elapse
const _elapse_ = ($.state._elapse_ ?? 0) + deltaTime;
if(_elapse_ > 1){
    $.state._elapse_ = 0;
    $.log("hello, world");
}else{
    $.state._elapse_ = _elapse_;
}

このサンプルは、1秒に1回「hello, world」とログに書きます。

  • input行は秒数カウントのために追加しています。
  • local行で、総秒数の記録用に「elapse」という変数名を指定しています。これまでの変数名と同様に、コーディング時は前後に「_」を付与して下さい。
  • スクリプト内では「_elapse_」と記されている箇所全てが置換処理の対象となります。これを利用して、サンプルのように $.stateに「パーツ」専用の変数を設けることも可能 です。

local行は1行で1変数です。複数の変数が必要な場合は、都度local行で指定して下さい。
この「パーツ」を配置すると以下のようなスクリプトが作られます。


//画面更新(毎秒20-90回程度)のタイミングで処理します。
$.onUpdate(deltaTime => {
    //1:チュートリアル-localを使う
    const _1_elapse = ($.state._1_elapse ?? 0) + deltaTime;
    if(_1_elapse > 1){
        $.state._1_elapse = 0;
        $.log("hello, world");
    }else{
        $.state._1_elapse = _1_elapse;
    }

});

const _elapse_$.state._elapse_の両方が置換処理されていることを確認して下さい。
このように、local行は他「パーツ」内部の変数名と衝突するのを避けるために使用します。


「パーツ」作成のチュートリアルは以上となります。
ここまでご覧くださり、ありがとうございます。

かなり独特な世界観で申し訳なく思っていますが、
これをきっかけに新しい「パーツ」を作って下さり、
創作が加速する方が増えることを願っています。

以下はこれまでのチュートリアルで触れられなかった「パーツ」で行える機能の全てを記載しています。
例えば、以下のような内容が書いてあります。

  • 配列を扱う方法(Array_xxx)
  • テキストボックスとドラッグ&ドロップを併用する方法(InputState)
  • 「パーツ」内に「パーツ」を配置する方法(////module)

3.2 「パーツ」v1書式

v1「パーツ」の例
/////version:v1
/////id:{52243f53-3c1b-4cbc-b993-897342739e6e}
/////note:複数のアイテムを1個づつ処理する。
/////detail:1個になったアイテムはこのパーツ内のみで使用可。
/////author:かおも
/////input:State:Array_ItemHandle:items::複数のアイテム
/////output:InnerState:ItemHandle:item:1個づつになったアイテム
/////local:i
for(const _i_ of _items_){
    _item_ = _i_;
    ////module:1:1:-:1個づつになったアイテムを処理するパーツ。
}

3.2.1 ファイル名、文字コード

ファイル名は何でも良いですが、拡張子は「.js」にしてください。
文字コードはUTF-8です。BOMはどちらでも可です。

3.2.2 version行(必須)

/////version:v1

必須です。
必ず先頭の行に配置してください。
将来、破壊的な変更があった場合に、v2とするために用意しています。

3.2.3 id行(必須)

/////id:(なにか他の「パーツ」と重複しない文字列)

必須です。
重複しなければどんな文字列でも可です。
GUIDだと何も考えずに記述できるので楽かと思います。

3.2.4 note行(必須)

/////note:(「パーツ一覧」で表示する文字列)

必須です。
ClusterScriptやプログラムの用語をできるだけ使わずに記述することを推奨しています。
「パーツ一覧」ではこの文字列の文字コード順に並びます。

3.2.5 detail行(任意)

/////detail:(「パーツ」にカーソルを合わせた時に出る補足情報)

任意です。この行が無くてもエラーになりません。
「パーツ」にカーソルを合わせた時に、tooltipとして出る補足情報です。
ClusterScriptやプログラムの用語で説明する場合は、こちらに記述することを推奨しています。

3.2.6 author行(必須)

/////author:(「パーツ」の作者名や、連絡先など)

必須です。
「パーツ」でエラーが出た時に、ユーザーの連絡先として必要です。

3.2.7 input行(必須)

/////input:(種類):(型):(変数名):(初期値):(説明文)
inputを使用しない場合
/////input:-

必須です。
「パーツ」が必要とする「データ」を定義します。

以下、各項について解説します。

「種類」について

値をどの様に扱わせるかを指定します。

State

「データ」として使用できる値であることを示します。
$.stateに入れることを前提としていますので、値はSendableである必要があります。
エディタ上では配置可能な枠として表示されます。

Const

「パーツ」がonUpdate等で提供される値を必要としていることを示します。
Constを指定した場合、変数名は公式ドキュメントで示される名前と同一である必要があります。
onUpdateのdeltaTimeを必要とするのであれば、変数名にはdeltaTimeを指定します。
エディタ上には表示されません。

Select

指定した文字のどれかを値として使用することを示します。
「パーツ」を分けるまでもないような場合に、モード指定として使用できます。
エディタ上ではドロップダウンリストとして表示されます。

Input

ユーザーが入力した文字や数字を値として使用することを示します。
エディタ上ではテキストボックスとして表示されます。

InputState

InputとState両方の性質を持つ値であることを示します。
「データ」を配置していない場合はInputとして振る舞います。

InnerState

「パーツ」内でのみ使用できる値であることを示します。
例えばfor-of文の中で使用できる値の場合にInnerStateを指定します。
output行専用です。input行では指定できません。


「型」について

変数の型を指定します。
ここで指定できる型はJavaScriptの型です。
ClusterScriptで定義されているVector3なども指定できます。

指定した型により、「データ」が配置できるかどうかを判定します。
また、置換処理の際には、その型に応じた文字列に変換されます。
例えばNumberなら1、Stringなら"1"となります。

ClusterScriptで定義されている型以外で指定できるのは以下のとおりです。
(Sendableの制約により、Date型などは指定できません)

  • Boolean
  • Number
  • String

先頭にArray_をつけると、その型の配列型であることを示せます。
例えば、Array_ItemHandleであれば、ItemHandleの配列となります。


「変数名」について

変数名を指定します。
指定された変数名に従って「パーツ」内の文字列を置換処理し、ClusterScriptのプログラムとして成立させます。
例えばitemと指定した場合は、「パーツ」内では前後にアンダーバーを付与し_item_と記述してください。

文章で説明するのが難しいので、申し訳ないのですが、同梱してある「パーツ」をいくつか参照してみてください。

置換処理の例

「種類」Input、「型」String、「変数名」nameで、abcdと入力された場合。
_name_は"abcd"に置換されます。

「種類」State、「型」String、「変数名」nameの場合。
_name_は$.state._1_valueのように、$.stateの値に置換されます。
置換後に付与されている_1_は、配置された「パーツ」ごとに振られたindexです。
これにより「パーツ」間での変数名の衝突を回避します。

変数名の例外

「種類」がConstの場合は置換処理を行いません。
onUpdateのdeltaTimeを使いたい場合は、そのままdeltaTimeと記述してください。


「初期値」について

値の初期値を指定します。
初期値が不要な「種類」の場合は空文字列で可です。

「種類」Input、InputStateの場合

テキストボックスに初期状態で入っている値となります。

「種類」Selectの場合

「|」区切りで値を並べてください。最初の項目が初期状態で選択されている値となります。
例えば「足し算|引き算|掛け算|割り算」と指定した場合、
「足し算」が指定された4つの項目があるプルダウンリストとなります。


「説明文」について

エディタ上で「データ」の説明として表示される文字列を指定します。

3.2.8 output行(必須)

/////output:(種類):(型):(変数名):(説明文)
outputを使用しない場合
/////output:-

必須です。
「パーツ」が出力する「データ」を定義します。
ここで指定した「データ」はエディタ上の「データ一覧」に追加されます。
各項についてはinput行の解説を参照してください。
現在では「種類」はStateのみ有効です。

3.2.9 local行(必須)

/////local:(変数名)
localを使用しない場合
/////local:-

必須です。
「パーツ」内部で変数を使用する場合に指定します。「データ」として認識しません。

他の「パーツ」との変数名の衝突を避けるための機能です。
input行やoutput行で示された変数名と同じ置換処理がなされます。

3.2.10 module行(任意)

////module:(番号):(インデント深さ):-:(説明文)

任意です。
「パーツ」内に「パーツ」を配置することができます。
この記述のある行に「パーツ」が配置されます。

「番号」について

「パーツ」内で重複しない数字を指定します。
複数の「パーツ」を配置できるようにするならば、1から連番で指定するのが無難です。

「インデント深さ」

「パーツ」を配置した場合のインデントの深さを指定します。
「パーツ」自身のインデントの深さが0です。
出力されたスクリプトを見た時に綺麗になるので、指定するとよいです。

「説明文」について

エディタ上で「パーツ」を配置する場所の説明として表示される文字列を指定します。

3.2.11 delete行(任意)

////delete

任意です。
プログラム出力時に削除される行となります。
プログラムとして出力してほしくない行の末尾に指定するとよいでしょう。

3.2.12 index句、note句(任意)

index文
////*index*/
note文
////*note*/

配置された「パーツ」に指定されたindexの数値と、note行で定義した文字列に置換されます。
「パーツ」から$.log()でメッセージを出す時に使用することを想定しています。
例えば、ItemHandleがnullである場合に、エラーとなる前にユーザに$.log()で伝えると親切です。

$.log("itemが指定されていません。" + "--////*index*/--////*note*/");

indexは、配置された「パーツ」間で重複しません。
そのため、この数値を出力するとどの「パーツ」であるかを探す手がかりになります。
配置された「パーツ」の説明文の冒頭の--1--はこのindexです。

4.よくある質問

よくある質問をまとめています。

undo/redoできる?

できます。エディタの右上にボタンがあります。
Unity全体でのundo/redoなのでご注意下さい。

配置した「パーツ」や「データ」を削除したい

カーソルを合わせると「操作」というボタンが出てきます。
このボタンを押すと「削除」が出てきます。

配置した「パーツ」を動かせないか?

今のところできません。すみません!削除してから再配置してください。
そのうちできるようにしたいです。

「パーツ」の本体はどこにある?

「Assets/KaomoLab/ModularCS/パーツ置き場」にあります。
独自に「パーツ」を追加したい場合は、このフォルダ以下に置いてください。

エディタが表示されない、切り替わらない、表示がおかしい

「Modular CS Component」の下にある「強制表示用ボタンと内部情報」を開いてください。
「エディタを強制再表示」を押してください。

ClusterScriptで音を鳴らす機能は?プレイヤーをアニメーションさせる機能は?

どちらも再生は出来ますが、現在の仕様上、停止ができません。
そのため未実装です。

アセット内の「パーツ」を自分なりに整理したい

標準で入っている「パーツ」は移動させないほうが良いです。
アップデート後に「パーツ」が重複しエラーとなります。

画面を明るいテーマ(配色)にしたい。

内部的には明るいテーマ(配色)も用意していますが、切り替え機能の実装がまだです。
手で書き換えることは可能ですが、慎重に行ってください。
Assets/KaomoLab/ModularCS/Editor/Views/Components/ModularCSEditor.uss
をメモ帳などで開いてください。
文頭の

@import url("ModularCSEditorColor-Dark.uss");
/*@import url("ModularCSEditorColor-Light.uss");*/

/*@import url("ModularCSEditorColor-Dark.uss");*/
@import url("ModularCSEditorColor-Light.uss");

として保存し「ModularCSエディタ」を開き直せばOKです。

Discussion