☆これは「クラスター Advent Calendar 2025」1日目の記事です。
こんにちは。クラスター社でテクニカルアーティストをやっている滝 竜三です。
普段はCG制作チームなどへの技術サポートが主な業務で、Unity拡張ツールの開発や、clusterの機能に関する社内各所からの相談窓口といった仕事をしています。詳しくはこちらのインタビュー記事も読んでいただければと思います。
そういった社内サポートのほか、一部の公式ワールドではギミック制作を担当することもあります。昨年末から始まった有料イベント企画の会場「Cluster LIVE MUSIC CLUB」もそのひとつで、ギミック部分を僕が担当しました。
※僕が担当したのはギミックの仕組み部分のみで、会場のモデルや実際の演出は別のCG担当が制作しています。
今回はこの会場に実装した演出操作ギミックについて解説します。ご好評いただいているプリセット保存などの機能をどのように実装しているか、簡単に説明していきたいと思います。
Cluster LIVE MUSIC CLUBとは
クラスターでは昨年末から「有料チケット制イベント トライアル」企画をおこなっています。それに関連して、トライアル第一弾の共通会場、第二弾でも利用可能な会場のひとつとして提供されているライブハウスワールドが「Cluster LIVE MUSIC CLUB」です。
多様なライブに合うようさまざまな演出が組み込まれており、ステージ上とPA室にあるコントロールパネルからそれらを操作できます。
各演出は組み合わせを選択してからまとめて反映させたり、組み合わせをプリセットとして保存して簡単に読み込んだりすることができ、イベント開始前などにスタッフが演出パターンを記録しておいて、本番で再生するといった使い方ができるようになっています。
今回はこのあたりのロジックのつくり方や、制作の裏話について書いていきます。
実装
この会場の演出ギミックは、ほとんどがCluster ScriptではなくコンポーネントのGlobal Logicで動いています。
これはCCKコンポーネントの「TargetがGlobalのStateはイベント中ずっと保持される」という性質を利用するためで、これにより「事前にプリセットを登録して本番で読み込む」機能を実現しています。
スクリプトの$.state等ではイベントから誰もいなくなるとリセットされてしまうため、Global Logicの組み合わせで実装する必要がありました。
※他にも外部通信機能を使うなどの方法が考えられますが、もろもろ検討してこの方式を採用しました。
選択と反映
演出切り替えの際、コントロールパネルからカラーや演出パターンのボタンをインタラクトすると即座にそれが反映されるのではなく、選択してから「PLAY」ボタンを押すことで反映される仕組みになっています。これにより「色」「動き」「点滅」といった複数の要素を同時に変更でき、一気にバシッと切り替えるスマートな演出が可能になります。

これは演出ボタンを押したときに対応する待機用Stateの値だけを変更し、PLAYボタンを押したときに実際の演出切り替え用のStateを待機用Stateの値で上書きするようにして実現しています。
例えばライトの動きをパターン1に切り替える場合、まずパターン1に対応するボタンでlightMoveType=1を実行し、PLAYボタンを押した際にlightMoveType_applied=lightMoveTypeとして、Set Animator Value GimmickでlightMoveType_appliedを参照して動きを切り替える、といった形です。
実際のInspector(の一部)が以下です。1枚目がパターン変更ボタン(特定の値の指定ではなく、押すたびにインクリメントするタイプ)、2枚目がPLAYボタンのGlobalLogicです。
※RegisterParamsあたりについては後述します。
レーザー演出のSet Animator Value GimmickとAnimatorは以下のようになっています。_appliedの方を参照して演出が変化します。


プリセット保存
この会場では、さらに選択中の設定をプリセットとして保存・読み込みできるようになっています。
こういった機能はスクリプトで配列を利用したりする方が素直に実装できるのですが、先述の理由からめちゃめちゃ力業でGlobal Logicのみ利用して実現しています。
先ほどの設定ボタンのGlobal LogicからRegisterParamsのSignalが発火すると、まず選択中のプリセットボタンに応じたRegisterParams_プリセット番号のSignalが発火します。例えばパレット3のボタン2ならRegisterParams_32です。


