見出し画像

VRC始めて1ヶ月だけどゲームワールドを作った

タイトルまんまです

2023年の4月にVRCを始めたばかり(2023年3月3日にこの世界に飛び込んで同年3月21日に作り始めてました)の赤ちゃんですが唐突にゲームワールドが作りたくなりました。その過程や参考にしたサイト等Tipsの自分用メモ。

完成したゲームワールド『Escape from WHITE』は迷路ワールドで、推定プレイ時間は40〜60分程度。
実際のプレイ時間平均は40分程度でした。

『Escape from WHITE』by Aizawa_0u0_



リリース時点の開発環境

Unity2019.4.31f1
VRCSDK3
(2023/06時点での情報なので、最新バージョンでは異なる可能性があります。)

一応中の人間について補足

・UnityはVRCを始めてから初めて触った。
・ゲーム開発も何もしたことない
・英語力が中学生以下(英語のサイトが読めない)
・ちょっとだけCの知識があるので、コードリーディングとかエラー処理は調べればなんとなく理解できる
・限界大学生で課題・実習に忙殺されているのでたくさん時間があるわけではない

ワールドの説明をざっくり

Escape from WHITEは真っ白な迷路のワールドです。
壁や床のコライダーが抜けていたり(壁抜け床抜けで進んでいきます。)する迷路です。
そこかしこに落とし穴があり、穴に落ちるとその面の入口からやり直しになるため、設置されているQVペンで印をつけながら進むことを推奨しています。
ステージは5面まであり、各面で正解の穴に落ちると次のステージに行けるようになっています。
クリアした後は最初の部屋でパスワードを入力することで観戦部屋に行くことができます。
観戦部屋には落とし穴の場所や抜ける壁を示したパネルを用意しています。
また、観戦部屋にあるボタンを押すことでexステージに行ける他、観戦部屋の鏡のボタンをオフにしたときに表示されている鏡は割ることができ、割るとexステージの観戦も可能です。


気を付けた点 / Tips / 実装したものメモ

作成していく過程で気を付けた点やTips、調べて自分なりに実装してみたものを挙げていく。

ボタンをuseして指定の場所にテレポートする

スタートの部屋から迷路の部屋に飛ぶ仕組みはこれを採用しようと思った。「ボタンを押してスタート」という方式がプレイヤーにも直感的でわかりやすいと考えたから。

以下にUdon Graphのスクショとデータを貼っておくのでよければ。(自分がダウンロードしやすいからだとかなんとか……)
teleport_switchはスイッチのオブジェクトにattachするスクリプトです。
以下に貼ってある写真のように設定しました。
teleport_toはテレポート先に設定するスクリプトです。
Create Emptyで空のオブジェクトを作成し、そこに設定しています。

teleport_switch
teleport_switchの設定場所


teleport_to
teleport_toの設定場所


穴に落ちたらその面のスタート位置にテレポートする

特定エリア内に入ったらローカルでプレイヤーをテレポートさせるようにする。
参考にしたのは以下の動画

こちらも以下にUdon Graphのスクショとデータを貼っておくのでよければ。
これは指定したコライダーに入ったときに指定した位置にテレポートする、というスクリプトになっています。
コライダーのオブジェクトに以下の写真のように設定し、移動先の座標には空のオブジェクト(teleport2)を用意し、前述のteleport_toを設定しておきます(もしかしたらいらない気がする)

teleport1-o
teleport1-oの設定場所


穴に落ちる判定が若干おかしい

落下する際は落下地点を限定させる意味と、穴に落ちた時に世界の裏側が見えたらちょっと悲しいという思いから筒を用意した。
しかし、その筒のColliderの位置や判定のせいで落ちるはずの床の上を歩けてしまったり、Colliderに挟まれた時のような挙動をしてしまう事があった。
そのような事が起きる筒を洗い出し、それらのColliderを抜く事で、判定バグが起きないようにした。
また、それによって筒から飛び出し、世界の裏側が見えてしまう事が発生する為、迷路全体を大きなPlaneで覆った。

ペンを持ったままゲーム出来るようにする

