VRChatでParticleで魔法とか銃とか撃つ方法とそのSimulation Spaceの注意点

◆前置き


この記事は、

Unityとか全くわかんねえ!けどVRChat面白そう!で始め、

意気揚々とMMDとかのアバターをインポートしてログインし、

アニメーションオーバーライドでなんとか指の形や表情差分を作ることはできたものの、

周りのプレイヤーを見たらなんか魔法とか銃とか撃ちまくってる!

アニメーションオーバーライドの悦びを知りやがって!許さんぞ!俺にもさせろよ!

ってなった数日前の私のような皆様を対象に書かれています。

要は初心者向け記事です。

わかりやすい解説動画とかもありますが、英語のものが多いですからね。

撃ちたいですよね、グロック


◆そもそもあの魔法とか銃弾、どうやって飛ばしてんの?


前置きはさておき、本題に入りましょう。

Shurikenがどうとかの細かい仕組みの話は私もUnity初心者なので出来ませんが、

UnityにはParticle Systemという機能があり、

Particle Systemオブジェクトを配置すると、そこに生成されたEmitter(発射装置)からParticle(粒子)を飛ばすことが出来ます。

出てくる粒子の形を任意のMeshに変更したり、粒子の後を追尾する尻尾を付けたり、発射中に色やサイズ、速度や向きを変えたりなど・・・色々な機能はありますが、基本的には「粒子を飛ばす」ことで様々なエフェクトを実現しています。


◆Simulation Spaceについて、お話しします

 ※今回は練習として、ひとまずデフォルトのこれを出します。やり方さえわかればアレンジは千差万別ですからね!


今回は例として、以下の2つの違いと設定方法を紹介しつつ、たまこちゃんの指先からほぼデフォルト設定のパーティクルを発射してみたいと思います。

素敵なたまこちゃんのMMDはこちらからDLできます。作者のしあ様、ありがとございます。

さて、ご紹介する2つの設定は以下となります。

・パーティクルの設定項目「Simulation Space」をLocalで設定
・パーティクルの設定項目「Simulation Space」をWorldで設定

※Particleの見た目を決定付けるその他諸々の設定項目については、長くなりますし、「Unity Particle」とかで検索すると、ためになる記事が沢山ありますため、今回は割愛します。


何故ここに焦点をあわせるかというと、かっこいいパーティクルを作るのに重要ポイントなわりに、意外と設定がドツボにハマりやすい(ハマった)ためですね。

さて、このSimulation Spaceの2つの違いは、

Local:「発射後に自分の発射元(親オブジェクト)の動きに追従する」
World:「発射後はワールドの物理法則に準ずる」

の違いです。

例えば、指先から弾を射出したとしましょう。

前者で設定した場合、弾の発射後に指を動かすと、空中を飛んでいく途中の弾が指の動きに準じて移動してしまいます。

後者で設定した場合、弾の発射後に指を動かしても、一度発射された弾は発射された時の向き、軌道を保ちます。

たとえば銃弾など、何かを発射して飛ばす場合、後者の「World」の設定の方が向いていますね。

逆に、魔法陣を発生させて、それを手にぴったり追従させたい、などの場合は「Local」が適しているでしょう。


さて、このSimulation Spaceの設定ですが、

前提として、Localのものを作るほうが簡単です。

しかし、Localで作ったものを、そのままSimulation SpaceをWorldに変更するだけでは、

Unityのシミュレーションでは正常に動きはするものの、VRChatにアップロードした後、正常に動かなくなってしまいます。

具体的には、手から出してるつもりがなんか意図しない場所(足元とか)に出ます(表現力不足)

※指から発射するはずが、弾が地面に埋もれつつ足元に出てくる例(わかりにくい)(撮影力不足)


以下から、具体的な設定方法についていたします。


◆基礎編、LocalのParticle

これだけでも結構長いので、もうLocalはわかってるよ!って方はすっ飛ばしてください。

HierarchyウィンドウからアバターのArmatureを開き、

パーティクルを発生させたい任意のパーツを選択します。

今回の例は右手人差し指の先から出すので、IndexFinger3_Rですね。

右クリックし、Particle Systemを選択します。

 ※画像は動きません。

Hierarchyの「IndexFinger3_R」の子に新たに「Particle System」が追加され、Sceneになんか白いイクラみたいなのが出てきましたね。

この新たに作成された「Particle System」は名前を変更してもOKです。今回はめんどくさいのでしません。

さて、新規に作成されたParticleはデフォルトでは上に向かって飛んでいくので、指の先に飛んでいくようにオブジェクトの向きを修正します。

