ビログ

自作ゲームやツールの紹介、VRデバイスやVRゲームのレビュー、VRChatプレイヤー向けのUnity講座などを書いています。

VRChatでみんなにおにぎりを配る(メッシュパーティクルで複数同時ワールド固定解説)

f:id:bironist:20190202191849p:plain

VRChatでメッシュパーティクルを利用し複数同時にワールド固定でモデルを表示する方法の解説!

はじめに

この記事はVRCSDK2を対象に書かれています。現在はVRCSDK3が標準になっておりSDK2はメンテナンスでしか使用しないことが推奨されています。
ちくわエビフライマヨネーズの記事を読んだ方はVRChatでアバターにオブジェクトをもたせることに関してはマスターしていると思います。
でも、持っている食べ物を手から離してワールドに固定したくないですか?
メッシュパーティクルを利用し複数同時にモデルのワールド固定ができます。

必要な知識と準備

アニメーションオーバーライドでものを取り出す知識、ワールド固定でパーティクルを表示する知識が必要です。
ちくわマヨネーズの記事を読んだ方は準備万端ですが、それがわからない場合は少しむずかしいかもしれません。
過去の記事で解説した内容を改めてこの記事の中で解説することはしませんので、少なくともこの2つの記事には目を通してください。

おにぎりのモデルとパーティクルを作る

はい、いつものようにモデルとパーティクルはBOOTHで販売しています!(宣伝)

f:id:bironist:20190202190243p:plainhttps://bironist.booth.pm/items/1211475


このあとの解説はこのモデルと付属パーティクルを使う前提で勧めますが、メッシュパーティクルで複数同時にワールド固定する方法は解説するのでご安心ください。

おにぎりをアバターに持たせる

上記のおにぎりを購入された方はOnigiri.unitypackageをImportしてください。
その後おにぎりをもたせます。この手順はちくわと同じなので以前の記事を御覧ください。

パーティクルを作る

上記のおにぎりを購入された方は、Importされたフォルダの中にあるOnigiriPoint.Prefabをアバターの直下に配置してください。

f:id:bironist:20190202165633p:plain
みここモデルに設定する場合はこんな感じの階層になるように配置します。
おにぎりを購入された方は大体の設定は完了済みですが仕組みを理解するためにも以下の項目も目を通しておいてください。

このパーティクルで実装したい仕様

今回作るパーティクルは以下の仕様を実現するためにマヨネーズよりちょっと複雑です。

  1. プレイヤーの入力(=特定のハンドサインを作ったタイミング)で、ひとつずつメッシュパーティクルを出す
  2. その入力が消えても、パーティクル自体はワールドに残り続け消えないようにする
  3. メッシュの向きを調整できるようにする(見せたい相手におにぎりの正面が見えるようにする)

一つずつ設定していきましょう。

OnigiriPointの設定

これはFixedJointでアバターの手に追従する部分です。マヨネーズの記事で書いたワールド固定パーティクルの仕組みと全く同じです。
おにぎりを購入してOnigiriPoint.prefabを利用した場合もFixedJointの設定は必須なので、マヨネーズの記事を参考に設定しておいてください。

f:id:bironist:20190202173628p:plain
画像の赤線の部分を手のRigidBodyに設定する、ということですね。
なんのこっちゃ?という人はまずマヨネーズから!

OnigiriBaseの設定

OnigiriPointの下に作ります。
f:id:bironist:20190202170619p:plain
ポイントはStart LifetimeとStart Speedが極端に小さい値にしてあることです。
パーティクルが発生とほぼ同時に死亡、そして速度がおそすぎるので事実上止まっているというところです。
SimulationSpaceはWorldに設定します。
Emissionの設定は、入力ごとに一個ずつ表示したいのでこのように設定します。

f:id:bironist:20190202171148p:plain

時間でばらまくことはせず、有効になった瞬間一個だけ表示するということですね。
そしてShapeの項目は一切パーティクルのブレはいらないので、Box設定です。その場に表示するだけでいいので。

f:id:bironist:20190202171011p:plain
そしてSub Emittersの設定です。

f:id:bironist:20190202171245p:plain

ParticleがDeathした瞬間にもう一つのParticleSystemであるOnigiriPartcleを発火する設定です。OnigiriBaseはStart Lifetimeが極端に小さいので、生まれた瞬間即死しOnigiriPartcleを表示することになります。
そしてOnigiriBase自体のオブジェクトは無効に設定しておきます。

f:id:bironist:20190202173123p:plain

OnigiriParticleの設定

これもOnigiriPointの下に作ります。OnigiriBaseのSubEmitterに指定したときにOnigiriBaseの配下に移動してしまうかもしれませんが、D&Dして戻しましょう。
f:id:bironist:20190202171827p:plain
Start Lifetimeはおにぎりをワールドに固定し続けたい時間です。この場合は25秒になっているので、25秒で消えます。Start Speedは0.0001などものすごく遅くしておきます。遅すぎるので事実上止まって見えます。
StartSizeはおにぎりの大きさです。手に持たせたおにぎりの大きさに合うように調整します。
SimulationSpaceはWorldに設定します。
MaxParticlesは同時出現可能なおにぎりの数になります。設定した数値✕メッシュのポリゴン数でアバターのパフォーマンスランクが下がるので最低限の数字にしときましょう。(別に大きすぎる数字に設定したところで、表示しなければ負荷は変わりませんが)