落とし穴や抜ける壁がある迷路なので、ペンでメモをしながら進めば圧倒的有利であり、後から来たフレンドにも伝えやすい。
ペンで書きながら進めば、落とし穴の所で書いてる線は地面に埋まるし、壁が抜ければ壁の中に線が埋まっていく。ジャンプすればジャンプした後が残る。

ジャンプしたまま書いた跡


大人数になるとぐちゃぐちゃ

ペンを持ったまま迷路に挑めば有利になると考えられる為、ペンを持って行って欲しかった。
しかし、最初の部屋から迷路への移動はスイッチをuseして貰ってteleportするように設定している。つまり、デスクトップの人は最初の部屋でペンを持ったまま迷路に入ることが出来なくなってしまう。
そのため、迷路のスタート位置からちょうど後ろを向いた所にもペンを設置した。
また、最初の移動以外にはuseしてteleportする形を採用せず、他は全てColliderに人が入った事を検知して呼ばれるOnPlayerTriggerEnterを採用した。

クリアタイムをゴールに表示する

この実装が1番時間がかかった。
それっぽいAssetをBOOTHで探したりフレンドが見つけてきてくれたりしたが、0.000sの形で表示するものばかりであり、希望していた形は00:00:00のような形だったのでどうしようか……と思っていた。

そんな時、ふと顔を出したケセドさん主催の『ワールド制作初心者交流会』にてケセドさん含む数人にBOOTHにあるオススメAssetを教えて頂いた。そして、そのAssetのスクリプトがかなり分かりやすかった為、それを元にC#の記述法を軽く勉強し、自分でC#コードを書いてなんとかした。
いくつかAssetを購入しスクリプトを見たが、本職っぽい人が書いたコードほど簡略化されていたため、初心者にはわからなかった……もっと励みます……

有料アセットの中のコードを自分で書き換えて使っているため、ここに載せられないため、参考にさせていただいたアセットを貼っておく。


ワールド内のジャンプ力、歩く/走る速度を変更する

いじる必要がある人はここをいじればいい。
穴を飛び越えやすいように、ちょっとだけ値をいじった。
上からジャンプ力、歩くスピード、走るスピード、横移動のスピードだと思います。walkとstrafeはrunの半分がいいらしいとSDK2の記事だかどこかで見た気がしなくもないですが見ないふりをしています。特に問題は起きていません。

Public Variables内を設定する


ワールド内でVCの音が減衰しないようにしたい

これはテストプレイを通して必ず導入しようと思ったこと。
壁抜け等で確認されたくなかったため、迷路の各面は物理的に距離を離して作成していた。そのため、迷路は1面から2面に移動するだけで直線距離で20m以上離れてしまう。つまり通常の設定では声が減衰してしまい、違う面にいる人や同じ面でも遠くにいる人の声は聞こえなくなってしまう。
そして真っ白でBGMもない迷路に1人取り残されるとどうなるか。人は簡単に病む。
そんなに人を病ませる気はないし、楽しんで欲しかったので、よくあるメガホンのようにワールド全体に全員の声が聞こえるようにしようと思った。

以下にSDK3でプレイヤーの音声を強制全員ミュートのワールドを作成したり、全員の声が近くで聞こえるようにする(音声減衰を設定したい)方法を残しておく。(調べた当時はSDK2の情報ばかりだったので……)

SDK3ではVRC_PlayerAudioOverrideの項目(SDK2では存在した音声減衰を設定できる項目)が削除されてるから、自分でUdonを書いていく。
参考にしたのは以下の公式ドキュメント

  1. HierarchyにあるVRCWorldのinspectorでUdon Behaviourを2つadd componentする(1枚目参照)

  2. Program Sourceに自分で新しく作ったUdon graph program assetをドラッグ&ドロップ(ここだとplayervoicenearとplayervoicefarのこと。とりあえず中身は無くてok)(1枚目参照)

  3. floatで新しい変数を作成して、2枚目のようにUdonGraphuを作る。これをfarを設定したいならfar、gainを設定したいならgainも同じように作る

  4. 右上のcompileボタンを忘れずに押すと、1枚目のようにinspectorのPublic Variablesで数字が指定できるようになっている。nearは減衰し始める距離の半径(m)、farは聞こえなくなる距離の半径(m)であり、それぞれ範囲は0~1000000。だから、farを0にすると強制ミュートワールドになり、nearを大きな値にするとユーザーの声がどんなに遠くにいても近く(耳元)で聞こえるようになる。