正しく指先の子になっていれば、Inspectorウィンドウの「Transform」から、「Position」と「Rotation」を全部0にしてあげれば問題ないはずです。

ついでに「Shape」をクリックして開き、「Radius」を0.01にしておきましょう。

実際に設定したらどこが変わったのかひと目でわかるので、文章での説明は省きますが、これで弾の発生元が綺麗に指先に集中します。

さて、Localの場合はここでパーティクルの設定が終わりです。早いですね。

続いてAnimationの設定をしましょう。

いつものようにAnimation設定用のモデルを複製・・・する前に、今しがた作成したParticle Systemのチェックボックスからチェックを外します。

上の画像で、ちょうどマウスカーソルがある位置ですね。

チェックを外したらモデルを複製し、いつものように新規Animationファイルを作りましょう。

(アニメーションファイル作成・指先の設定など一部割愛)

表情や指先の形を作る時と同様に、Animationウィンドウの●録画ボタンを押したら、

Armatureからボーンをたどっていき、作成したパーティクルを選択します。

そうしたら、Inspectorウィンドウで、Particle Systemのチェックボックスにチェックを付けます。

↓ すると、こうなる ↓

(指の形は、今回の例ではいわゆる「HANDGUN」の形を使用しました。)

画像のように「Game.Object.Is.Active」の項目が追加され、チェックが入りますね。

今回のようなパーティクルや、あるいは手に持たせたい他のオブジェクトを出現させる際はこのような設定方法で、

非ActiveにしておいたオブジェクトをActive化する、というアニメーションを使います。

パーティクルを発生させるのも、手に銃を持たせるのも、腋からおにぎりを生成するのもGame.Object.Is.Activeを使ったアニメーションです。


では、いつものように2フレーム目にも追加したプロパティを忘れずにコピーして、再度録画ボタンを押して録画モードを停止しましょう。

Animation作成用に複製したモデルと、そのモデル用のコントローラはもう削除して結構です。

いつものように、CustomOverrideEmpty(名前はあなたの環境に依存します)のお好きな場所にアニメーションを登録して、アバターに適用してアップロードしましょう。


以上でLocalのParticle作成は終わりです。お疲れ様でした。

*-----------------------------------------------------------------------*

応用編、WorldのParticle


さて、こちらはなかなか複雑です。

設定量が多いわけではないですが、「知らないとその設定にたどり着けない」類のものなので、

私はVRchatの中で詳しい友達にめっちゃ質問して、設定画面のスクショを見せてもらって、それでも10時間弱の格闘の末、ようやく出来るようになりました(クソザコ情弱)(人の話を理解していない)(隙あらば自分語り)(瞬足)(コーナーで差をつけろ)

繰り返しますが、設定量が多いわけではないので、安心して進めていきましょう。


まずLocal編ではパーティクルを人差し指の子に設定しましたが、

その事はすべて忘れてください。

Worldで設定をする場合はArmatureの外にパーティクルを配置します。

Armatureの子として配置してしまうと体の動きに追従してしまうので、Worldで設定したい場合には、Armatureの外に配置する必要があるのです。


じゃあ、発射するまでEmitterはどうやって指にくっつけるの?

という問題を解決するために、新しいコンポーネントが2つ出てきます。

RigidBodyと、FixedJointです。

RigidBodyは日本語に訳すると「剛体」

FixedJointは……何だろう(痴呆)

Fixedをどう訳するべきかいい考えが思いつきませんでしたが、これは要するにジョイントで、RigidBody同士を繋ぐことができます。

Armatureの外にあるパーティクルオブジェクトと、自分の体(今回は右手人差し指)にそれぞれRigidBodyを設定し、それをFixedJointで連結するという構図になりますね。

なお、今回はパーティクルに直接RigidBody・FixedJointを設定するのではなく、

Armatureの外に一つ、空のゲームオブジェクトを作成し、それにRigidBody・FixedJointを設定し、

パーティクルはそのゲームオブジェクトの子に設定します。

これは私に作り方を教えてくれた方がそうしていたから、というのも理由なのですが、

こうしておくと、普段は非表示のものからパーティクルを発生させたい時に何かと便利な動作をしてくれます。(ただし今回の例では指先から発生させるので、これはあまり気にしないでください)

パーティクル作成で、いくつものパーティクルを同時に出したい!って時に、FixedJointがらみの設定をあらかじめ親オブジェクトに入れておくと楽というのもありますね。

*-----------------------------------------------------------------------*

では、画面を見ていきましょう。

パーティクルの親だった人差し指を右クリックし、「Create Empty」で空のゲームオブジェクトを作成します。

