SakeTami
messier
messier

fanbox


Vket2021・自サークルふりかえり

 おはようございます。本日でVket2021も終了ですね。あわせてBoothで行っているYorimichiのセールも日付が終了する頃には終了してしまう予定ですので、ご購入を検討されてる方はご注意下さい。

 さて、アドベントカレンダーの記事でも書いた通り、今回も出展したブースのギミックを含めた解説をやっていく感じでいきます。

 本当ならVket折り返しの頃に書こうかなと思っていたのですが、FF14暁月のフィナーレを膝に受けており、なんとか現実に這い戻ってきたらイベント終了日になっていました。おかしいな……。

Vket6でやり切れなかったこと

 現在開催中のブースを語る前に、今夏開催されたVket6のことについて語ります。

 一般サークルでのUdon利用開放や、下見ワールドの実装など、2021の入稿ルールは6から地続きになっている面が多いです。

 レイヤーなどの設定面においても6から地続きで処理できる箇所が多かったので、前回のイベント中に他のサークルさんを見て、「あっ、あれはいいな! 今回はできなかったけど、次回があればウチもやってみたいな……!」と思った部分をメインに実装しています。その中で、最も大きかった二つの要素として、「ライトベイクを行う」「遊びに来た人が遊べるスペースを確保する」がありましたので、「動きはあまりないけれど、その分のリソースをライトベイクとお遊び要素に当てたブース」というゴールを設定し、それを目標に作成しました。

 前回はライティング面を結構犠牲にしつつ、動いているキャラクターが多いブースにしていたので、それぞれに偏ったブースを作る経験ができたので良かったんじゃないですかね。


 ただ、出展モデルの作成作業自体がかなりギリギリで、展示物をただ展示する以上の要素を組み込む余裕はあるのか? というのもありましたので、ブースの外観モデルを作るより先にギミックの作成を行ったりしていました。

 これが難航するようならすっぱり諦めよう、というつもりでやっていましたが、基幹部分がどうにかイケそうな感じに仕上がったので、最初に思いついたギミックつきの案で進めることにしました。自分としても展示作品に心残りを作らずに済んだので、アバター製作もブース製作もちゃんとやりきることができて良かったです。

ブースの概要

 Unityで撮影したブース遠景がこちらです。

 透過系のパーツが見づらいので、背景色は濃いめで撮影してみました。

 実際にコンセプトワールド内に配置されている様子はこちら。今回、そんなに枚数を撮らなかったんですよね……。いい感じの遠景写真を撮り損ねていた。

 今回出展した貧窮街ボトムは、治安の悪さや廃墟感がテーマにある世界観だったので、うさんくさい手書き看板がいっぱい立てかけてある、古い謎の作業所が入っているビル……? というイメージで外観を作っています。建物はうっすいですけど、なんか現実にも、たまにこういううっすいビルあるよね……?

 普段、色々な読めるべき文字には英文も添えるようにしてあるのですが、今回の立て看板については日本語のみで表記しています。私たち日本人も、読めない文字が立ち並ぶ町並みなどを見て異国情緒を感じられることがあると思うのですが、英語圏から遊びに来られる方からしても、システム上読む必要がある日本語以外にはそういう要素があるのではないかと思いまして。

 横からの写真。

 導線に合わせて動くと、この面から見えてくることになります。

 この面には錆びたトタンを沢山貼り付けてあり、微妙にトタンのためのスペースも確保してある為、建物のメッシュは微妙にスペース限界値の横4メートルより小さい作りになっています。

 タイトル画像にも使っているギミック部。

「自分を売ろう!」というハチャメチャな文章が書かれているガレージ前中央に立つと、ギミックが動いて自分の情報が右のPC画面に表示されます。この情報はインスタンス内にいる間はずっと固定されており、一度トリガースポットを離れようが、アバターを変更しようが、まったく同一の情報が表示される仕組みになっております。

 また、カメラには映らないレイヤーで、上記の情報が「この診断はジョークです」という注意書きとともに添えられています。これは前回、VRC側にアウトと判定されたサークルが出展停止になってしまった事件があった為、「人身売買」というダークなネタで万が一うちも引っかかったらヤバイな……という予防措置であると同時に、「サークルに売れって書いてただろ! ちゃんと表示された値段で買い取れよ!」という人が万が一出てきてしまったらそれもヤバイな……と思ったので、書いています。隅っこの注意書きで救われる命があるんや……。

 この注意書き、カメラにも映しちゃって良かった気はするんですが、最終的には世界観を守る観点から記念撮影した写真には写らないように操作しときました。スクリーンショットなら普通に注意書きも表示されます。


 ちなみにこちらのギミックは、下見ワールドの時点で、複数人で訪れた際の同期に不具合があったようで、同ワールドに出展されているガラク堂のエスティさんに不具合報告をいただき、どうにか多人数でも遊べる仕様に変更することができました。あそこで一報頂けていなければ、壊れたギミックを展示することになっていたと思いますので、この場でお礼を申し上げます。

