写在前面
单纯的一篇记录性文章,方便自己需要的时候回来查看~
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