おもちゃラボ

Unityで遊びを作ってます

Reflection Probeで鏡面反射する床を作る

UnityでReflection Probeを使って反射する床を作る方法を紹介します。水面とか鏡とか色々と応用できそうなので、ぜひ使ってみて下さい!今回の例では次のような見た目の反射する床を作りますー。

f:id:nn_hokuson:20161016203939p:plain

今回の内容は次のようになります。

床とモデルを配置する

まずは床とその上にのせる3Dモデルを配置しましょう。今回、床にはPlaneを使っています。ヒエラルキービューから「Create」→「3D Object」→「Plane」を選択します。また、床の上にはユニティちゃんやCube、Sphereを配置しました。

f:id:nn_hokuson:20161016205656p:plain

ユニティちゃんを動かす方法はココで紹介しています。

nn-hokuson.hatenablog.com

次に、床用のマテリアルを作成します。プロジェクトビューで右クリックから「Create」→「Material」を選択しmirrorという名前で保存します。インスペクタからMain Mapsの設定を行います。「Albedo」の色を「グレー」に、「Metalic」と「Smoothness」を「1」に設定します。

f:id:nn_hokuson:20161016210300p:plain

床のオブジェクトにドラッグ&ドロップしてマテリアルをアタッチします。この状態で空は鏡面反射しますが、床の上に乗っているオブジェクトは反射しません。

f:id:nn_hokuson:20161016210425p:plain

床の上のオブジェクトも反射させるためにはReflection Probeコンポーネントを使う必要があります。

Reflection Probeとは

Reflection Probeは、プローブを中心として6方向に仮想カメラが配置されているようなものです。この6つのカメラで撮影された映像から反射用のキューブマップを作ります。(6つのカメラと聞いて想像がつくと思いますが、結構重たい処理です)

f:id:nn_hokuson:20161016214724p:plain

カメラから見た時に、正しい反射映像を得るためにはReflection Probeをカメラの反対側に配置する必要があります。ここではスクリプトを使ってReflection Probeを自動的にカメラの反対側に配置するようにします。

f:id:nn_hokuson:20161016221519p:plain

Reflection Probeを鏡面反射で使う方法

空のオブジェクトを追加して、それにReflection Probeコンポーネントをアタッチします。Reflection Probeをアタッチしたオブジェクトを選択し、インスペクタからTypeを「Realtime」に変更します。これにより、リアルタイムにキューブマップの映像が更新されます。また「Resolution」を変更することで反射する映像の解像度を変更できます。

f:id:nn_hokuson:20161016212052p:plain

上で書いたように、Reflectionを鏡面反射で使うためにはカメラと相対する位置にプローブを配置する必要があります。自動的にカメラの反対側に配置するスクリプトを作ります。プロジェクトビューで「ProbeController」を作って次のスクリプトを入力して、Reflection Probeコンポーネントをアタッチしたオブジェクトにアタッチして下さい。

using UnityEngine;
using System.Collections;

public class ProbeController : MonoBehaviour {
    
    ReflectionProbe probe;
    
    void Start() {
        this.probe = GetComponent<ReflectionProbe>();
    }
    
    void Update () {
        this.probe.transform.position = new Vector3(
            Camera.main.transform.position.x, 
            Camera.main.transform.position.y * -1, 
            Camera.main.transform.position.z
        );

        probe.RenderProbe();
    }
}

実行結果

これで床が鏡面反射して、床上のオブジェクトを反射するようになりました。実行して確かめてみて下さい。実行結果は次のようになります。


今回は、こちらの記事を参考にさせていただきました!

twiik.net


Unity5の教科書、絶賛発売中です!
よろしくです☆