はじめに
Unityで鏡面のような床を作成し、オブジェクトが反射して見えるようにする方法について説明します。この方法は初心者でも簡単に実行できますので、ぜひ試してみてください。
新しいプロジェクトを作成
まず、Unityを開き、新しい3Dプロジェクトを作成します。
2. 床を作成する
- ヒエラルキーウィンドウで右クリックし、メニューから「3D Object」→「Plane」を選択します。これで床が作成されます。
- 作成されたPlaneを「Floor」にリネームしましょう。
![](https://cbagames.jp/wp-content/uploads/2024/01/2024-01-27_184130.png)
3. 床にマテリアルを適用する
次に、床に反射する素材(マテリアル)を適用します。
- プロジェクトウィンドウで右クリックし、「Create」→「Material」を選択します。新しいマテリアルが作成されます。
- このマテリアルを「MirrorMaterial」にリネームします。
- インスペクタウィンドウで、「MirrorMaterial」の設定を行います。
- 「Shader」を「Standard」に設定し、「Rendering Mode」を「Transparent」に変更します。
- 「Albedo」の色を黒や灰色に設定し、光沢感を出すには「Metallic」を1に、「Smoothness」を1に設定します。
- 作成したマテリアルを「Floor」にアタッチします。
![](https://cbagames.jp/wp-content/uploads/2024/02/2024-02-19_163914.png)
4. リフレクションプローブを追加する
次に、オブジェクトの反射をリアルタイムで表示するためにリフレクションプローブを追加します。
- ヒエラルキーウィンドウで右クリックし、「Light」→「Reflection Probe」を選択します。
- 追加されたReflection Probeを床の上に移動し、カバーする範囲を調整します。Reflection Probeの範囲が、反射させたいオブジェクトをすべてカバーするようにしましょう。
- Probeの「Type」を「Realtime」に設定することで、動的にオブジェクトが反射するようになります。
- RefreshModeを「Via scripting」に変更します。
![](https://cbagames.jp/wp-content/uploads/2024/02/2024-02-19_164120.png)
5.スクリプトを作成し適用する
- プロジェクトウィンドウで右クリックし、「Create」→「C# Script」を選択します。新しいスクリプトが作成されます。
- このスクリプトを「MirrorFloor」にリネームします。
- 次に、以下のスクリプトをエディタにコピー&ペーストします。
- スクリプトを保存します。
- ヒエラルキーウィンドウでReflection Probeを選択し、インスペクタウィンドウでMirrorFloorスクリプトをドラッグ&ドロップしてアタッチします。
このスクリプトは、Unityで作成された「MirrorFloor」というクラスです。このクラスは、カメラの動きに基づいて反射プローブ(Reflection Probe)の位置を調整し、鏡のような効果を作り出します。以下に、スクリプトの各部分をわかりやすく説明します。
コード全体の説明
このスクリプトは、カメラの位置に基づいてReflection Probeの位置を反転させ、その結果、鏡のような効果を実現するものです。スクリプトは次の手順で動作します:
Start
関数で、Reflection Probeコンポーネントを取得します。Update
関数で、カメラの位置を取得し、その位置をY軸で反転させてReflection Probeの位置を更新します。- Reflection Probeの再描画を行います。
各部分の説明
1. クラスの宣言と変数の定義
public class MirrorFloor : MonoBehaviour
{
ReflectionProbe rp;
ここでは、MirrorFloor
という名前の新しいクラスを定義しています。このクラスはMonoBehaviour
を継承しており、Unityのゲームオブジェクトにアタッチできます。また、Reflection Probeを格納するための変数rp
を宣言しています。
2. Start関数
void Start()
{
rp = GetComponent<ReflectionProbe>();
}
Start
関数は、ゲームオブジェクトが初めて有効になったときに呼び出されます。ここでは、同じゲームオブジェクトにアタッチされているReflection Probeコンポーネントを取得し、それをrp
変数に格納しています。
3. Update関数
void Update()
{
rp.transform.position = new Vector3(
Camera.main.transform.position.x,
Camera.main.transform.position.y * -1,
Camera.main.transform.position.z
);
rp.RenderProbe();
}
}
Update
関数は、毎フレーム呼び出されます。この関数内では次のことを行います:
- カメラの位置(
Camera.main.transform.position
)を取得し、それを基に新しいVector3
オブジェクトを作成します。この新しい位置は、カメラのY座標を反転させたものです。つまり、カメラが上に動くと、Reflection Probeは下に動きます。 rp.transform.position
に、この新しい位置を設定します。- Reflection Probeを再描画するために、
rp.RenderProbe()
を呼び出します。
全体の動き
このスクリプトがアタッチされたオブジェクトは、ゲームが開始されると、Reflection Probeを取得し、毎フレーム、カメラの位置に基づいてReflection Probeの位置を調整します。こうすることで、カメラが動くたびに鏡面反射がリアルタイムで更新される効果が得られます。
using UnityEngine;
public class MirrorFloor : MonoBehaviour
{
ReflectionProbe rp;
void Start()
{
rp = GetComponent<ReflectionProbe>();
}
void Update()
{
rp.transform.position = new Vector3(
Camera.main.transform.position.x,
Camera.main.transform.position.y * -1,
Camera.main.transform.position.z
);
rp.RenderProbe();
}
}
6. オブジェクトを配置する
床に反射するオブジェクトを配置します。
- ヒエラルキーウィンドウで右クリックし、「3D Object」→「Cube」などのオブジェクトを選択して追加します。
- 追加されたオブジェクトを好きな位置に移動します。
7. シーンをプレイして確認する
最後に、シーンを再生してオブジェクトが床に反射して見えるか確認します。
- Unityエディタ上部の「Play」ボタンをクリックします。
- シーンが再生され、オブジェクトが床に反射して見えることを確認します。
おわりに
これで、Unityで鏡面のような床を作成し、オブジェクトが反射して見えるようにする方法が完成です。スクリプトが正しく動作し、リアルタイムで反射が更新される様子を確認できるでしょう。ぜひ試してみてください!
おすすめのアセット
「Fantasy Mirror」は、リアルな鏡のエフェクトを作成できるUnityアセットです。主にファンタジーや魔法のシーンに適しており、映り込みや反射効果を簡単に実現できます。