見出し画像

VRChatのワールド製作におけるコライダーについて

今月のワールド製作者向け記事は、最近難しめの記事が続いていたので、立ち戻って初心者向けの記事を書いてみました(……が、結構重たい内容になっている気がします)

今回のお題は『コライダー(collider)』です。

初めてのワールド制作で床用のコライダーを忘れて、無限落下しちゃった人は少なくないと思います。……私もしばらく前の話ですが、コライダーを入れ忘れて、招いたフレンド共々無限落下させてしまったことがあります。

この記事ではワールド制作と切って離せないコライダーについて、初歩的なところからVRChat特有のニッチな性質まで話していきたいと思います。

コライダー(Collider)とは

英語でいうと衝突装置を意味する言葉ですが、Unityではオブジェクトに対して『衝突するかしないかの判定』、すなわち当たり判定を付けてくれるコンポーネントを指します。

オブジェクトどうしはこのコライダーコンポーネントが付けられているかどうかで、ぶつかるかどうかが決まります。逆に言うと両方のオブジェクトにコライダーがなければ、お互いにすり抜けてしまうということが起こるわけですね。(もうちょっと正確に言うと少なくとも片方にRigidbodyってやつも必要なのですが、それについてはあとで解説します)

そしてこれはVRChatのプレイヤーについても全く同様です。

VRChatでは、2023/01/30現在、プレイヤーに対して高さ1.65m、幅0.45mのコライダーが自動的に付与されます。そのためプレイヤーに対してコライダーを付ける必要はないのですが、プレイヤーが降り立つべき床や地面にコライダーがないと、すり抜けて落下したり埋まったりします。

すなわち、コライダーは物理的な壁や地面としての機能を果たしてくれているわけです。

なので、基本的にワールド制作において、コライダーは欠かせないものです。

コライダーに関する基礎知識

コライダーの種類について


コライダーにはいくつか種類がありますが、大きく分けると『メッシュコライダー』と『プリミティブコライダー』の二つがあります。
付け方は簡単で、コライダーを付けたいゲームオブジェクトを選択中に、Inspectorの一番下にAdd Componentというボタンがあるので、そこから付けたいコライダーを選ぶ形です。

ボタンを押して……
検索して、選びましょう

『メッシュコライダー』はオブジェクトのメッシュ形状に沿ったコライダーで、簡単に言うと見た目通りに当たり判定を付けてくれます。
(補足:半透明 or 透明オブジェクトの場合は透明になったメッシュ部分にも判定があるので、見た目通りではないですが……)

メッシュがあるオブジェクトにつけると、自動的にそのオブジェクトのメッシュを検出して、コライダーを付けてくれます。
メッシュがないオブジェクトに付けても意味がないのでご注意を。

『プリミティブコライダー』は三種類あります。
「Box Collider」「Sphere Collider」「Capsule Collider」、つまり箱型・球型・楕円球(カプセル)型の三つです。メッシュコライダーと違い、コンポーネントが付いたゲームオブジェクトを選択すると下のようにガイドラインが見えます。

『メッシュコライダー』はメッシュのポリゴンに沿って正確に当たり判定を行うので、シンプルな形状の『プリミティブコライダー』と比較すると処理は重たいです。

ですが、コライダーは目に見えないので、多少形が異なっていても不都合はありません。それゆえ、シンプルな図形である『プリミティブコライダー』を組み合わせて、同じような形を作ったほうが処理の軽量化に繋がります。また、メッシュコライダーと違って自由に形状を作れるので、通り抜けられる壁とかドアとかも可能です。

『プリミティブコライダー』は複数付けても良い。

また、シェーダー・マテリアル側でメッシュの一部を透明にしている場合、何もないはずなのに通れないということが発生するので、そういう時は『プリミティブコライダー』を代わりに使うというのが一つの手になると思います。

ちょっと発展的な内容になりますが、モデリングできる場合は『メッシュコライダー』のmeshのところに好きなメッシュを付けることで、好きな形状のコライダーを自作することもできます。

(補足:あと実はWheel Colliderという車両専用のコライダーがあったりしますが、ここでは割愛します。私はさわったことないので。チクワカーシステムの説明書にかなり詳しく書かれていることだけは知っています)

物理演算について

コライダーコンポーネントが付いたオブジェクトに、RigidBodyというコンポーネントを付けると物理演算を行ってくれるようになります。これによりゲームオブジェクトを重力落下させたり、逆に無重力でふわふわと浮かせたり、他のコライダーの付いたオブジェクトと衝突したりということが出来るようになります。


ただし物理演算は比較的に処理が重めです。
特にRigidBodyを付けたときのデフォルトの設定だと重力落下するのですが、この重力落下した物体が地面に落ちたとき、負荷がきつくなります。

