HDRPのShadowmaskモードで、引き出しを置いてライトマップをベイクしたあとに引き出しを動かすと、内側が暗いのが見えてしまいます。
これはライトをMixedにして、直接光をリアルタイムにすると問題ありません。
しかし、どうしてもBakedのライトで照らしたいときはライトプローブを使うといいと思います。
部屋にライトプローブを配置して、ライトプローブからGIを受けるようにすると、引き出したときに内側にもライトがあたりますが、デフォルトではオブジェクトごとに光の当たり方が変わるので、引き出しごとにはっきりと色が変わって不自然です。
そこで、すべての引き出しのメッシュレンダラーのAnchor Overrideに、枠部分のオブジェクトをアタッチしました。
すると、明るさを計算するときの中心点がすべて枠部分のものになるので、明るさが均一になります。
しかし、影によるグラデーションがなくてまだ不自然なので、枠部分のオブジェクトにLight Probe Proxy Volumeコンポーネントを付けて、Light ProbesをUse Proxy Volumeに設定しました。
このコンポーネントは、受ける光を部分的に変えるられるもので、普通は大きなオブジェクトに使われるそうです。
Resolutionモードをカスタムにすると、各方向の解像度を変えられます。
さらに影を作って違いをわかりやすくしました。
外側は影の中が暗くなりましたが、引き出し部分にはグラデーションが見えないので、すべての引き出しをUse Proxy Volumeに設定して、Proxy Volume Overrideにも枠部分のオブジェクトをドラッグアンドドロップします。
これで引き出し部分もさらに自然になりました。
ところで、ここに普段は動かない引き出しを置いておいて、ストーリーに合わせてアニメーターコンポーネントなどの付いた同じメッシュのオブジェクトと置き換えると、ライトマップの場合、置き換えた後のオブジェクトが暗くなってしまいます。
そこで、初めからどちらも同じ設定でライトプローブから受けるようにすると自然です。
アニメーションの前に別のオブジェクトと入れ替わっていますが、まったくわかりません。
using UnityEngine;
using UnityEngine.UI;
public class GameScript4 : MonoBehaviour
{
[SerializeField] Transform cabinetPoint; // シーン上の棚
[SerializeField] GameObject cabinetPrefab; // 置き換えるタンクのプレハブ
[SerializeField] Text text;
// Start is called before the first frame update
void Start()
{
text.text = "";
}
// Update is called once per frame
void Update()
{
if(Input.GetKeyDown(KeyCode.E))
{
text.text = "置き換え";
// 新しい棚をインスタンス化
GameObject newTank = Instantiate(cabinetPrefab, cabinetPoint.position, cabinetPoint.rotation);
// 引き出しのアニメーションを開始
newTank.GetComponent<Animator>().SetBool("Drawer", true);
// シーンにあった棚を削除
Destroy(cabinetPoint.gameObject);
}
}
}