【Unity】個別オブジェクトのライトマップを切り替える

投稿者: | 2021-02-23

ライトマップの無いインスタンス化したオブジェクトに、他のオブジェクトのライトマップを適用してみました。

今シーン上のガスボンベのインスタンスは、Bakedモードのポイントライトに照らされていて、ベイクされたライトマップを持っています。

シーンに無いガスボンベのプレハブはライトマップを持っていない状態です。

スクリプトで、ライトマップのないガスボンベをインスタンス化して、シーンのガスボンベと入れ替えると、ガスボンベは当然暗く見えます。

そこで、置き換えるときにシーンのガスボンベのライトマップを、新しくインスタンス化したガスボンベのメッシュレンダラーに設定しました。ライトマップはRenderer.lightmapIndexで指定します。

すると、同じライトマップは付きましたが見た目が不自然です。

よく見ると、ライトマップのタイリングとオフセットが違いました。

シーンにあったガスボンベ

これらの値は、Renderer.lightmapScaleOffsetに含まれているので、ライトマップインデックスと一緒に入れ替えます。

using UnityEngine;
using UnityEngine.UI;

public class GameScript4 : MonoBehaviour
{
    [SerializeField] Transform tankPoint; // シーン上のタンク
    [SerializeField] Tank tankPrefab; // 置き換えるタンクのプレハブ
    [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(tankPrefab.gameObject, tankPoint.position, tankPoint.rotation);

            // シーンにあったタンクのメッシュレンダラー
            MeshRenderer mr = tankPoint.GetComponent<MeshRenderer>();

            // 新しいタンクのメッシュレンダラー
            MeshRenderer newMr = newTank.GetComponent<MeshRenderer>();

            // ライトマップを入れ替える
            newMr.receiveGI = ReceiveGI.Lightmaps;
            newMr.lightmapIndex = mr.lightmapIndex;
            newMr.lightmapScaleOffset = mr.lightmapScaleOffset;

            // シーンにあったタンクを削除
            Destroy(tankPoint.gameObject);
            
        }
    }
}

これでライトマップを入れ替えることができました。

lightmapScaleOffsetはVector4で、x,yがタイリング、zがオフセットX、wがオフセットYです。

コメントを残す

メールアドレスが公開されることはありません。