unityでゲームを作っています。
壁として存在するオブジェクトに対し、他のあるオブジェクトが衝突した際、そのオブジェクトを壁に埋め込みたいのですが具体的にどのような処理をすべきかが分かりません。
ご存知の方教えていただけたら幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
埋め込む、というのは具体的にどういう状態を指していますか?
伝わりづらくて申し訳ありません。具体的には透明なオブジェクトが壁に衝突した際、窓のように壁に挿入されるような表現をしたいと思っています。

回答1件
0
透明なオブジェクトを壁に埋め込むとなると、壁にオブジェクトの形の穴を開けてやらねばなりませんね。
ひとつやってみようか...とも思いましたが、すでにUnity でスクリーンスペースのブーリアン演算をやってみた - 凹みTipsやplaying with Unity 5's deferred shading pipeline - primitive: blogにブーリアンレンダリングの実験について面白い記事がありました。詳しく解説されていて、ご参考になるかと思います。
投稿2017/11/28 21:23
総合スコア10816
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
ありがとうございます!
スクリーンスペースブーリアン概要を参考に同様のものを作ろうとしたのですが、シェーディングに関する知識が乏しく、思うように実行できるまでに至りません。
記載されているCommand Bufferのスクリプトやコンポジット、描画用シェーダはそれぞれ何にアタッチすればよいのでしょうか?
教えていただけましたら幸いです。
凹みTipsさんの公開されていたプロジェクトファイル(https://github.com/hecomi/UnityScreenSpaceBoolean )をご覧になるのが手っ取り早いかと思います。
それを参考に各オブジェクトの構成を考えると...
あらかじめ3つのマテリアルを作っておく。
・壁マテリアル...ShaderはCustom->Subtractee(Standard)を選択、適宜壁のテクスチャを設定する
・断面マテリアル...ShaderはCustom->Subtractor(Standard)を選択、適宜断面のテクスチャを設定する(壁と同じテクスチャでもいいかもしれません)
・透明マテリアル...Rendering ModeはTransparent、適宜Albedoのアルファを調節して半透明な見た目にする
埋め込む物体は複製して二重にする(さらにこの2つを空のゲームオブジェクトに入れてまとめ、適宜プレハブ化してしまうと扱いやすいと思います)
・片方は透明マテリアルを設定
・もう片方は断面マテリアルを設定、さらにScripts->ScreenSpaceBoolean->Subtractorをアタッチして、Mask MaterialはMaskを選択する
壁は壁マテリアルを設定、さらに...
・Scripts->ScreenSpaceBoolean->Subtracteeをアタッチして、Depth MaterialはFrontBackを選択する
・Scripts->ScreenSpaceBoolean->SubtractionRendererをアタッチして、Composite MaterialはCompositeSubtractionを選択する
・SubtractionRendererのMask Draw Numは、サイトで言及されている「複数の Subtractee の干渉」の解消のためのもので、複数の物体でくりぬくときに、デフォルトの「1」でうまくくりぬけなければ「2」にする
この状態で壁と埋め込む物体を重ねてみると、壁が物体の形にくりぬかれた上で透明な形状が描画され、壁に埋め込まれたように見えるかと思います。
実験的なプロジェクトということで手動設定が必要な部分が少々多いですが、うまくできていてアセットストアに出してもいいような面白い効果ですね。
ご丁寧にありがとうございます!
説明いただいた通りにやってみたのですが、壁マテリアルでSubtracteeを選択すると壁のオブジェクトが透明になりますよね?テクスチャを貼っても透明のままになってしまい、何が原因かもいまいちわからない状況です。
お心当たりありましたらご指摘いただけると幸いです。
もしかして、カメラが遅延シェーディングモードになっていないんじゃないでしょうか?
カメラのインスペクタの「Rendering Path」が「Deferred」になっているか確認してみてください。また、カメラの投影モードは「Perspective」になっているでしょうか?残念ながら「Orthographic」だと遅延シェーディングモードにできないようです...
「Deferred」はマニュアル(https://docs.unity3d.com/Manual/RenderingPaths.html や https://docs.unity3d.com/Manual/RenderTech-DeferredShading.html)によると古いプラットフォームでは使えないそうです。最近の環境なら大抵は大丈夫だと思いますが、Deferredが使えない環境にも対応したいとなると別の手を考えないといけませんね。

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。