VRCSダンス部発表会の書き残し
先日、VRCSダンス部発表会がありました。ダンサーとしても出たのですが、それ以上にワールド制作者としての側面も多くありました。
あまり語られることもないだろうと思いますので、色々な努力についてここに書き残しておきます。
前日譚
最近のダンス発表会系のイベントってすごいですよね。演出も含めて、総合的に来場者の方を楽しませるイベントとして成長しているという肌感があります。 ダンス発表会の企画自体は5月か、6月くらいに動き始めました。それくらいから、特に目についた ダンス発表会系のイベントやVRCアイドル文脈のステージイベントには、行けるところに片っ端から通い詰めました。いくつか写真を貼っておきますね。
からぱりふぇす づの、正直すき
ミルクリ1st Anniversaryのダンスパート。
サンリオのアイドルフェス。特に久世ぬぬちゃん(真ん中)と縁があって、めりぱふぇは特に推してます。
あきたん会。祝われる側がソロで1時間踊ってる激ヤバイベント。
坂本組で行われていたイベント。ノンジャンルで色々な演目が観られました。
キタバース。誕生日会系のイベントに限らず、あらゆるダンス発表会系のイベントの中でも最高打点を叩き出してくる最強イベント。
すたぷれ2ndLive "βorealis"。気合の入り方が異次元。
他にもいろいろ行きましたが、様々なイベントと魅せ方というのをインプットしてきました。 元々の来歴はパーティクルライバーなのですが、直近はステージ演出にも興味があって(もちろんダンス発表会系のイベントも、VRCアイドル文脈のイベントも好き好き大好き)、純粋に楽しむと同時に多くの学びを得られました。
そうそう、ステージ演出周りのライティングの技法について、色々Istriaさんに教えていただきました。こういう方です。今回の為というわけではなくて、過去1年間くらいに渡ってちょくちょく色々な技法について教えていただいたり、実際にUnityの画面を見せていただいていたこともありました。ある種、「それに見合うものを作らねばならない」というプレッシャーがあるという……
ステージ演出といえば、最初に作ったのは去年のほしまいに出演した際に制作した、『天樂』の演出が最初でした。
天樂。かっこいいよね。
その後に一度、天樂で一緒に剣扇舞をした相手である雪代琴狐さんと、VR剣舞師のLag:N/Aさんへ『吉原ラメント』の演出を提供させていただきました。このへんやこのへんを見ていただくと雰囲気が掴めるのではないでしょうか。
で、少なくとも半年、自分が出演するイベントとしては約1年の間、演出を作っていませんでした。というか、パーティクルライブも作っていなかったので、制作というもの自体を全然やっていませんでした。自分の中で、「自分だけ制作してね~~~~~!!!!!」という焦りというか後れを取っている感覚は若干ありました。
その中で迎えたVRCSダンス部発表会イベント。ワールド制作周りを全部受け持ったタイミングで、自分の中での目標が決まりました。
- 1年分の知見の実験をする
- ダンス部発表会で、他のダンス発表会系のイベントと遜色ないクオリティを出す
一つ目はもうそのまま、このイベントを実験台にしてしまおうということです。流石に制作をしなさすぎて、実験の時間も満足に確保できていませんでした。本番が実験環境って、すごい贅沢な本番の使い方ですね……。自分で言うのもなんですが。
直接は関係ありませんが、裏では私が演出に携わっている別のプロジェクトがあります。それに対して十分なクオリティを出すための実験、という側面もあります。今年中には何かあると思うので、気になる方は気にしていただけると嬉しいです(実質、何も言っていない)。
もう一つが、文化祭に向けての布石です。文化祭が秋終わり頃にあることはなんとなく耳に挟んでいたので、むしろ自分の中ではそちらを真の本番と位置 付けています。VRCスクールのイベントということで、少なくともVRCスクール関係者の来場はある程度安定して見込めることが(過去の文化祭の事例も含めて)想定できました。まずは"身内"に向けてよさげなものを出して、1ステップ踏んだうえで文化祭を迎えることで、口コミによる情報の伝搬を狙っていました。実際のところこれには嬉しい誤算があり、想定外の方向に転がることになるのですが……。
ワールドギミック
ワールド全部担当しているので、ワールドギミックも色々作りました。演出より先にこっちを紹介します。
GeneralSwitch
いわゆる「オブジェクトのON/OFFを行う」ボタンです。去年の7月くらいに、天使のひまわり!2ndLive『Angelic Sunflowers!』の際に制作しました。
それ自体は一般的なものですが、特筆すべき点は「ON/OFF対象のオブジェクトの数が可変」「スイッチの数も可変」 「Local/Globalも可変」という、汎用性を極限まで煮詰めた構成にあります。これ自体のバグを可能かなぎり厳密に取り除いてあるので、何かしら不具合が起きた時にここのソースコード周りは一旦思考から除外して考えてよいものとしています。
スイッチの数自体は、このスイッチを触った時にCubeの色が赤と緑に変化する判定に使っているだけで、Interact判定に関してはUdonが付いているGameObjectに対してColliderを複数設定することで増やしています。スイッチの色は、Toggle Objectsの先頭のGameObjectのアクティブ状態を参照しています。
ワールドに存在する全ての単純なON/OFFギミックはこのボタンのPrefabから生成されています。更に改善できる点があるとするなら、ボタンの上のテキストは手動で設定しているので、ここの自動化も頑張れば多分可能です。頑張れば。
折角なので、使われている内容全部書いておきます。
- Global
- Buzzer - 開演ブザーです。AudioSource入りのGameObjectのON/OFFで制御。使いまわしは正義なので、
- StageInfo - 「開演前の注意事項」です。パネル画像自体はSpriteから生成しています。
- StagePoster - ステージ上にポスターを出す、主に集合写真用のギミックです。
- StageIntrusionCollider - 観客席とステージを分けるコライダーのスイッチです。本番は常時ONですが、リハの時とかはだいたい切っていました。
- CanEnter - 21:50まで入場できなくするギミックです。21:50に手動で入場可能にすることで、これを実現できました。
- Local
- IwaSyncMover - Moverと付いていますがこれは昔の名残で、今の実態はSwitcherです。動画再生を担うQuadを狙ってON/OFFしています。
- Effect - 演者がダンス中に重くならないように、演出を切るボタンです。私は1曲を除いて付けたまま踊っていましたが……。
- CalibrationMirror - 演者向けのキャリブレーションミラーです。演出が出ていない時にワールドが真っ暗になるので、ミラーに合わせてDirectionalLightも点くようにしています。
- StaffRoomCollider - スタッフルームから落下しないようにするためのコライダーのスイッチです。飛び降りると奈落。
- Mirror & Bamiri - ステージ上のミラーと、位置確認用のバミリを出すスイッチです。ステージミラーはVRCPlayersOnlyMirrorを使用しています。
DancerMode
信義則のため詳細は書けませんが、ダンスを"いい感じ"にしてくれます。
IwaSync Player
普通のIwaSyncです。ただし、Sync FrequencyとSync Thresholdはそれぞれ2, 0.2まで下げています。特にThresholdはどこまで下げていいのか正直わかりませんが、デフォルトと比較すると非常に小さい値であることが分かります。
また、Playlistに今回使用する曲を全て入れています。これで選択も楽ちん。ちなみに、BGMや暗転用の無音動画も入っています。
更新で壊れるのが嫌なので、ここのコードには一切手を入れていません。 このために、後述するコードがたいへんな筋肉実装となってしまうのですが……。
IwaSyncEffeceWrapper / PlayableAdjusterWithIwaSync
今回の目玉ギミック。これら2つが協同で、動画の音声に対してエフェクトが†完全に†同期します。
IwaSyncEffectWrapperでは、動画に合わせて曲の演出をスイッチします。曲の判定にはURLを使っており、URLがIwaSyncのPlaylistから取れればよかったのですが調べる時間がなかったので、Public変数としてURLのString配列を持つことにしました。何故かVRCUrl型ではうまく判定できませんでした。
PlaylistURLと演出の突き合わせは、「N番目のURLがIwaSyncに入っているなら、N番目の演出をONにする」だけで、Index番号を用いる素直(?)な実装です。問題は、「IwaSyncにURLが入った」ことを取得することです。IwaSyncの本体のコードがいじれない制約上、私の知識には「URLが入力された」イベントを外部Udonから取る方法がありませんでした。そこで、Updateで毎フレーム、現在のURLを取得し続けるという筋肉実装が行われています。
「外部のUdonでイベントが発火した」という情報を取得する方法が思い当たる方は、ぜひご連絡をお願いいたします。マジで。
PlayableAdjuster with IwaSyncでは、IwaSyncの動画の再生位置に、Timelineの再生位置を同期させます。
……突然Timelineの話が出てきました。そう、本イベントの演出周りは全てUnityのTimeline機能を使って製作されています。多くのパーティクルライバーが用いる方法と同様です。普段のパーティクルライブと異なる点は、Timeline(Playable Director Component)を付けたままアップロードできることです。あと、それに伴ってUdonで制御できること。
PlayableDirector1つにつきPlayableAdjusterが1つ付いているのですが、これもUpdateで毎フレーム、現在の動画の再生位置とTimelineの再生位置を合わせ続けるという筋肉実装です。一応、ズレがeps(デフォルトだと0.05秒)未満であれば処理をスキップすることで過負荷になりすぎないようには心がけている……つもりです。IwaSyncみたいに、Sync Frequencyを設定できるようにするのがスマートな実装だと思います。
実装に際して、rzVRMVTimelinePlayerを参考にさせて頂きました。主にPlayableDirectorの扱い周りです。参考にしたといっても、だいたいリファレンスに書いてある内容で完結していたので、リファレンスが読める人はそれでいいと思います。
これら2つについては、もうちょっと形を整えたものをどこかで公開できたらいいな~と思っています。特に、「IwaSyncのPlaylistから動画URLを取得する」「Sync Frequencyを導入する」「Udon自体を1つにまとめる」の3点を今後実装し たいと考えています。
そういえば、他の人もTimeline(もしくはAnimationWindow)から演出作ってるんですかね?少なくとも1名は「Timelineから演出作るのだるいから、全部Udonで制御できるようにした」って言っている人を見かけたので。いや流石にTimelineの方が良くない????? いやTimelineも決して最優秀な選択肢ではないんですが……。
ワールドライティング
ワールド全部担当しているので、ライティング周りも全部面倒見ました。全部といっても、そんなに高級なことはしていません。
エントランス
エントランスとステージに共通で、Drama Hallというアセットのモデルを改造して使用しています。特にスケール周りやステージ側の観客席の構造などを作り変えています。
とにかくちゃんと軽いこと、そこそこ見栄えがいいことの2点を心がけています。というのを先述した『Angelic Sunflowers!』と昨年のVRCSダンス部発表会でやったので、使いまわしです。楽できるところで楽をしましょう。
一応、リスポーン地点正面の扉の先ではなく、その逆側にステージが存在します。ワールドにOcculusion Cullingを意図的に入れていないので、最低限Frustum Cullingは利くようにしようという、言うなればお祈りみたいなもんです。
エントランスでアバターが暗くなること、演出発生時にエントランスが爆裂に光ることは既知の不具合です。文化祭までにはなんとかしたいなぁ……。なんでOnPlayerTriggerEnterってうまく動かないんですか!?
ステージ
ステージも同様に使い回しです。ただ、メッシュの統合だけ統合単位を変えています。実はざっくり「観客席側」と「ステージ側」だけで分けてよくて、演出では「ステージ側」を消すことで自由な舞台を生成できます。
Frustum Cullingお祈りは、エントランスを出口側に置くことで対応しています。Camera Farで消してもいいのですが、演出との兼ね合いの都合上できませんでした。
全体としては照明が映えるように黒主体で、幕は映えるので赤いです。黒は黒でも、やや灰色寄りの黒だと照明が入った時に分かりやすいのでこの色を採用しています。また、段差近くの白い板と、段差の部分のAudioLinkが、演出によってよく光ります。モノ好きな人はここの光り方からPostProcessを逆算してみてください。
あと、Enviroment Lightingでの光源効果を一切排除しています。これも演出都合。これはこれで演 出を制御するのが難しいんですけどね。環境光ってUdonから触れたっけ…… 環境光自体は触れた気がするけどSkybox変更がうまくいかなかった記憶がある……
音響
出演者でもある煉獄丸さんにお褒めいただいたので、折角なので書き残しておきましょう。
先の章のステージのUnity画面のスクショを見てもらうと分かると思いますが、ステージ上にAudio Sourceが4つ存在します。実際にはこのうちの2つはTopazChatによるものなので今回使ったのは2つですが、Audio Sourceを増やすことで音響の立体感・臨場感を演出しています。あと、現実のステージでは舞台の左右などにデカいスピーカーがあったりするので、それの再現という気持ちも含まれています。天ひま2ndの時に、プロデューサーのひまみんとさんにアイデアを出してもらってこの調整に落ち着きました。
反響設定については、難しいことはしていません。Audio Reverb Zoneを適切な距離に設定する気持ち。客席の後方に行くと反響感が減少します。様々な物体が音を吸収するイメージ。先述の天ひま2ndの使いまわしですが、何も考えずに使いまわせるくらいには良い「ホールの響き」をしてくれます。恐らく今後も使われることでしょう。
更に詰めることもできると思いますが、それをするなら実際のホールで大きな音を鳴らし た際に、位置によって反響感がどのように変化するかを知る必要がある気がします。人生経験が足りていないですね……。
アバターライティング
リファレンスはキタバース(2023)、それと不特定多数のおはツイです。おはツイ勢、見た目に狂気じみたこだわりがありがちなので、方向性構わず大量のインプットが欲しい時は重宝しますね。
あと直接的なリファレンスではないけど脳裏によく走っていたのはSS!ダンスリサイタルやSanrio VFes ハルリットスペシャルステージなどです。なんか、明らかに、誰かさんに直接影響を受けている……。まぁ誰かさんもスクール1期生ということで、実質協力戦ということで、許してくれや……。
liltoonのプリセット機能を用いて導入を行い、出演者のみんなに協力してもらう形で実装をしました。ステージ上での見栄えを前提としているため、通常のワールドではかなり影が色濃く出るようになっています。逆光時のリムライトがほんのりアバターのアウトラインのように出てくるの、お気に入りです。
行間 - 本番前のおはなし
ワールドの最終版がアップロード完了したの、なんと本番インスタンス集合の80分前です。
最後の最後まで後述する演出の調整と、演出の調整と、バグ取りと、演出の調整を行っていました。スケジュールが頭悪すぎる……。遅刻していないのでギリ許されるということにしてください。一週間くらい某UnitedでMagicなイベントの運営を放り投げて作業していたので……。それでギリギリなので……。(どっちかというと放り投げてた方でお叱りを受けそう)
他の人がどう思っていたかはわかりませんが、私の中ではインスタンスMax80人中、だいたい40~50人程度の混雑率で推移すると予想していました。これは、前回の文化祭の際のインスタンス人数が30~40人程度で推移していて、そこに直近の期の卒業生バフと文化祭ではないデバフを考慮してこんなもんという予想でした。
蓋を開けたら、インスタンスに80人いました。え?????軽く参加者分析をしたところ、スクール生が35名程度、ダンサー勢が25名程度、純粋にこの手のイベントを観に来るのが好きな人とかが10名程度、って感じでした。軽くなのでブレがあるかもしれませんが、ダンサー勢の方に結構話題が飛んでいたのかな?というのが興味深いポイントですね。