恐らく現実に慣れ親しんでいるみなさんは、「重力落下した物体が落ちると床で止まる」という認識でいると思うので、床に落ちたら負荷が無くなると思うかもしれません。

ですが、Unityはプログラムですので、基本的には「毎フレーム、衝突判定を行い続け、地面をすり抜けるかどうかの判定をずっと行う」ということをします。つまり、高頻度に判定処理が行われ続ける結果、負荷が高くなります。

なので、一般的にVRCのピックアップできるアイテムは重力落下をしない設定で運用されていることが多いです。この重力設定するかどうかという設定はRigidBodyのIs Kinematicという項目に関係しています。チェックを入れると重力落下しなくなります(正確には物理演算の影響を受けなくなるために、重力で落下しなくなります)

コライダーのもう一つの役割:判定


コライダーのもう一つの大事な役割として、触れているか(または内部にいるかどうか)どうかの判定に使うことが出来ます。

コライダーコンポーネントのisTriggerにチェックマークを入れることで、物理的な壁としての役割がなくなり、単純な当たり判定として機能するようになります。

これにより、『ピックアップの掴み判定』や『そのエリア内に人が居るかの判定』といったことに使うことが出来るようになります。
ワールド制作初心者の方でいえば気にするのはピックアップできるオブジェクト作る時くらいですが、応用例で行くとUdonでのギミックに使ったり、Postprocessのエリア分けに使ったりします。

注意点としては、『メッシュコライダー』はConvexという項目にチェックが入っていないと、isTriggerにチェックを入れることが出来ません。このConvexという項目は、メッシュコライダーの形をシンプルにします。形がシンプルになることで物理演算が低負荷になりますが、その代わり微細な凹凸は無視されるので、思ってた形状にならないことがあります。

Convex適応後。ガイドラインを見ると凸凹が完全に無視されている。

メッシュコライダーは使わないほうがいいの?という疑問に対して

原則的に、気にしなくていいと思います。経験則上、メッシュコライダーがあるせいで大幅にパフォーマンスが下がるようなことは一度も遭遇したことがありません。

ただしゲームワールドなどの、大量のオブジェクトが衝突し続けるようなワールドでは気にする必要が出てくるかもしれません。

Unity上で扱われるコライダーはRigidBodyが付いていない場合、動かない静止物体として扱われます。静止物体として扱われているときのコライダーはパフォーマンス的に最適化されているので、負荷的に軽量です(リファレンス)

RigidBodyが付いているオブジェクトで、何も力が加わってない かつ 移動していない時はスリープモードに入り、最適化されるので軽量になります。この状態も負荷的に軽量です。(リファレンス)

つまり、動いてなければ基本的に最適化されて軽くなるので、負荷的に問題にないはずです。

一方で頻繁にゲームオブジェクトの衝突が起こるワールドでは、常に負荷がかかる状態になっています。

そのようなケースでは、基本的にコライダーの形状がシンプルであるほど、軽量化に繋がりますので、以下のような対応を行い、軽量化を行うのがいいかもしれません。
①『プリミティブコライダー』でシンプルな判定形状を作る。
②『メッシュコライダー』のCovaxにチェックを入れることで、シンプルなメッシュコライダー形状にする。
③コライダー用のシンプルなメッシュを作り、『メッシュコライダー』のmeshに入れる

コライダーに関するテクニック

1,コライダージャンプ・ダッシュ

これについてはアバター等で良く使われている技術で、調べれば出てくると思いますが、ワールドでは基本的に使われていません。

なぜならUdonを使ったほうが、軽量かつ簡単だからです。
コライダージャンプを使う理由としては、『高速移動したい』『飛行したい』あたりだと思いますが、ここら辺はBooth等にギミックが色々出ているのでそれを使うといいでしょう。
ジャンプ力や移動速度であればVRCWorldプレハブの一番下にあるPublic Variablesの各項目を編集すれば大丈夫です。

2,コライダーの傾斜に沿って移動

これは純粋に私が好きな挙動なので紹介するのですが、重力を減らしたり、ジャンプ力を高くした状態で画像のような斜めのコライダーの根元の下でジャンプすると、プレイヤーが放物線を描くような感じで射出されます。
楽しい。

これを使ったワールドとかありそう~~~ってSDK2の頃からずっと思ってるんですが、未だに見たことないですね……誰か作りません?
(まぁこれも今ならUdonでやればいいのではという話になるのですが……)

2,梯子状のコライダー

VRChatだとある程度以下の高さのコライダーは自動的に乗り越える挙動をします。

これを利用し、乗り越えられる高さでコライダーを階段状にして、梯子などの急傾斜をスムーズに登れるようにするテクニックがあります。

