ClusterScriptのサイズ制限をどう回避するか

最近取り組んでいるのが、clusterのワールド上で動くjavascriptである、ClusterScriptです。
元々C++やjavaなどでプログラムをして遊んでいたので、せっかくなのでそこら辺の経験を少しでもいかせたらいいなと思っての事です。
以前作ったプログラムの中で、うまく使えそうなものがあったので、移植を試みていました。
ただ、元々javaのプログラムをjavascriptにするのはそれほど難しいことではありませんし、割と何とかなるだろう、と思っていたのが見込み違いでした。

ClusterScriptで何か作るにあたって、障害となるものが幾つかありました。

1.unity上での動作ができないため、動作確認のためにcluster上に毎回アップロードする必要がある。

2.アイテムが非アクティブであってもScriptはワールドが生成されると同時に動作が始まってしまうので、開始タイミングを制御できない。

3.Scriptとワールドとのデータのやり取りする手段が限られており、特にScript内で得られた計算結果を他のアイテムやワールド全体で参照する方法が見当たらない。

4.Scriptファイルのデータサイズの上限が20KBに設定されている。

5.Script内で得られた計算結果を出力する際、float形でのデータしか出力できないため、精度が低い。

6.スクリプトアイテムの子にスクリプトアイテムを作れない。

とりあえずこんなところでしょうか。
ちなみに1に関しては、先日かおもさんという方が公開してくださった「CSEmulator」というアセットによって解決しました。
本当にありがとうございます。
また、3に関しては先ほどのかおもさんはアイテムの座標を利用してデータのやり取りを何とか再現されていますが、精度などの面で使い勝手はあまり良くなさそうですし、様々なClusterScriptを利用したギミックを製作されているWATさんもcluster社への要望としてワールド全体への結果出力を上げられています。
ただ、有効な解決策は見当たらないのが現状のようです。

さて、本題に入りますが、そもそも自分がぶち当たった最大の壁は、4のサイズ制限でした。
まさしく天文学的な計算をしなければならないので、何も考えずに作ったScriptファイルは、40KBのファイルサイズとなってしまっていました。
対策として真っ先に考えたのはScriptを分割して複数のアイテムへと分散させることでしたが、散々試行錯誤してみたものの、これに関しては特に3が支障となって実現できそうにありません。

そんなわけで、現在たどり着いたのはこの二つの案です。

1.変数などの名称を極力短くする。
初歩的な方法かもしれませんが、これが結構ダイエットになりました。
特に、複数の関数の中で使用する変数は本来引数や戻り値で受け渡しするか、$.state変数を利用することが推奨されている所を、あえて非推奨のグローバル定義変数でやり取りすることによって、文字数をだいぶ稼げたと思います。

2.javascriptのサイズ圧縮サービスを利用する。
あとは、文明の利器に頼ることにしました。
幾つかこの手のサービスやプログラムはあるようですが、自分が利用したのは「JSCompress」というサイトです。
コメントはもちろん、スペースや改行なども消してくれるので、3割程度はサイズを削減できました。

まだ未完成ではありますが、おおよその骨格が出来上がったところで、現在のScriptファイルのサイズは19.3KBです。
本当にギリギリですが、何とか制限内に収まる可能性が見えてきました。
将来的な仕様変更はあるかもしれませんが、現状の中でのベストはつくしていると思います。

この記事が気に入ったらサポートをしてみませんか?