そしてこのSignalが発火すると、現在選択中の各パラメータの値をパラメータ名_プリセット番号のStateに上書きします。

つまり、lightMoveType_00 lightBlinkType_00 lightColor_R_00...からlightMoveType_69 lightBlinkType_69 lightColor_R_69...まで数百個のStateが存在し、それらに値を保存しているという状態です。
この数のStateのKeyを手作業で変更するのは現実的でないので、GameObject名を連番で設定しておくとその数字を参照してまとめてKeyを変更してくれる補助ツールをこの会場専用に開発して対応しました。

演出への反映
保存・実行したパラメータは、主にSet Animator Value Gimmickを通して実際の演出に反映させています。
レーザーの動きや点滅のパターン変更はAny Stateから現在のパラメータの値によって遷移するだけなのでシンプルですが、カラーやテンポの変更には多少工夫があります。
カラーに関しては、RGBそれぞれの要素に分けてBlendTreeで制御することにより、あらゆる色を表現できる仕組みになっています。

図ではBeamLightColor_R_0にマテリアルのカラーのRのみを0にする1Fアニメーションが、BeamLightColor_R_1には同じくRを1にするアニメーションが設定されています。
G, Bについても同様に処理することで、RGBの値をそれぞれSet Animator Value Gimmickから制御し、自由な色に変更することができます。
最終的にカラーは8種類から選択する方式になりましたが、理論上はパラメータ指定の方法だけ変更すればどんな色にもできる拡張性があります。
選択式なら例えば「個別のオブジェクトとしてそれぞれの色のレーザーを仕込んでおいて出し分ける」といったシンプルな方式もありますが、今回の方式では最初に仕組みをつくってしまえば将来的にカラーのバリエーションを増やしたり、連続的にカラー選択できるようにしたりといったことが比較的簡単にできるメリットがあります。
テンポ連動についてはAnimatorのSpeed Multiplierを活用しています。60秒を単位とした周期でアニメーションを作成しておき、それに対しテンポ(BPM)の値をMultiplierとすることで、アニメーションの周期がテンポと連動します。
これについては60秒を単位としてつくっておくより、1秒単位にしておいてSpeedに1/60を入れておくとかの方がスマートだった気はしています。

このあたりで使ったテクニックに関しては昨年「Cluster Script Advent Calendar 2024」に投稿した記事でも触れているので、そちらも読んでいただければと思います。
※昨年の記事は主にスクリプトの話でしたが、Set Animator Value Gimmickを利用してカラーやテンポを連続値的に変化させるテクニックについても触れています。
制作裏話
この会場の演出や操作システムに関しては、経験豊富な社内スタジオチームから要望やフィードバックをもらいながら制作していました。
適用ボタンでワンクッション置いて反映する仕組みやプリセット保存の仕組みはスタジオチームから強い要望があり実現したもので、ある程度仕組みができてからも「プリセットは自動保存?保存ボタンを押す?」「テンポだけボタンじゃなくパレットごとにできる?」など、都度試してみてはあれこれ議論しながらブラッシュアップしていきました。
中にはなかなか無茶だなと思う提案もありましたが、個人的にもライブ演出ギミックをよくつくるというのもあってこだわりは非常によく分かるので、なんとかギミックに落とし込み結果的にかなり手触りの良い操作ギミックができたのではと思います。
会場自体や演出の内容もCGチームやスタジオチームのこだわりが詰まったものになっているので、(もちろん皆さんが自由につくった会場での個性豊かなイベントも楽しみですが)有料イベントを開催する際はぜひ会場の選択肢のひとつとして考えてもらえたらと思います。
というわけで「クラスター Advent Calendar 2025」1日目の記事でした。明日はtoyakunさんの「なんか」です。toyakunさんも社内でかなり広く仕事をしていて、いろいろ面白いネタを持ってそうなので楽しみです。