こんな感じでも一瞬で上まで登れます

記事の後ろのほうで乗り越えられる高さについて、軽く検証したデータを載せておきましたが、基本的に一段の高さは0.5mだと連続して登れなかったため0.4m以下くらいが良さそうです。階段の幅は0.01m刻みでも登れましたが、それ以下だと登れなかったりしました。

その他いろいろ

検証用ワールドリンク

検証系は実際のワールドを作って検証しました。リンクを置いておきます。自分用なので超絶適当で後者は目安の数値すらないですが、とりあえずおいておきます。
プレイヤー幅・高さ→ワールドリンク
傾斜・乗り越え高さ・厚さ→ワールドリンク

傾斜に関する検証

5度刻みで検証しました。

90~65度:登れません。
60度:ジャンプを連打すれば登れます。
55度以下:スムーズに登れます。

乗り越えられる高さに関する検証

0.1m刻みで検証しました。

0.6m以降になると登ることができません。
試しに0.5~0.6m区間を大雑把に検証してみました。
0.555mまでは登れましたが、階段状のような連続する形状では登れなかったため、ギリギリ登れている可能性が高いなと思います。

コライダーの厚みに関する検証

0.01mずつ薄くしていってみたのですが、基本的にBox Colliderであればどんなに薄くても、デフォルトのプレイヤー速度では突破できませんでした。速度が速いと別かもしれません。

一方でメッシュコライダーは内側から外側にはすぐ出れてしまいます。出たところが空中だと弾き出されるような挙動をします。厚みが無く面が1枚だけだと特に顕著です。
外側から内側には 突破できませんでした。

ClientSimのプレイヤーコライダー

Client SimはUnity上で動くVRChat公式シミュレーターなのですが、プレイヤーのコライダーの大きさが現状(2023/01/30)合っていなさそうです(おそらく2m)
よって厳密にチェックを行いたいのであれば、VRChat上にキチンとアップロードして確認したほうが良いでしょう。
ちなみに他の挙動についても違いがあるときがあるので、コライダー周りについては、あまり信用しないほうが良いかもしれません(私が確認した限りだと、傾斜への挙動は角度が90度でなければ登れてしまうという差異があります。乗り越えや厚さへの挙動は同じように見えました)

衝突判定の設定

以前別の記事でも少しだけ説明しましたが、レイヤーという機能を使うことで制御することが出来ます。Unity上部のタブから[Edit]→[Project Settings]を選択し、出てきたProject SettingsウィンドウのPhysicsの下のほうで衝突設定をいじれます。レイヤーごとに衝突する・しないを選択できる形です。
一部の衝突判定はVRChat側で固定しているものもあるので、変更すると怒られてアップロードできなかったりしますのでご注意を。

コライダーの可視化

これは別の記事に書いたので、そちらを参照してください。

パフォーマンス面の最適化

CyberAgentさんが無料で出しているUnity Performance Tuning Bibleに色々書いてあるので見ることをお勧めします。日本語だし、とても分かりやすく書かれていて、めちゃめちゃありがたい書籍です。

とはいえ、VRChatに現状では関係なかったり、利用できない項目もあるので、初心者向けにコライダー関係の読むべき項を書き出すと以下の通りです。
6.3, 6.4, 6.6(Sleep thresholdの部分を除く)

(余談:これは私が繰り返し言っていることですが、基本的にパフォーマンス面を最初に気にする必要はありません。

非常に大規模なワールドなど、シビアな軽量化が求められるケースでは設計段階で負荷軽減を考えたほうが良いこともありますが、基本的には重くなってから対処する形で問題ありません。

過剰な軽量化は不必要な手間になります。ひとまず作って、耐え切れないほど重かったら考えるといいでしょう)

動くコライダーの上に乗って移動

一部の人にはファイナルソードと言えば伝わりそうですが、プレイヤーが移動しているコライダーの上に乗ろうとしても置いていかれます。

これはUdonを使うかStation(椅子)を使わないと無理だと思います。
Stationについては、記事が色々あると思うので特に書きません。
Udonについては、自分が知ってるのだとこんなのがあります。

おわりに

書き出してみたら意外と書くこと検証すること多くて大変でした。
というわけで、今年のワールド製作者向け記事、第一弾でしたがいかがだったでしょうか。

正直去年の年末まで頑張って書いたし、もう書かなくていいのでは?という悪魔の囁きがありましたが、自分の言語化スキルの役に立っているような実感があるので、とりあえずネタが尽きるまでは気ままに書こうかなと思います。

コライダーは序盤に覚えなきゃいけないのに、なかなか体系化されてなくて辛そうだなと思ったので書いてみました。参考になれば幸いです。

長文の読了、お疲れ様でした。

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