うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】Unity を再生しても Material の差分が発生しないようにする

スクリプトで Material の値を書き換えた場合再生が終了したタイミングで Material の値が書き換わる

例えばこちらの記事スクリプトのようにC# で Shader のパラメータを操作していた場合を確認する

再生前の Offset がこちら

f:id:hacchi_man:20201016010324p:plain:w200

再生後の Offset がこちら

f:id:hacchi_man:20201016010257p:plain:w200

見てわかるように スクリプトによって値を変更しているため、Material のパラメータが変更されてしまいます
もしVersion管理ツール等を利用している場合再生しただけで、Material の差分がでるようになってしまいます

対応

UnityEditor のみ Material を見てもしそれが Editor上 に存在するファイルだった場合
新しい Material を作成して差し替えることで値を書き換えても直接影響がでないようにする

using UnityEngine;

public class UVScroll : MonoBehaviour
{
    [SerializeField]
    private Renderer _renderer;

    [SerializeField]
    private float _scrollX;
    [SerializeField]
    private float _scrollY;
    
    private Vector2 offset;
    
    private void Awake()
    {
#if  UNITY_EDITOR
        // Material が Editor 上に存在するか確認
        var path = UnityEditor.AssetDatabase.GetAssetPath(_renderer.material);
        if (!string.IsNullOrEmpty(path))
        {
            _renderer.sharedMaterial = new Material(_renderer.material);
        }

#endif
        offset = _renderer.sharedMaterial.mainTextureOffset;
    }

    private void Update()
    {
        offset.x += _scrollX * Time.deltaTime;
        offset.y += _scrollY * Time.deltaTime;
        _renderer.sharedMaterial.mainTextureOffset = offset;
    }
}