【VRChatギミック】画像を大きく表示するギミックの作り方(CyanTrigger)

質問箱で質問いただいたのですが一言で解説するのは難しいのでブログで解説することにしました。

大まかな流れ

画像が表示されているオブジェクトAと 画像を表示されているオブジェクトBを用意

画像を大きく表示するための大きめなオブジェクトXを用意

オブジェクトAとBにVRChat内で使った時にマテリアルを取得する処理を入れる
(オブジェクトAとBの画像を歪まないようにするには縦横比の一致が必要です。
ちゃんとやるならオブジェクトAとBのサイズを取得する必要があるかも)

取得したマテリアルをオブジェクトXのマテリアルに変更する
(縦横比を合わせる場合は先ほど取得したサイズに*2とか*3とかして大きさを決めたほうがいいかもしれない。)

解説

画像が表示されているオブジェクトAと 画像が表示されている オブジェクトBを用意

こちらは何でも良いです。何かQuadににテクスチャ貼ったものでも用意してください。
私は今回は【VRChat】Photo Frames FBX unitypackageを使用して作っていきます。

画像を大きく表示するための大きめなオブジェクトXを用意

こちらも何でもいいです。quadを用意して置いておきましょう

何か判定をさせたりするためにはコライダーが必要です。
boxcolider辺りを入れておきましょう。

AのオブジェクトにいれたらBのオブジェクトにも入れておきましょう。
quadを使う場合は元から入っているのでなくても動くかもしれないです。

オブジェクトAとBにVRChat内で使った時にマテリアルを取得する処理を入れる

オブジェクトAとBに当てられている画像を取得する処理を作ります。
AもBも作る処理は同じなのでAだけ解説します。

オブジェクトAを選択してインスペクターの下の方にあるAdd Componentをクリック。
検索窓にcyantriggerと入れるとcyantriggerのコンポーネントが出てくるのでそちらをクリックしてください。

cyan triggerがいれられたらAdd Eventからinteractを選択します。

これでオブジェクトの判定に対してトリガーを引いたとき(オブジェクトを使った時)という処理が出来ました。ここからマテリアルの取得をしていきます。

マテリアルはオブジェクトにあるMesh Rendererから取得します。
なのでcyan tirggerの処理もMesh Rendererから探します。
Mesh Rendereの中のMeshRenderer.Get materialを選択します。
これでマテリアルの取得ができます。

MeshRenderer.Get materialを選択するとactionに処理が増えます。
増えたアクションのMeshRendererの部分にヒエラルキーのオブジェクトAをドラッグして持って行って離します。そうするとオブジェクトAのMeshRendererが設定されます。

out Materialを設定しないといけないのですが、今はmaterialを保存しておくための箱がないため
選択肢に何も出ません。なのでmaterialを保存するための箱(変数)を作ります。
variablesの所にある+ボタンを選択。materialで検索をします。出てきたMaterialを選択します。

そうするとマテリアルを入れておく箱ができたのでactionsの中にあるoutMaterialに
選択肢が増えます。選択肢内のMaterialを選択するとマテリアルの取得ができます。

大まかな流れの()内に書きましたが縦横比を維持して拡大表示したい場合はオブジェクトのscaleの取得をしてその取得したscaleをオブジェクトXに2倍とか3倍とかしてセットしてあげるのがいいかと思います。その場合はもっと複雑になるので解説が大変なので割愛します…どうしても知りたかったらまた聞いてください…

TIPSになりますが、GameObjectからMeshRendererが取得できるので
actionの+ボタンからGameObjectで検索してGameObject.GetComponentをいれて
GameObjectをvariableに変えてThisGameObjectその下のtypeをMeshRendererにして
MeshRendererの変数を作ってそこに取得してあげるとcyantriggerをコピーしてペーストするだけで
他のオブジェクトに移せるのでお勧めです。
解説が大変なので画像だけになります。すいません…

取得したマテリアルをオブジェクトXのマテリアルに変更する

先ほど取得したマテリアルをオブジェクトXのマテリアルに設定します。+ボタンを選択。MeshRendererで検索、MeshRenderer.Set materialを追加します。

MeshRenderer.Set material内のMeshRendererの+ボタンを選択してそこにオブジェクトXをドラッグして持っていきます。後はValueをvariableに変更してMaterialにすれば取得したマテリアルを表示できます。

今これは処理がローカルなので個人だけです。全体に処理したい場合はintaractの右下にあるlocalをsend to allに変えてください。そうすると全員に処理が送られます。後から来た人に同期しようと思うと大変なのでその処理も割愛します。知りたい場合はまた質問してください。

以上解説でした。お役に立てばよいのですが…

コメント

タイトルとURLをコピーしました