Unity URP自定义ShaderGUI

Posted 九九345

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity URP自定义ShaderGUI相关的知识,希望对你有一定的参考价值。

写在前面

单纯的一篇记录性文章,方便自己需要的时候回来查看~


1 创建自己的URP Shader模板

创建URP Shader的时候,之前我都是保存一个模板,Shader -> UnLit Shader后自己再复制粘贴模板进去。现在想来太麻烦了,偶然间发现一个自定义URP Shader模板的方法,用了之后直接可以按照路径Create -> Shader -> URP Shader创建Shader啦!

创建方式来自Unity 自定义Shader GUI,这位大佬也是参考了Unity3D研究院编辑器之创建Lua脚本模板(十六)拓展面板的方法,文章中整个创建的.cs文件如下:

using UnityEngine;
using UnityEditor;
using System;
using System.IO;
using System.Text;
using UnityEditor.ProjectWindowCallback;
using System.Text.RegularExpressions;
 
public class CreateURPShader

    public const string shaderTemplatePath = "Assets/CustomShaderGUI/Editor/Template/URPShader.shader";

    [MenuItem("Assets/Create/Shader/URP Shader")]  // 创建的路径
    public static void CreatURPShaderTemplate()
    
        ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
        ScriptableObject.CreateInstance<URPShadertAsset>(),
        GetSelectedPathOrFallback() + "/URPShader.shader",
        null,
       shaderTemplatePath);
    
 
 
    //获取选择的路径
    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 URPShadertAsset : 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);
        text = Regex.Replace(text, "#NAME#", fileNameWithoutExtension);//将模板的#NAME# 替换成文件名

        //写入文件,并导入资源
        bool encoderShouldEmitUTF8Identifier = true;
        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));
    
 
  

由于目前还是想基于Unity提供的来定义自己的Shader面板,所以只想保留了自定义URP Shader这一部分。

2 基于Unity自带的定义Shader面板

这里仅贴基于Unity自身带的修改方式,为了方便之后自己想实现的时候回来查看。

一篇是乐乐女神的:【Unity Shader】自定义材质面板的小技巧

 

一篇是总结Unity自定义枚举类型的:Shader面板上常用的一些内置枚举UI

AirPlane Race Creator竞速游戏完整项目自定义模型操作说明基于Urp管线

最近一段时间,脑子被门夹了,伤心病狂地去搞引擎去了,之后会回归理性,重新做一些Unity插件的入门讲解

今天讲解的是,完整项目:AirPlane Racer - URP

特别适合某些人学习:

策划 - 想做独立竞速游戏的策划,飞机的速度模型很值得研究(PlayMaker除基础功能所完全没可能提供这样的环境)

美术 - 做机战模型设计,替换和运行时观察功能很全,Editor编辑器功能有一些

不适合:

新手程序员 - 整个架构漏洞还是很多,不适合大规模开发,只会学废

--------------^%!&@^%&!(!(&#(*!@&#*(@&*#(@&#*(@@-----------------------------------

试用了一下,总结如下:

  1. 2021出的很完整的一个项目,文档也很详细,请支持正版
  2. 使用了 ScriptableObject 做数据底层,和国内的做法很不同,ScriptableObject 哥再也无力吐槽,可是,人家基于ScriptableObject做出了这个很完整的项目,事实摆在眼前,不服不行,ScriptableObject有缺点,也有优点,下面会展开谈谈
  3. 歪果仁的项目,节点有些藏的太深了,也不排除是外包给国人或者印度啊三做额
  4. 工业化的游戏产出,很值得学习
  5. 这是一个Urp管线下的项目,也最好重新开项

以上是关于Unity URP自定义ShaderGUI的主要内容,如果未能解决你的问题,请参考以下文章

unity URP内置shader lit解析

AirPlane Race Creator竞速游戏完整项目自定义模型操作说明基于Urp管线

unity渲染管线及升级URP

深入URP之Shader篇2: 目录结构和Unlit Shader分析[上]

Unity Render Feature示例

unity urp 实现衣服绒毛效果