ギミック解説

 上記の人身売買フォトスポットがメインギミックなのですが、それ以外にもUdonをこねてギミックを実装している箇所がありますので、今回もすべて解説いたします。

 ……と、言いましても、そうではない方は一つだけで、前回も利用した「UCT+9時間を基準とした日付で表示を変更するギミック」だけで、やり方も前回とほぼ同じです。イベント開始日・終了日をDateTimeで設定し、本日の日付がイベント期間中ならイベント期間の表示を行い、それ以外ならイベント終了後の表示を行う仕組みです。

 ちなみに今回、一箇所このギミックが進化しました! それは何かというと……「デバッグボタンの追加」です!

 ええ……、来場される方には何も影響がない部分です……。

 前回は意図的にイベント開催期間の変更を行うとき、いちいちコードの部分の日付をいじって保存していたんですが、Udon解禁イベント二回目になってやっと(これ変数で制御できるのでは……?)と気づき始めたので、デバッグ用のboolを追加しました。デバッグモードがOnになっているとき、開催日付からマイナス一年の処理をしてから本日がイベント開催期間かどうかの判定をしてくれる(つまり、2021年12月1日~31日のイベントがあった場合、2020年12月1日をイベント開始日にしてくれる)ようになった為、ワンボタンで開発環境と本番環境の切り替えができるようになりました。

 大きな楽をするために小さな手間をかけるのはコーディングの基本理念だと思うので、ここに気づけたことは、私なりには大きな一歩です。難点は、毎回入稿し直すときにデバッグモードがOffになっているかきちんと確認し、ヨシ! ってしないと再入稿が不安になった点ですかね。デジタルでも指さし確認は大事……。


 さて、本題に戻ってメインギミックである価格表示システムの解説を行います。

 前項にて、「設定されたステータスはインスタンスに入り直さない限り固定」という紹介をしたと思いますが、この一人一人が固有に持つステータスは、インスタンスに入った瞬間に_VketStart(Vket専用関数。通常のUdonにおけるStart)にてランダムに決定され、滞在中は一人一人がローカル変数としてそれを持ち歩いています。それらは2種類の変数で、データ型はいずれもintです。

 そして、誰かがイベントトリガーに入ることで、入場者がギミック関連オブジェクトのオーナーとなります。そしてオーナーの個人データが同期変数に入力され、全員にそれらをもとにした表示を行う指示を出すことで、インスタンス内の全員が「画面に映し出されるオーナーの情報」を見ることが出来る、という仕組みです。

 同期変数を扱うUdonは、それがくっついているGameObjectを同期Objectにすることができません。ですから、これらすべての処理が、All宛てのSendCustomNetworkEventによる号令だけを頼りにそれぞれのPC上で再現されている幻覚ということになります。

 ゆえに、誰かが既にトリガー内にいる状態でインスタンスに入場した人がいる場合、おそらく最初からインスタンスにいた方と表示が異なっています。

 最初はここを一致させるために四苦八苦して、逆に不具合を招いてしまっていたようですので、この点については「別に表示が違っている状態でも致命的に困る内容にならないなら、表示が違ってても問題ない」と開き直ることで不具合を回避しました。

 ブースにたどり着くまでにはスポーン地点から距離がありますし、その間にまた誰かがトリガーを一度でも出入りすれば情報は同期されます。仮にそれがなかったとして、みんなに値段が見えている状態で、新規入場者にはリセット状態のフラットな画面が表示される状態になっているはずです。それはギミック自体が壊れてしまうよりずっと「気にしなくていい範囲の同期のずれ」なので、気にしないことにしました。


 ギミック全体の流れの説明が終わったので、ギミックに大きく関わる二つの変数の解説を中心に、より細かい説明に入ります。

 Start時点で入場者に与えられる2種類のintは、片方が「本人の価格」、もう片方が「本人の価格の決め手のインデックス番号」です。

 価格は純粋に「price」画面で表示される値段をそのまま持ち歩いています。

 価格の決め手は「price deciding factor」で表示される内容なのですが、Stringを同期変数に設定することは禁じられている為、price deciding factorの内容をデータベースのように配列化し、その内容を呼び出すためのインデックス番号をintとして渡しています。Excelを使う方だと、VLOOKUPみたいな方法で文字列を呼び出してる感じだと思っていただければ。

 この2種の情報は、インスタンスに入ってすぐランダムに設定され、ローカル変数に突っ込んだ後は不動になる為、情報の設定に使うための配列は関数内で宣言しちゃってます。処理が終わったら残らないので、すっきり。

 価格設定については、それなりに値段がゆらぎつつ、かといって数字が枠外に飛び出しちゃうほどゆらぐと困る……という感じだったので、2種類の配列を使いつつ、ほどほどにランダムになるような計算式を作っています。

 配列の中身は下記の通り。使い回さないので変数名も適当ですね。