ゲームオブジェクトの名前は「Particle_Connect」とでもしておきましょうか。

用意したパーティクルを「Particle_Connect」の子にします。

そうしてから、「Particle_Connect」を子ごとまとめてArmatureの外に出しましょう。

↓ こうなる ↓

Armatureの外に新規オブジェクトを作るより、一旦人差し指に作って位置を調整してから外に出したほうが楽です。

ここで注意事項ですが、空オブジェクトを外に出した時にScaleが変わってしまうので、これらを全軸1に戻しましょう。Scaleの値がおかしいと、上手いこと指先に追従してくれなくなります。

ただし、PositionとRotationには触ってはいけません。せっかく調整した位置が狂ってしまいますので。


続いて、お待ちかねのRigidBodyの設定に行ってみましょう。

Armature内部の右手人差し指(IndexFinger3_R)を選択します。

Inspectorの「Add Component」をクリックし、出てきた選択欄の検索ウィンドウに「rigid」といれてみましょう。

RigidBodyが表示されるので、選択し、コンポーネントを追加します。

RigidBodyが追加されます。以下の値を変更しましょう。

Angular Drag:0に変更

Use Gravity:チェックを外す

これで人差し指側に、ジョイントをつけるためのRigidBodyが作成されました。

続いて、さっき作った「Particle_Connect」にRigidBodyとFixedJointを追加しましょう。

Hierarchyから「Particle_Connect」を選択し、Inspectorの「Add Component」の検索ウィンドウに「fix」といれてみましょう。

同様にクリックして追加します。

FixedJointを追加すると、同時にRigidBodyも追加されます。

人差し指のRigidBody同様、設定を変えていきましょう。

まずRigidBodyのAngular Dragを0に変更し、Use Gravityのチェックを外しましょう。

続いて、FixedJointの欄のConnected Bodyの右端にある⦿マークをクリックします。(画像の矢印のところ)

そうすると、画面のどこかにSelect RigidBodyのメニュー(画像左側のもの)が出てくるので、

先程作成した右手人差し指のRigidBodyを選択します。


さて、ここまででRigidBody、FixedJointの設定が完了です。

仕上げに、発生させたいParticleの「Simulation Space」を「World」に変更しましょう。

これをやらないと、ここまで頑張った意味が全く無いですからね(一敗)


これでパーティクルの設定は終了です。お疲れ様でした!

ここまで来れた方ならもうAnimationの設定方法について解説する必要はないでしょう。(決して面倒くさいわけではありません(震え声)ので、もしわからなかったらLocal編の最後の方に書いてある内容を参照してくださいね)

うてうてー!


この構成のものをAnimationにする際引っかかりそうなポイントとしては、

・空オブジェクト(Particle_Connect)はAnimationによって有効化するのではなく、最初から有効にしておくこと。FixedJointで連結しているものは、アニメーションで有効化無効化を行うと変な挙動をします。(10敗以上)

・そのため、Animationで有効化するのはParticle_Connectの子であるパーティクル

といったところでしょうか。


今回は常に表示されている体の一部分である指先からパーティクルを出しましたが、

普段は非表示のもの、例えばアニメーションオーバーライドで銃を表示して撃ちたい、などの場合は、

ParticleConnectの接続先RigidBodyを手首など、適当な場所に変更して、

Particle_Connectの子に銃のモデル(有効化チェックを外したもの)を配置して、(もちろん、位置調整は必要)

そのまた子にパーティクル(有効化にチェックしたもの)を配置しましょう。

アニメーションさせる時には銃のモデルだけ有効化すればOKです。


終わりに



自分で書いてみて思いましたが、解説記事を書くのって本当に大変なんですね。

文字だらけで読みづらい記事となってしまい申し訳🚀NASA🚀

VRchat関連で色々な解説記事を拝見させていただきましたが、記事を書いてくださる先達の皆様には改めて感謝に堪えません。

最後になりましたが、SimulationがWorldのパーティクル作成で詰まった時に優しく教えてくれたBireppuさん、Canaryさん

およびテスト用ワールドで撮影したSSの利用を許可してくれたCaldoさんに心からの感謝を。


また、VRChat技術メモ様より、以下の文言をお借りして、終わりの言葉に添えさせていただきます。

パーティクルシステムは綺麗なエフェクトを表現したり、使い方次第で少し変わったことをしたりできますが、ワールドを重くする原因の1つだと考えられているため、パーティクルの量やLifetime等を調整して節度を持った使い方をしましょう。


では、VRChatの世界で皆様の素敵なオリジナルパーティクルに出会える日を心待ちにしております。

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