Emissionは上のOnigiriBaseと同じ設定にした上で、無効化しておきます。OnigiriParticleはOnigiriBaseのSubEmitterとして表示されるので。

f:id:bironist:20190202172326p:plain

そしてRendererの設定。

f:id:bironist:20190202172438p:plain

RenderModeはMeshですね、おにぎりモデルを表示したいので。
そしてMeshは当然Onigiri、マテリアルもOnigiriを設定しましょう。そして今回のキモ、Render Aligmentです。ここをVelocityに設定します。この設定はUnity5では出来ませんでしたので、VRChatがUnity2017になったことで可能になりました!
この設定によりメッシュの向きが移動方向に合わせられます。つまり、おにぎりを超微速で発射することで、角度の調整を可能にしたという仕組みです。(だから実はワールド固定と銘打ってますが、実は固定ではなくめちゃめちゃ遅い速度で動いてます、目視はできませんが)

いやー、設定項目が多くてややこしいですね。めんどくさい方はおにぎりを購入すればPrefabが付属しているのでD&Dするだけですべて終わっちゃいますよ!

f:id:bironist:20190202190243p:plainhttps://bironist.booth.pm/items/1211475

おにぎりパーティクルの位置とサイズの調整

普通に手に持たせたおにぎりと、ワールドに固定したおにぎりのサイズや位置がズレているとおかしいですよね。それを合わせなければなりません。
要はOnigiriPointのTransformのPositionとRotationを手に持ったおにぎりモデルの位置と合わせるということなのですが、力技で合わせるのはなかなか面倒なので簡単にバシッと一致させる技をつかいましょう。
まず普通に手もったおにぎりを表示します。

f:id:bironist:20190202174915p:plain

(手を握った状態になっていないので、手におにぎりが張り付いたみたいな状態ですがVRChat上ではちゃんとアニメーションオーバーライドで手の形をおにぎりに握った形になるので大丈夫、ちなみにおにぎり購入者はOnigiriHand.animに大体おにぎりを握ったような形のアニメーションが設定されているので、アバターに合わせて微調整でいけます)
このおにぎりはHierarchy上では手の中にありますが、これをOnigiriPointと同じ階層に持ってきます。

f:id:bironist:20190202175840p:plainそしてOnigiriのTransformをCopy Componentでコピーして

f:id:bironist:20190202175946p:plain

OnigiriPointにPaste Component Valuesで貼り付けます。

f:id:bironist:20190202180217p:plain

その後Onigiriの位置は、また手の中に戻してください。
これで簡単に位置が一致します。
おにぎりのサイズはOnigiriParticleのStart Sizeの項目で設定するので、手に持ったおにぎりに合わせて設定してください。
一時的にOnigiriBaseを有効化してシミュレーションすればSceneビュー上でおにぎりの大きさも確認できます。
おにぎりを購入した場合はこれで完了ですが、表示したメッシュによっては角度や位置がこれでもずれてるかもしれません。その場合も一時的にOnigiriBaseを有効化して確認しながら手の位置と合わせましょう。

アニメーションオーバーライドの設定をする

これはもう説明の必要はありませんね。ちくわマヨネーズのときと同じです。
おにぎりを取り出すアニメーションと、OnigiriBaseを表示するアニメーションの2つをお好みのハンドサインに設定するだけです。
おにぎりを取り出すハンドサインのあとに、OnigiriBaseを有効化するハンドサインをすれば、その場におにぎりが固定されるというわけです。
OnigiriBaseを有効化するアニメーションの中では、手の中おにぎりはちゃんと消えるようにしておきましょう。そうすればおにぎりパーティクルを置いた瞬間手のおにぎりが消えるので、本当に手に持っていたおにぎりをそこに置いたように見えます。

VRChat上で実際におにぎりを配るコツ

角度の調整はおにぎりの三角形の頂点を、おにぎりを見せたい人のほうにちょっと傾けて表示することです。
おにぎりの角度はおにぎりのVelocityにより調整されているので、内部的にはおにぎりを三角形の頂点の方向に発射しているイメージになります。

f:id:bironist:20190202181703p:plain

なのでおにぎりの正面を相手に確実に見えるようにするためには、このように少し傾けるとよいです。

f:id:bironist:20190202182606p:plain

おにぎり以外でも使えます

もちろんこの仕組みはおにぎり以外でも使えます。画像はちくわをこの仕組みでキッシュちゃんの口に大量にねじ込んでいるところ。
f:id:bironist:20190202183022p:plain
ちくわの場合はY軸回転してもわからないので、上のおにぎりの頂点を相手に傾けるなど意識しないでも手に持ったままの角度で置ける(置いたように見える)ので、大変おすすめです。
(今考えるとおにぎりではなく、こういうスティック状の食べ物で解説するんだった・・・!)
ちくわも販売中なのでよければ一緒にどうぞ!

f:id:bironist:20180819012447p:plain3Dモデル「ちくわ」 - bironist - BOOTH

完成

完成です。おつかれさまでした。
すべて想定どおりに設定できると、このツイートの動画のようになります。