[Shader]创建URP Shader模板文件

using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEditor.ProjectWindowCallback;
using UnityEngine;

public class AddShaderScript
{
    [MenuItem("Assets/Create/URP Shader/Unlit", false, 81)]
    public static void CreatNewUnlit()
    {
        ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
            ScriptableObject.CreateInstance<MyDoCreateScriptAsset>(),
            GetSelectedPathOrFallback() + "/New Unlit Shader.shader",
            null,
            "Packages/com.unity.render-pipelines.universal/Shaders/Unlit.shader");
    }
    
    [MenuItem("Assets/Create/URP Shader/SimpleLit", false, 82)]
    public static void CreatNewSimpleLit()
    {
        ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
            ScriptableObject.CreateInstance<MyDoCreateScriptAsset>(),
            GetSelectedPathOrFallback() + "/New SimpleLit Shader.shader",
            null,
            "Packages/com.unity.render-pipelines.universal/Shaders/SimpleLit.shader");
    }
    
    [MenuItem("Assets/Create/URP Shader/Lit", false, 83)]
    public static void CreatNewLit()
    {
        ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
            ScriptableObject.CreateInstance<MyDoCreateScriptAsset>(),
            GetSelectedPathOrFallback() + "/New Lit Shader.shader",
            null,
            "Packages/com.unity.render-pipelines.universal/Shaders/Lit.shader");
    }
    
    [MenuItem("Assets/Create/URP Shader/ComplexLit", false, 84)]
    public static void CreatNewComplexLit()
    {
        ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
            ScriptableObject.CreateInstance<MyDoCreateScriptAsset>(),
            GetSelectedPathOrFallback() + "/New ComplexLit Shader.shader",
            null,
            "Packages/com.unity.render-pipelines.universal/Shaders/ComplexLit.shader");
    }
    
    [MenuItem("Assets/Create/URP Shader/BakedLit", false, 85)]
    public static void CreatNewBakedLit()
    {
        ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
            ScriptableObject.CreateInstance<MyDoCreateScriptAsset>(),
            GetSelectedPathOrFallback() + "/New BakedLit Shader.shader",
            null,
            "Packages/com.unity.render-pipelines.universal/Shaders/BakedLit.shader");
    }
    
    [MenuItem("Assets/Create/URP Shader/CameraMotionVectors", false, 86)]
    public static void CreatNewCameraMotionVectors()
    {
        ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
            ScriptableObject.CreateInstance<MyDoCreateScriptAsset>(),
            GetSelectedPathOrFallback() + "/New CameraMotionVectors Shader.shader",
            null,
            "Packages/com.unity.render-pipelines.universal/Shaders/CameraMotionVectors.shader");
    }
    
    [MenuItem("Assets/Create/URP Shader/ObjectMotionVectors", false, 87)]
    public static void CreatNewObjectMotionVectors()
    {
        ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
            ScriptableObject.CreateInstance<MyDoCreateScriptAsset>(),
            GetSelectedPathOrFallback() + "/New ObjectMotionVectors Shader.shader",
            null,
            "Packages/com.unity.render-pipelines.universal/Shaders/ObjectMotionVectors.shader");
    }
    
    public static string GetSelectedPathOrFallback()
    {
        string path = "Assets";
        foreach (UnityEngine.Object obj in Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.Assets))
        {
            path = AssetDatabase.GetAssetPath(obj);
            if (!string.IsNullOrEmpty(path) && File.Exists(path))
            {
                path = Path.GetDirectoryName(path);
                break;
            }
        }
        return path;
    }
}

class MyDoCreateScriptAsset : EndNameEditAction
{
    public override void Action(int instanceId, string pathName, string resourceFile)
    {
        UnityEngine.Object o = CreateScriptAssetFromTemplate(pathName, resourceFile);
        ProjectWindowUtil.ShowCreatedAsset(o);
    }

    internal static UnityEngine.Object CreateScriptAssetFromTemplate(string pathName, string resourceFile)
    {
        string fullPath = Path.GetFullPath(pathName);
        StreamReader streamReader = new StreamReader(resourceFile);
        string text = streamReader.ReadToEnd();
        streamReader.Close();
        string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(pathName);

        string[] nn = pathName.Split('/');
        if (nn.Length >= 3)
        {        
            string[] mm = nn[2].Split('_');
            if (mm.Length == 2)
            {
                text = Regex.Replace(text, "#PATH#", mm[1]);
            }
        }
        text = Regex.Replace(text, "#NAME#", fileNameWithoutExtension);        
        text = Regex.Replace(text, "#TIME#", System.DateTime.Now.ToString("yyyy-MM-dd"));

        if (pathName.Contains("Assets/Game/Activity/"))
        {
            var arr = pathName.Split('/');
            if (arr.Length >= 4)
            {
                text = Regex.Replace(text, "#KEY#", arr[3]);
            }
        }
        
        bool encoderShouldEmitUTF8Identifier = false;
        bool throwOnInvalidBytes = false;
        UTF8Encoding encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier, throwOnInvalidBytes);
        bool append = false;
        StreamWriter streamWriter = new StreamWriter(fullPath, append, encoding);
        streamWriter.Write(text);
        streamWriter.Close();
        AssetDatabase.ImportAsset(pathName);
        return AssetDatabase.LoadAssetAtPath(pathName, typeof(UnityEngine.Object));
    }

}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
URP(Universal Render Pipeline)是Unity引擎中的一种渲染管线,而Compute ShaderURP中的一种功能,用于在GPU上进行并行计算。Compute Shader可以用来执行各种计算任务,例如图像处理、物理模拟、粒子系统等。 URP Compute Shader提供了一种在GPU上进行高性能计算的方式,它可以利用GPU的并行计算能力来加速复杂的计算任务。与传统的图形渲染不同,Compute Shader不需要与图形渲染管线交互,它可以独立于渲染过程进行计算。 使用URP Compute Shader可以带来以下优势: 1. 并行计算:Compute Shader可以同时在多个线程上执行计算任务,充分利用GPU的并行计算能力,提高计算效率。 2. 高性能:由于在GPU上执行,Compute Shader可以利用硬件加速,提供更高的计算性能。 3. 灵活性:Compute Shader可以执行各种类型的计算任务,不仅限于图形渲染,可以用于各种领域的并行计算需求。 使用URP Compute Shader的基本步骤如下: 1. 创建Compute Shader:在Unity创建一个Compute Shader文件,并编写需要执行的计算任务代码。 2. 创建Compute Buffer:创建一个Compute Buffer对象,用于在CPU和GPU之间传递数据。 3. 设置Compute Shader参数:将需要的参数传递给Compute Shader,例如输入数据、输出数据等。 4. 调度Compute Shader:使用Graphics类的Dispatch方法来调度Compute Shader的执行。 5. 获取计算结果:在计算完成后,可以从Compute Buffer中获取计算结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值