本文介绍: HDRP和URP无法平滑切换,因为属性、功能差异巨大。本脚本仅对可对应的默认脚本和属性做了转换处理。细节调整还需自己搞。自动转换可以节省手动更换shader、texture、通用属性的问题。

HDRP和URP无法平滑切换,因为属性、功能差异巨大。
本脚本仅对可对应的默认脚本和属性做了转换处理。细节调整还需自己搞。
自动转换可以节省手动更换shader、texture、通用属性的问题。

使用方法

  1. 使用前确保当前项目中存在HDRP和URP的包,没有请到packgemanager中下载
  2. 将下方代码保存至Editor文件夹中,没有自己创建。
  3. 点击工具栏-> 转换管线-> HDRP转URP,然后等待处理结束即可
    在这里插入图片描述
  4. 处理好的模型都变粉嫩了。因为你当前是URP/HDRP管线,与转换后的材质不通。切换管线后就能正常看了。
    在这里插入图片描述
using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
[System.Serializable]

public class TextureResource
{
    public string source;
    public string target;
    public Texture tex;
}
[System.Serializable]
public class ShaderResource
{
    public Shader source;
    public Shader target;
}
public class HdrpToUrpConverter : MonoBehaviour
{
    // 更新文件夹
    public static string root;
    private static List<TextureResource> m_textureResourceList;
    private static List<ShaderResource> m_shaderPairs;

    [MenuItem("转换管线/HDRP转URP")]
    static void HdrpToUrp()
    {
        ManualValidate();
        WalkthroughMaterials(root, ReplaceToUrp, GetURPShader);
    }
    [MenuItem("转换管线/URP转HDRP")]
    static void UrpToHdrp()
    {
        ManualValidate();
        WalkthroughMaterials(root, ReplaceToHDRP, GetHDRPShader);
    }

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

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

    [ContextMenu("初始化工具")]
    private static void ManualValidate()
    {
        // 更换texture
        m_textureResourceList = new List<TextureResource>();
        for (int i = 0; i < m_switchPropertiesList.Length; i += 2)
        {
            m_textureResourceList.Add(new TextureResource()
            {
                source = m_switchPropertiesList[i],
                target = m_switchPropertiesList[i + 1]
            });
        }

        // 更换shader
        m_shaderPairs = new List<ShaderResource>();
        for (int i = 0; i < m_shaderNameList.Length; i += 2)
        {
            var s = m_shaderNameList[i];
            var t = m_shaderNameList[i + 1];
            m_shaderPairs.Add(new ShaderResource()
            {
                source = Shader.Find(s),
                target = Shader.Find(t)
            });
        }
    }

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

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

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

        mat.shader = s;
        foreach (var p in m_textureResourceList)
        {
            if (mat.HasProperty(p.source))
            {
                mat.SetTexture(p.source, p.tex);
            }
        }
    }
    public static 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);
            }
        }
    }
}

原文地址:https://blog.csdn.net/lengyoumo/article/details/135994857

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_65047.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注