int[] price1 = new int[] { 0, 1, 10, 100, 500, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000 };

int[] price2 = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20 };


 price1が価格の基礎値、price2が基礎値をもとにかける数……というイメージです。これらの配列にシャッフルをかけて、計算式に突っ込んで最終的な結果を出します。price1で0を引いてしまうと、price2で最高値の20を引いたところで悲惨な結果に……かけ算っておもしろいね。

 使った計算式は下記の通り。


myPrice = price1[0] * price2[0] + price1[1] * 5 + price1[2] * 5;


 つまり、結果の上での最高価格は

 10,000 * 20 + 9,000 * 5 + 8,000 * 5 = 285,000円

 最低価格は

 0 * 何か + 1 * 5 + 10 * 5 = 55円

 となります。最高価格でも人間につく値段と思うと大概安いな……でもまあボトムだから……。

 最低価格でも0円とならないのは、何らかの数字が出た方が面白そうだったということと、0=誰もトリガー内にいない状態とすることで、数字だけで利用状況の見分けが付く状態にしておきたかったからですね。結局使わなかったんですが。


 インデックス番号の方は、データベースとなっているString配列が20個となっておりますので、DateTime.Now.Second % 20(実際には20ではなく、数が変わる可能性も考慮して、データベース.Length)で処理しています。

 %は処理としては、「割り算のあまり」です。4 % 3の結果は1になります。

 入場時のn時n分n秒の「n秒」の部分を切り取り、その数字を20で割り、そのあまりを使うことで、絶対に20個以上にはならないインデックス番号を取り出しています。ここはローカル時間に依存しているので、タイムゾーンが同じ人が同時に入場すると、同じ数字になるかもしれませんね。狙ってやるのは難しいですが……。


 さて、これで一人一人が自分で持ち歩いている二つの数字が設定されました。この状態でギミックが動くトリガーに入ると、入場者のもつint情報が同期変数へコピーされて全体に表示されると同時に、入場者がオーナー設定されます。

 ディスプレイ1枚目の「name」には、入場者のディスプレイネームが表示される仕組みなのですが、ここには同期変数は使われていません。Networking.GetOwner(gameObject).displayNameだけで「このオブジェクトのオーナーのディスプレイネームを持ってきて」という処理ができる為、それを突っ込めばいいだけです。楽ちん。

 ちなみにトリガー内に人が複数入ってくる可能性も考慮し、「最後に入った人がオーナーになる」という設定になっている……はず。人が複数人トリガー内にいる場合には、オーナーとなる人が退場したときにだけ、価格表示されている画面が初期状態へリセットされます。