1枚目
2枚目

今回私が作ったのは全員の声が近くで聞こえて欲しいため、1枚目のような値になっている。farをnearの2倍の値にして設定してあるのは、どこかの記事でfarはnearの2倍の値が良いみたいなのを見た気がしたからだけど、真偽の程は謎。あまり気にしないで。

観戦部屋が欲しい

やはり、ゲームワールドは観戦部屋が欲しい。そして、声が全員近くで聞こえることや、迷路が何面にも分かれていることもあって、誰がどこにいるのか把握できるような部屋になればいいと思った。
迷路なので上から眺められればいいと思い、各迷路の上に監視カメラを設置、そのモニタをまとめて観戦部屋に設置した。
使用したAssetはこちら

しかし、このままでは天井しか映らない。そこで、天井のオブジェクトを全て「UI」レイヤーに変更。こうするとカメラには映らなくなる。
ここで、カメラに映らないということは各プレイヤーの持つカメラにも映らなくなってしまう点に注意する。このワールドでは上から見られたところで落とし穴の位置も抜ける壁も分からないので問題はない。

ちなみに解像度は2000×2000にしている。一度5000×5000にしたら、ワールド容量は軽いのに画面がガクガクするようになってしまった為、ある程度どのプレイヤーかの判別が付き、ペンの跡もそれなりに見えるこの解像度にした。

解像度を上げる前(500×500)の写真。観戦部屋で、ある面を上から映している。


観戦部屋に迷路の答えのわかる紙(ボード)が欲しい(フレンドからの要望)

先にゴールした人が観戦部屋から指示を出したりすることを推奨している。(どこにも書いてないけど)加えて、exステージに行くための謎解き時にも答えがわかるボードのようなものがあると良いと私も思った為、各ステージのマップをテクスチャにして貼ったボードを作成し、pickup出来るようにして設置した。

Quest対応したい

私のフレンドにはQuest単機でプレイしている人が数人いる為、Quest対応しておきたい。フレンド全員を苦しめたいからとか、Questだからって逃げられるのは悔しいとか、そんな理由ではない、断じて違う。
幸い、細かい調整を残して大部分が完成した時のワールド容量は14MB程度。そしてMaterialも自作の白と黒のMaterialと、壁の文字たち以外使用していなかった為、かなり軽かったので容易に出来た。

何故かVCCからだとAndroidBuildTargetにBuild出来なかったが、UnityHubからプロジェクトを開くと出来た。
Android Build Supportモジュールを追加しているのにVCCから開いたプロジェクトでDisableとなってエラーを吐いてしまう場合はUnityHubから試してみるといいかもしれない。

方法

  1. QuestはAndroidで動いている為、Android用にBuildする必要がある。UnityHubの該当するUnityバージョンの右端にある歯車 → Add module からAndroid Build Supportモジュールを加える。

  2. UnityHubからプロジェクトを開き、File → Build Settingsを開く。Androidを選択し、Texture CompressionはASTCに変更しておく。

  3. Switch Platformを押す

  4. (2回目以降は2, 3の操作ではなく、VRChat SDK Control PanelのBuilderからSwitch Build Target to Android/Windowsを選択すれば変更できる。)

  5. VRChat SDK Control PaneからBuild & Publish for Android/Windowsを押してアップロードする。

※もしワールドに更新を加えた場合、AndroidとWindowsの両方で再アップロードしないと片方のみ更新が反映されるような事態になるため注意が必要。

ゲームの解説

マップと答えの道筋

答えの道筋だけ貼っておきます。
観戦部屋にあるパネルに書き込んだ形の答えになっています。
紫は床(コライダーあり)、白は床(コライダーなし)、緑は壁(コライダーあり)、オレンジは壁(コライダーなし)です。

1面
2面
3面
4面
5面


