VRChat初心者のためのUnityコンポーネント入門
はじめに
VRChatを通じて、Unityを初めて触るような初心者の方に、できるだけ分かりやすく『コンポーネント』について解説する内容を書いてみました。
VRChatを始めてから、何かしらのコンテンツをアップロードしようとすると、「Unity」というソフトを触ることになり、困惑するユーザーが多いと思います。
特にさらっと出てくる「コンポーネント」という概念をすんなりと理解するのは、なかなか難しいのではないかと思います。
この記事でその手助けができれば嬉しいです。ぜひ、お読みください。
VRChatのコンテンツとUnityについて
まずはじめに、VRChatのコンテンツについての話をします。
VRChatでは自分のアバターやワールドをアップロードすることができます。
アップロードしたコンテンツは自分だけが使えるようにすることもできますし、公開して色んな人に利用してもらったり、見てもらったりすることもできます。
つまり、あの沢山あるアバターやワールドのほとんどは、VRChatを遊んでいる誰かが公開したものです。
どうやってVRChatに作品をアップロードするかというと、『Unity』というゲーム制作ソフト(ゲームエンジン)を使います。
なので、VRChatにコンテンツを上げるためには、Unityの使い方に慣れる必要があります。
今日紹介するのは、そんなUnityの重要な基本的概念『コンポーネント』についてです。
(導入方法について:
本当は丁寧に説明すべきなのですが、記事の本題からは逸れてしまうため、この記事では2023年3月時点の大まかな導入の流れを簡単に紹介します。出てくる単語を元に、導入紹介記事を探してみてください。記事には古いものもあるので、探すときは気を付けましょう。
①まずUnityHubというものを用いて、VRChatに対応したバージョンのUnityをダウンロードします。バージョンはVRChat公式のページで確認できます。
②VRChat公式から提供されている『VRchat Creator Companion(VCC)』と呼ばれるものを併用して、導入を行えばOKです。VCC導入記事は色々あるので調べると出てきます)
コンポーネントとは?
突然ですが、これから説明する内容を理解しやすくするために、あなたの想像力をお借りしたいと思います。
まずは、真っ新な新品の机を思い浮かべてください。
あなたはその前に立っていて、机の上に何を置こうか考えています。
あなたの足元には段ボールがあり、机の上に置こうとしているものが入っています。
あなたには手に取ったものについての詳細な情報を知る能力があります。
イメージできましたか?ありがとうございます。
実はこのイメージしてもらったものを、Unityを初めて開いた時のウィンドウの役割に当てはめることができます。置き換えてみましょう。
これでUnityの大きな各ウィンドウがどんな役割をしているのか、何となくイメージできたかと思います。ちなみに左側のウィンドウにはヒエラルキー(Hierarchy)、右側のウィンドウにはインスペクター(Inspector)という名前があります。良く出てくる名前なので覚えると良いでしょう。
この各ウィンドウを使いながら、アバターやワールドを作っていくことになります。
この『机の上に置いたもの』のことを、Unityでは「ゲームオブジェクト」という呼び方をします。そして、実はこの「ゲームオブジェクト」自体はただの入れ物、器でしかありません。
「ゲームオブジェクト」がどの位置にあって、どんな形をしていて、どんな性質を持っているのか?……それは「ゲームオブジェクト」の入れ物の中にどんな「コンポーネント」があるかによって決まります。
コンポーネントという英語には”要素”という意味がありますが、「コンポーネント」はまさしくその意味通りの働きをします。
まだ分かりにくいかもしれませんので、具体例を出しましょう。
空中にコップを置くことにしました。
その時のコップのゲームオブジェクトのコンポーネントは以下のような感じです。
位置・回転・スケールのコンポーネントが無ければ、どこにあるのか分かりませんし、外見のコンポーネントが無ければ、どんな形をしているのか分かりません。
これらのコンポーネントがあって、初めてコップが出来ます。
(ちなみにここから重力落下してほしかったら、それ用のコンポーネントが必要になります)
「コンポーネント」はUnity側で既に用意してくれているコンポーネントが沢山あります。
また、Unityだとプログラミングによって、自分の好きな「コンポーネント」を作ることも出来ます(VRChatではワールド限定で、なおかつ制限がありますが可能です)
それらの「コンポーネント」を「ゲームオブジェクト」につけてあげることで、色々な機能を付与することが出来るというわけです。
コンポーネントの追加・削除
コンポーネントを付けるにはいくつか方法がありますが、ここでは代表的な一つのやり方を説明します。
左側のウィンドウでゲームオブジェクトを選択してみましょう。
(左側のウィンドウは既に置いたゲームオブジェクトの一覧です)
選択すると右側のウィンドウに選択したゲームオブジェクトの詳細が表示されます。
その詳細の一番下を見てもらうと、Add Componentというボタンがあると思います。
こちらを押して、付けたいコンポーネントの名前を検索し、出てきた項目を押すことでコンポーネントを付けることが出来ます。
この時付けたばかりだとコンポーネントの値は全て初期値なので、自分の思い通りに調整しましょう。
削除については、付けたコンポーネントの名前の辺りで右クリックするか、右上の点々マークを押して、メニューを出しましょう。そして、メニュー内のRemove Componentを押すことで削除できます。
コンポーネントの値の調整方法
コンポーネントを付けたら、コンポーネントの値を調整しましょう。
と言っても基本的には、入力したりチェックマークを付けたりというのがメインなのですが、ちょっとした小技があります。
数値を入力するところの手前側にマウスポインタを持っていくと矢印に切り替わるタイミングがあると思います。
この時にマウスをクリックした状態で左右に動かすと値を変えることができます。右がプラスで、左がマイナス方向です。
ただし、この値調整は大雑把にしかできないので、細かく設定したい場合は値の場所をクリックして、素直に入力してください。
用意されたゲームオブジェクトを利用する
左側のウィンドウで右クリックをすると、Unity側で用意してくれているゲームオブジェクトを利用することが出来ます。
[Create Empty]から下の部分がそのゲームオブジェクト群です。これらを生成して、各コンポーネントがどんな感じなのかを把握するのも良い方法だと思います。
ちなみに[Create Empty]は最低限しかコンポーネントが付いていない空のゲームオブジェクトです。生成する機会は結構あると思うので、作り方は覚えておいて損はありません。
VRChatのコンポーネントの制限について
VRChatではアバターとワールドで使えるコンポーネントが異なっています。
また、VRC特有のコンポーネントもあるので、詳しく調べたい場合は以下のサイトで確認すると良いでしょう。
サイト内でSDK2、SDK3という区分がされていますが、今はSDK3の欄を中心に見て行けばOKです(SDK2は旧システムで、実質廃止状態です)
(ただし、SDK2&SDK3って欄は使えないのも混ざってるので注意してください)
最低限知っておいたほうが良いコンポーネント
初心者向けに、知っておいたほうが良さそうなコンポーネントを紹介します。
①Transform
これは本当に基本的なコンポーネントで、全てのゲームオブジェクトについていて、削除することが出来ません。Position(位置)・Rotation(回転)・Scale(大きさ)を調整することが出来ます。
それぞれ3つの数値があり、X・Y・Zという対応付けになっています。実際に値を動かしてみると分かりやすいと思います。
②MeshRenderer
動かない3Dモデルに使うコンポーネントで、3Dモデルの外見を決めるコンポーネントになります。
コンポーネント内では、3Dモデルの見え方 (どんな模様をしているかやどれくらい透明かなど)を決定する「マテリアル」を指定する部分を初めとして、色々な項目があります。
オブジェクトの”見た目”を調整したい時に触るコンポーネントだと覚えておいてください。
このコンポーネントを作るとMesh Filterというコンポーネントが一緒に作られますが、これはセットになっていて、メッシュと呼ばれる3Dモデルの形状のデータが指定されています。
③Skined mesh Renderer
先ほどのMeshRendererは動かない3Dオブジェクトを扱っていましたが、こちらはMeshRendererの機能に加えて、”ボーン”や”ブレンドシェイプ”といった3Dモデルを動かすことが出来る機能を取り扱っています。
"ボーン"はアバターの関節部分が曲がったりするときの形状変化などに使われていて、"ブレンドシェイプ"は表情などの変化に使われていることが多いです(あくまで一例で、他にも使い道はあります)
④VRC Avatar Descriptor
アバターをアップロードするときに必要になる、アバター限定のコンポーネントです。アバターに関する情報を集約しています。
Boothでアバターを購入する場合は、きちんと設定されていることが大半なので触る必要はないのですが、凝った改変をする場合などは触る必要になるかもしれません。
⑤VRC Scene Descriptor
ワールドをアップロードするときに必要になる、ワールド限定のコンポーネントです。とはいえ、一般的にはあまり設定するべき項目はほとんどなく、シーン上に配置すれば大丈夫です。
気にするべき設定項目はReference Camera(プレイヤーの目となるカメラのリファレンスを指定する)とRespone Height Y(リスポーンさせられる高さ)くらいです。
あとはこのコンポーネントが付いているオブジェクトのZ方向が、ワールドに入った時の向きになるというのと、このオブジェクトの位置が出現位置になるという特性があります。
⑥Pipeline Manager
地味なコンポーネントですが、重要な役割を果たしているので、紹介しておきます。
VRChatではアップロードされるアバターやワールドにBluePrintIDと呼ばれるIDを割り振って管理しています。一般的には新規のものをアップロードする際は、自動的に新しいIDが割り振られてアップロードされます。
ただし、IDが割り振られた後にこのコンポーネント上でDetachというボタンを押すことで、BluePrintIDを空欄にすることができます。
その後、空欄のままアップロードを行うと、IDが新しくなり、別のアバター・ワールドとしてアップロードされます。
既にアップロードされたデータについては、SDKのコンテンツ管理画面やWebページから削除しない限りは削除されません。
既にアップロードしたデータに上書きしたい場合は、SDKのコンテンツ管理画面からBluePrintIDをコピーして、Detachしたあとの空欄に貼り付けてから、Attachすることで、上書きアップロードが出来るようになります。
上記以外のコンポーネント紹介
最後に、比較的よく使われているコンポーネントについて、簡単にですが紹介します。
アバターとワールドで項目を分けています。興味あるほうを読んでください。
一般的に、ワールドはアバターのコンポーネントがほとんど制限なしで利用可能です。アバターは制限があります。
アバター編
VRCPhysBone
髪とか服とか揺らせるようになります。
一昔前はDynamicboneと呼ばれる有料アセットを使っていたが、そちらは実質廃止状態なので注意。
Quest単体の環境でも揺れます。
Cloth
PhysBoneと同じく揺らせるようになるコンポーネントで、スカート表現とかにめっぽう強いです。
ただし、パフォーマンスランクの制約が厳しいのでPhysboneのほうが一般的に使われています。
Quest単体の環境では揺れません。
Animator
アバターや3Dオブジェクトの動きを制御できます。
他のコンポーネントの値をAnimator経由で変化させられるので、組み合わせ次第でかなりのことが出来ます。
アニメーションを切り替える条件を設定しておくことができます。
Particle
大量のパーティクル(粒子)によって、炎や煙、光の軌跡など、色々なエフェクトを表現できます。
パーティクルの一つ一つは2D画像や3Dモデルなのですが、それらを自由に大量に出現させたり、色や動き、形状や消えるまでの寿命などを制御することが出来ます。
TrailRenderer
光の軌跡や残像のような表現に使えます。
AudioSource
音源ファイルを取り扱うことが出来ます。
VRC_SpatialAudioSource
AudioSourceと合わせて使うと、3D音源として使えます。
アバターでは距離の制限があります。
VRC_Station
椅子として使えます。
Collider
当たり判定を付与します。
アバターではコライダーを使った空中浮遊(コライダージャンプ)や高速移動(コライダーダッシュ)などに使われます。
ただしアバターでコライダーを利用すると、ワールド側のギミックを利用できなくなったりすることがあるので注意。
Light
光源です。いくつかタイプがあります。
(Aim/LookAt/Parent/Position/Rotation/Scale) Constraint
他のオブジェクトの変化(位置・回転・スケールの変更)に従って、ゲームオブジェクトに制約(Constraint)を付けます。
例えば他のゲームオブジェクトがある位置に移動するときに、同じ分だけ移動するようにしたりなど。
FinalIK系
Unityの有料アセット。多脚キャラクターなどの歩行モーションとかを作る時に必要になってくるアセットという印象です(私は触ったことないですが)
ワールド編
AudioSource
音源を扱うことが出来ます。
VRC_SpatialAudioSource
AudioSourceと合わせて使うと、3D音源として使えます。
これがないと何処でも同じように聞こえる2D音源として扱われます。
collider
足場や壁になったりする重要なコンポーネントです。
ワールドのコライダーについては以前記事を書いたので、その記事を読んでください。
Rigidbody
ゲームオブジェクトに物理演算をさせます。重力に従って落下させたり、宙にふわふわと浮かせたりするときに使うことができます。
コライダーと一緒に使われるので、コライダーの記事に書いてます。
VRC_pickup
ゲームオブジェクトを持てるようにするコンポーネントです。
付けると上の二つのコンポーネントが必要になります。Rigidbodyだけは自動的に勝手につけてくれます。
VRC_objectsync
オブジェクトを同期させて、他の人にも同じものが見えるようにするコンポーネントです。
Animator
3Dオブジェクトの動きを制御できます。
他のコンポーネントの値をAnimator経由で変化させられるので、組み合わせ次第でかなりのことが出来ます。
アニメーションを切り替える条件を設定しておくことができます。
Particle System
大量のパーティクル(粒子)によって、炎や煙、光の軌跡など、色々なエフェクトを表現できます。
パーティクルの一つ一つは2D画像や3Dモデルなのですが、それらを自由に大量に出現させたり、色や動き、形状や消えるまでの寿命などを制御することが出来ます。
Light
光源です。いくつか種類があります。
アバターとは違い、ライトベイクというのを行うことが出来ます。
ReflectionProbe
ゲームオブジェクトの表面に反射する風景を決めます。
詳しく知りたい場合は記事を書いていますので、読んでみてください。
Camera
カメラです。とはいえ、映像が保存されるわけではなく、ただ映すだけです。
RenderTextureと呼ばれるテクスチャと併用すると、カメラとモニターみたいなのも作れます。
DynamicBone
髪や服などを揺らせるようになります。
アバターにはPhysBoneが来ましたが、何故かワールドは依然としてDynamicBoneしか使えません。
Terrain
Unity標準の地形を生成するシステムです。
木や草など、植物も植えることが出来ます。
設定をキチンとしないと重くなるという注意点はあるものの、非常にお手軽です。
Tree
Unity標準の木を作るシステムです。
WindZone
Terrainに植えた植物を風で揺らせるようになります。
木については、Treeコンポーネントや有料ソフトウェアのSpeedTreeで生成した木など、対応しているものしか揺らせません。
NavMesh系
NPCキャラクターとかに自動追尾させることが出来ます。
Projector
テクスチャを投影することが出来ます。Questでも使用可能。
(Aim/LookAt/Parent/Position/Rotation/Scale) Constraint
他のオブジェクトの変化(位置・回転・スケールの変更)に従って、ゲームオブジェクトに制約(Constraint)を付けます。
例えば他のゲームオブジェクトがある位置に移動するときに、同じ分だけ移動するようにしたりなど。
VRC_Station
椅子として使えます。
VRC_MirrorRefleciton
ミラーとして使えます。
VRC_AvatarPedestal
アバターのペデスタルを置けます。
VRC_PortalMarker
ポータルを置けます。
uGUI(Unity UI)系
Unity標準のUIで、比較的手軽に利用できます。
ボタンとかもあるので、押したら○○するみたいなのも実装できます。
TextMeshPro系
こちらもUIですが、uGUIと違うのは文字がメッシュになってます。
ふちがちらつかなかったり、解像度が高かったり、uGUIと比較して軽量になりやすかったりと、色々メリットはあります。
PostProcessing
画面にエフェクトを適応します。ワールドをお手軽に綺麗にすることが出来ます。Questでは使用不可。
FinalIK系
Unityの有料アセット。多脚キャラクターなどの歩行モーションとかを作る時に必要になってくるアセットという印象です(私は触ったことないですが)
その他(Udonについて)
ワールドではUdonと呼ばれるプログラミング言語で、コンポーネントに相当するスクリプトを自作できます。
まとめ
以上で、コンポーネントについての説明は終わりです。
この記事を通して、Unityにおけるコンポーネントへの理解が深まっていれば幸いです。
各コンポーネントの紹介で、本当は注意点とかも書きたかったのですが、全く初心者向けじゃなくなりそうだったので、簡略化した説明を乗せています。
そのため、みなさんが自分で試すときは躓くときもあるかもしれませんが、そういう時はTwitterで検索するのがオススメです。
色々なコンポーネントを使いこなして、素晴らしいアバターやワールドを作成してくださいね!あなたのVRChatの楽しみ方が広がることを願っています。
【発展編】コンポーネントの値のコピーのやり方と注意点について
既に調整したコンポーネントの値を使い回したい時がありますよね?
そういう時はメニューからCopy Componentを押しましょう。そして同じ設定の新しいコンポーネントを作りたい時はPaste Component As New、値だけ貼り付けたい時は貼り付けたいコンポーネントのメニューからPaste Component Valuesを押すことで値をコピーできます。
ちょっと難しい話になってしまいますが、このコンポーネント上で他のゲームオブジェクトやコンポーネントを指定している場合、この方法で設定をコピーすると『元のコンポーネントで指定していたもの』がコピーされます。
理解を助けるために図を用意してみました。
この例ではアバター、薄荷ちゃんを例に出します。薄荷ちゃんの服の改変をするところです。
シーン上にはデフォルトの衣装を着た薄荷ちゃんAと、色を変えた薄荷ちゃんBのデータがそれぞれあります。
アバターにはVRC Avatar Descriptarというコンポーネントが付いています。Aを作る時にこのコンポーネントの値を少し調整していたため、Bのアバターを作る時に、Aのコンポーネントの値をコピーすることにしました。
ここで悲劇が生まれます。
VRC Avatar Descriptarにはアバターの体の情報を指定する部分があるので、Aのものをコピーすると、“Aの体が指定されたままの”値がコピーされます。
Bの値に差し替えてくれるわけではないということです。
これは値が指定されている部分をダブルクリックすると確認できます。左側のウィンドウで参照されているものが黄色の楕円でハイライトされています。御覧の通り選択しているオブジェクトはBなのですが、Aの薄荷ちゃんの体を指定していますね。
ということでCopy Componentは非常に便利なのですが、指定されているものはそのままコピーされてしまうので注意が必要です。これは何もVRC Avatar Descriptarに限った話ではなく、他のコンポーネントでも起こる話なので、気を付けながら使いましょう。
一応CopyComponentsByRegexというエディタ拡張を使うと、参照を自動で差し替えつつ、コンポーネントの値をコピーしてくれます。
この記事が気に入ったらサポートをしてみませんか?