治安の悪さの魅力と難しさ

 話を展示ワールドの貧窮街ボトムに戻しますが、このワールドは「治安の悪さ」がワールドのキーワードの一つに掲げられています。ボトムに限らず、VRにおいて治安が悪いワールドというのは、ちょっと不思議かもしれませんが、観光的な魅力が高いのです。

 VRの利点の一つに、普段は行けない場所に遊びに行けることがあります。それは人間が生存できない宇宙空間かもしれませんし、物語の中の魔法の国かもしれませんし、既に無くなってしまった場所の精巧なフォトグラメトリかもしれませんが、まっとうに生きている人からすると、「現実的な治安の悪い場所」も十分に「普段は立ち入ることが出来ない魅力的な場所」なのです。

 身の安全が確保されたスラムには、妖しい魅力があります。普段は気軽に立ち入れないけれど、現実的に存在する空間でもありますから、フォトリアルな表現とも相性が良いです。

 あたりがすっかり消灯した町中の路地裏にある自動販売機がぼんやり光って、パイプからの排水で塗れたコンクリートがてらてら光っている。そんな場所に、真夜中だというのに若者たちがたむろして大声で騒いでいる。現実的にはなかなかそんな気分になれないかもしれませんが、これがバーチャル空間だと、こんな空間に不思議な居心地の良さを感じたりする瞬間もあります。


 かといって、フラットな目線で見て治安がいいか悪いかといえば「やっぱ治安は悪ぃよ」としかコメントができません。

 個人的なワールドでそういう描写をする分には全然いいと思います(むしろ好き)が、例えば今回のように多くの人が出入りする可能性があるイベント会場において、治安の悪さをウリにしているワールドだからとそっちの方向性をどこまで突き詰めていいのか……と考えるのは、結構悩ましい部分でもありました。

 今回、同ワールドに出展されたその他のサークルさんでも、「壁にされたスプレーの落書き」というデザインのブースを見かけました。例えばそれだけを見て、「こんな展示をやるなんて、このイベントは器物破損を擁護しているのか! 犯罪だぞ!」と言い出す人は少ないと思いますが、例えばワールドの飾りとしてドラッグの販売案内を吊り下げたら? 売春宿のような場所を作ったら? 犯罪被害に遭った人がいるような描写をしたら? まで突っ込んでいくと、どこまでセーフかよく分かりません。

 いや厳密に言えば、全部セーフです。やっていることはワールドの飾り付けです。実際に売られている違法なドラッグも、風俗宿も、治安の悪さの割を食う人もそこには存在しません。だからやりたい人が表現としてやる分には全然いいのですが、同じくらい「たかが飾り要素で不快になる人がいたらイヤだし、強く拘りたい部分じゃない限りはソフトにしたいんだけど……」という方向性も、「やりたい表現」として存在していいはずなんですよね。今までこの手の題材のワールドに出展してこなかったので、今回ここが悩ましい点だなと思いました。


 一番影響したのは、まさにprice deciding factorの欄でして、ここは表示される内容を何度か調整しています。

 真っ先に消したのは「性別」で、まあこのご時世あんまりよくないよな~とそれはさっさと決定したのですが、その後「年齢」や「恋愛遍歴」みたいなのも消した記憶があります。今は何か、VRCで遊んでる人ならまあ結果が表示されたときにみんなで笑えるんじゃないかなという内容だけに絞ってると思います。

 上記の消去内容でも、最初からそんなに気にするほどの要素じゃないだろうという感じなんですが、「世界観をより強く反映する」という意思で設定すれば、よりひどい項目を選定することも可能ではあるんですよね。

 そもそも最初に治安が悪いスラムという世界観を掲げているので、興味が無い人、嫌な人は来るな! というのも回答の一つではあると思うんですが、話題性でなんとなく来てみた人や、揚げ足取りがしたいタイプの界隈外メディアのことも考慮すると、治安の悪さが持つ魅力と、イベントとしてのクリーン感の両立って難しいんだろうなあというのが、今回ぼんやりと、それでいて一番強く感じたことだったように思います。


 ちなみに……。

 price deciding factorとは「価格の決め手」のことです。

 ちょうどタイミングが合う時間のときは、自分のブースを回ってくれそうな方の配信を見たりもしていたんですが、「長所」と受け取られていることが多かったかな? と思いまして。あくまでここは価格の決め手です。例えば愛玩用の存在を求めている人からすると、運動神経が悪くて逃げ出せない人や、社交性が低くて自分に依存してくれそうな人、周りに助けを求められない人の方が価値が高いかもしれません……?

 結果はあくまでランダムですが、出た結果と自分やお友達のステータスを照らし合わせて、色々背景を想像していただけると、話のネタとしても盛り上がりやすく、楽しいんじゃないかなと思います。

Vket2021・自サークルふりかえり Vket2021・自サークルふりかえり Vket2021・自サークルふりかえり Vket2021・自サークルふりかえり Vket2021・自サークルふりかえり

More Creators