RaspberlyのブログRaspberlyのブログスマートフォン用の表示で見るRaspberlyのブログUnityネタをメインとした技術系ブログです。にゃんこ大戦争や日常なども。2019、13日目の記事です。SE)Manager【Unity】」でした。qiita.com今回はUnityネタをやっていきます。テーマは「鏡に映る3Dモデルを差し替える」です。去年のアドベントカレンダーの派生になります。方はこちらからチェック!raspberly.hateblo.jp↑去年の記事を公開後、以下のような反応がありました。2018面白そうなアイデア!アニメのOPでありそうな表現です。今回はこれを実現してみます。ver1.2.0Unity2017.4.28f1VRCSDK-2019.09.18.12.05_Public※他2019.2f1、2018.4.11f1で動作確認済みですアプローチ今回どういう方法でやるかについて。RealWorld(現実世界)とMirrorWorld(鏡の世界)の2つのレイヤーを作成。CameraにはMirrorWorldは映らず、鏡にはRealWorldが映らないように、それぞれのオブジェクトを各レイヤーに割り当てます。やってることはとても簡単で、数回マウスをポチポチするだけでできます。最初にシーンを作っていきます。前回に引き続き、SDユニティちゃんとホラーちゃんを使用します。どちらも無料アセットです。現実世界ではユニティちゃんがいて、鏡には怪物が映るといった感じです。キャラクターは重なるように置いておきましょう。ホラーちゃんは初期状態だと横を向いているので直したくなりますが、アニメーションをするといつも通りになるのでそのままでOK。ここはそれぞれ好きなキャラクターで大丈夫です。キャラクターが用意できない方はCubeを使いましょう。Layersからレイヤーを分けていきます。今回は「RealWorld」と「MirrorWorld」の2つのレイヤーを新たに作成しました。各オブジェクトのレイヤーを設定します。ユニティちゃんは「RealWorld」、ホラーちゃんは「MirrorWorld」を設定します。子オブジェクトにしてあげると、一括変更も楽で管理しやすくなるのでオススメです。親のレイヤーを変更すると、子もまとめて変更してくれます。Cameraに映らないようにする特定レイヤーのオブジェクトがCameraに映らないようにします。これは簡単にできます。Maskから、描画するレイヤーを設定できます。映したくないレイヤーはチェックボックスを外しましょう。Everythingは全てのレイヤーにチェックを入れ、Nothingは全てのレイヤーのチェックを外します。今回はMirrorWorldレイヤーをCameraに映らないようにしたいので、MirrorWorldのチェックを外します。これでホラーちゃんはCameraに映らなくなりました。Maskは各種Lightにも同じパラメータがあり、レイヤーごとにDirectionalLight等を作成することでライティングを分けることもできます。鏡を作る鏡を作りましょう。Unityにおいて鏡を作る方法は複数あります。Lite」と「MirrorReflection」「VRCSDKの鏡」の3つで動作確認をしています。鏡に映るレイヤーを制限するそのままだと鏡には全てのオブジェクトが映ります。これに制限を加え「RealWorld」レイヤーのオブジェクトだけ映らないようにします。Maskのチェックを外すだけです。Liteで鏡を作る場合アセットをインポート後、Assets/MagicMirror/Prefab/Mirror.prefabを設置。Layersからチェックを外しておきます。MirrorReflectionで鏡を作る場合こちらを参考にマテリアルとスクリプトを用意します。Layersから、RealWorldのチェックを外します。VRCSDKの鏡を使う場合SDKのunitypackageをインポート後、Assets/VRCSDK/Prefabs/World/VRCMirror.prefabをシーンに配置します。LayersからRealWorldのチェックを外します。完成品これで完成です。鏡に映る3Dモデルを無事差し替えることができました。「やあユニティちゃん・・・・・いや、誰だお前はユニティちゃんじゃないな!」???「グググ・・・ヨク気ヅイタナ・・・」みたいな演出ができるかもしれませんね!MirrorReflectionとVRCSDKの方でも動作確認済です。全てを包括した世界そのものを差し替えることもできます。(スカイボックスは無理だった)やり方はキャラクターと同じで、レイヤーを切り替えるだけです。3Dモデル以外のパーティクルも同様です。「バトルユニティちゃんと廃墟とパーティクル(雨と火)」はMirrorWorldレイヤーになっています。現実世界は普通の町だが、鏡の中だと廃墟だったり。鏡の中だけ雨が降っていたり火の海だったりできるわけですね。あなたの目は本当の世界を映していますか?注意点キャラクターの注意点キャラクターの位置はもちろん、アニメーションも同期させるように注意。RealWorldとMirrorWorldのキャラクターは同じAnimatorにしておくといいでしょう。鏡全般に言えますが、巨大な鏡の場合は注意が必要です。キャラクターのみなら大丈夫ですが、巨大な建築物やステージだと処理負荷が高くなることも。)と鏡に映るレイヤーを制限することができましたが、Sceneビューに映るレイヤーも制限することができます。Editorの左上にあるLayersから、目のマークを押すだけです。シーン内がごちゃごちゃしてきたら試してみるといいでしょう。tsubakit1.hateblo.jpまとめ・レイヤーを分けることで、カメラと鏡に映るオブジェクトを制限できる・現実世界のオブジェクトと、鏡面世界のオブジェクトでレイヤーを分ける。・Cameraと鏡、それぞれ表示するレイヤーを変更する。「キャラクターの感情表現(笑顔だけど本当は悲しんでいるみたいな)」などでしょうか。鏡に映らないキャラクターや鏡にしか映らないモンスターを作ることができます。どちらにせよ表現の幅が広がるのはいいことです。