Unity3d 场景从HDRP转换到URP

该代码实现了一个Unity编辑器脚本,用于将使用HighDefinitionRenderPipeline(HDRP)的材质和着色器转换为UniversalRenderPipeline(URP)。它遍历指定文件夹中的所有材质,根据预定义的纹理和着色器映射进行替换。转换过程包括查找源属性并设置目标属性,以及在HDRP和URP之间映射着色器。
摘要由CSDN通过智能技术生成

 以下代码功能是把材质从HDRP转换到URP。具体根据需要添加字段

代码附加到一个物体上,先右键执行初始化。然后右键选择转换。

using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
[System.Serializable]

public class TextureMap
{
    public string source;
    public string target;
    [HideInInspector]
    public Texture tex;
}
[System.Serializable]
public class ShaderPair
{
    public Shader source;
    public Shader target;
}
public class HdrpToUrpConverter : MonoBehaviour
{
    // Start is called before the first frame update
    [Header("指定文件夹,默认是根目录")]
    public string root;
    [Header("要替换的贴图")]
    public List<TextureMap> mapProperties;
      public List<ShaderPair> shaderpairs;

    private string[] kvs = new string[]
    {
        "_MainTex", "_BaseMap", "_BaseColorMap", "_BaseMap", "_NormalMap", "_BumpMap", "_AlphaCutoffEnabled",
        "_AlphaClip"
    };

    private string[] shadderKvs = new[]
    {
        "HDRP/Lit", "Universal Render Pipeline/Lit", "HDRP/Unlit", "Universal Render Pipeline/Unlit"
    };

    [ContextMenu("初始化工具")]
    private void ManualValidate()
    {
        mapProperties = new();
        for (var i = 0; i < kvs.Length; i+=2)
        {
            mapProperties.Add(new TextureMap()
            {
                source = kvs[i],
                target = kvs[i+1]
            });
        }

        shaderpairs = new List<ShaderPair>();
        for (var index = 0; index < shadderKvs.Length; index+=2)
        {
            var s = shadderKvs[index];
            var t = shadderKvs[index +1];
            shaderpairs.Add(new ShaderPair()
            {
                source = Shader.Find(s),
                target = Shader.Find(t)
            });
        }
    }

    private void Start()
    {
       
    }

    public Shader GetURPShader(Shader source)
    {
        foreach (var s in shaderpairs)
        {
            if (s.source == source) return s.target;
        }
        return Shader.Find("Universal Render Pipeline/Lit");
    }
    public Shader GetHDRPShader(Shader target)
    {
        foreach (var s in shaderpairs)
        {
            if (s.target == target) return s.source;
        }
        return Shader.Find("HDRP/Lit");
    }
    public void ReplaceToUrp(Material mat,Shader s)
    {

        foreach (var p in mapProperties)
        {
            if (mat.HasProperty(p.source))
            {
                p.tex = mat.GetTexture(p.source);
            }
        }

        mat.shader = s;
        foreach (var p in mapProperties)
        {
            if (mat.HasProperty(p.target))
            {
                mat.SetTexture(p.target,p.tex );
            }
        }
    }
    public void ReplaceToHDRP(Material mat,Shader s)
    {

        foreach (var p in mapProperties)
        {
            if (mat.HasProperty(p.target))
            {
                p.tex = mat.GetTexture(p.target);
            }
        }

        mat.shader = s;
        foreach (var p in mapProperties)
        {
            if (mat.HasProperty(p.source))
            {
                mat.SetTexture(p.source,p.tex );
            }
        }
    }
    public void  WalkthroughMaterials(string folder,Action<Material ,Shader> replace,Func<Shader,Shader>getShader)
    {
        folder = "Assets/"+folder;
        string[] allFiles = Directory.GetFiles(folder, "*.mat", SearchOption.AllDirectories);

        foreach (string file in allFiles)
        {
            Material mat = AssetDatabase.LoadAssetAtPath<Material>(file);
            if (mat != null)
            {
                var s = getShader(mat.shader);
                replace(mat,s);
                // Do something with the material
            }
        }
    }
   
    [ContextMenu("HDRP到URP")]
    void Hdrp2Urp()
    {
        WalkthroughMaterials(root,ReplaceToUrp,GetURPShader);
    }
    [ContextMenu("URP到HDRP")]
    void Urp2Hdrp()
    {
        WalkthroughMaterials(root,ReplaceToHDRP,GetHDRPShader);
    }
}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值