exステージの謎解き解説

できるわけないだろあんなの~~~~~~~~!!!!!!!!!!
運だよ!!!!!!!!!!!!

というのも私はクリアできません。絶対に。あれは無理。迷路苦手なので……

あそこは落とし穴に落ちると、入口以外の違う場所にテレポート&場所によって向きも統一されていない……のです……

以下の写真に示されている宙に浮かんでいる黒いBoxをuseすることで行けます。

観戦部屋にあるexステージに行くボタン

マップの解説を失くしました(2024/10/10)大変申し訳ありません…………

解説はないのですが、ゴールまでの道筋はメモっていたのでそれを貼っておきます。紫は床(コライダーあり)、白は床(コライダーなし)、緑は壁(コライダーあり)、オレンジは壁(コライダーなし)です。〇が少しずれていますが、少し下の白いコライダーなしの床を指しています。

exステージのゴールまでの道筋


(余談)結局トラウマって何?

たくさんテストプレイしたフレンドに聞かれたので、観戦部屋のパスワードが「ほしにねがいを」、exステージのパスワードが「STAR」になっている理由と共にまとめておく。一応内容暗めなので注意。

小学校低学年くらいの頃、当時から主に人間関係で色々あって幼いながら生きづらくなっていた。そして、家庭環境などの他の要因も合わさり、それは中学を卒業するくらいまで緩やかに悪化し続けた。(今は大丈夫なのでお気になさらず)

ワールドがトラウマっていうのは、その経験を概念にしたものと今でもあまり行きたくなくてトラウマになってる、当時家族にたくさん連れて行って貰っていたログハウスの地下空間(どうやら現在その地下空間は改修されたりしたっぽい……?もう大人なので入ることができず、確認しに行けないことが惜しいですね……)をなるべくマイルドに再現している。

地下空間は天井が低くて、迷路になっていた。子供の身長でもしゃがまないと進めなくて、床は冷たくて、壁も天井も全て真っ白で、ライトが無数についてるせいで影が出来ない明るい空間で、明るいのにどこか気味が悪くて、曲がり角の先に何かが潜んでそうで一歩踏み出すのも怖かった。声は反響するし、上の階の人の声も聞こえるのに、周りには誰もいない。助けを求めても周りが真っ白だから自分の現在地を説明する手段がない。
これがワールドの元になっているトラウマ。

そして、リアルで色々あって人生に絶望してたときも、地下空間で動けなくなってしまった時も、救ってくれて希望となってくれたのが友達だった。

だから、このワールドは複数人推奨。友達と力を合わせて、誰も取り残さないで、全員でゴールを目指して欲しい。先にゴールしたら観戦部屋から助けてあげてほしい。

そして、exステージに行く為にはそれぞれのステージのゴールの場所が必要になる。質問は『What is the "location" of the answer?』。
つまり、答えの場所は何?
どこ?ではなく、何?
つまり、答えの場所が"何か"になっているということ。

ステージは全て8 × 8マス。
ゴールの位置を同じマス目上に全てメモって繋ぐと、とある形になる。それが星形。星は希望を意味するもの。

希望を見つけられたら次に進める。私のトラウマも友達という希望に救われたから、希望を見つけて欲しいという意味でexステージのパスワードはSTARになっています。そして、多分ゴールの位置をメモる為にはゴールを覚える必要があるが、1人だとかなりのマッピング能力を有すると思う。実際、かなり多くのフレンドにテストプレイをしてもらったが、ゴールの位置を正確に全て覚えているフレンドは1人もいなかったように思う。

チェス盤になってる!!っていうのはただの趣味。深い意味はあまりないけど、マス目にそって穴があったりするので、その目安にしてもらえればって感じです。
実はチェス盤に沿ってストーリーを考えたりもしていたけど、蛇足だと思い無くしたのは秘密。


最後まで読んでいただき、ありがとうございます!
もしプレイしてくださったら#ESC_WHITEでぜひ感想ツイートください!
問題などございましたら、以下までお問合せいただけますと幸いです。
https://x.com/SHIRO_0u0_ [@SHIRO_0u0_]


いいなと思ったら応援しよう!