我们知道Unity4.x中,当在Asset目录中右键创建shader时默认新建的shader为unity的surface shader,而在5.x中,创建shader的选项中变成了四个shader模板,分别是Standard Surface Shader,Unlit Shader,Image Effect Shader 和 Compute Shader。可以看到原先默认的Surface Shader被Standard Surface Shader取代了,尽管Surface Shader的功能在5.x中仍然是存在的。
但如果我们仍希望使用Surface Shader为模板去编写shader,或者是希望编写一个针对UGUI的shader,那么就意味着我们需要新建一个shader并手动去修改shader的内容。
为了避免这种麻烦,实际上我们可以通过编写编辑器扩展,来扩充右键创建shader模板的数量,甚至可以自定义一些自己可能常用的shader模板。
如下是我扩展后的右键创建shader的选项:
可以看到我在shader创建面板加入了4.x的Surface Shader,同时还加入了UI-Default和UI-DefaultFont shader,这样当我需要编写一个基于UGUI的shader时就不必再从头将UGUIshader必须的模板测试部分等重新打一遍了。
接下来讲一下实现方式。
原理其实很简单,无疑就是使用MenuItem特性来增加Shader创建选项的按钮:
[MenuItem("Assets/Create/Shader/Surface Shader")]
注:最近更新的文章里浅析了一下unity通过模板创建代码的原理,因此可以不通过以下方式创建shader,文章链接:
http://blog.csdn.net/mobilebbki399/article/details/51869487
static string CreateShaderPath(string shaderTemplateName)
{
string path = AssetDatabase.GetAssetPath(Selection.activeObject);
if (path == "")
path = "Assets";
else if (Path.GetExtension(path) != "")
path = path.Replace(Path.GetFileName(path), "");
string shaderName = "New " + shaderTemplateName;
if (string.IsNullOrEmpty(path))
path = "Assets";
if (!shaderName.EndsWith(".shader"))
shaderName += ".shader";
string shaderFullName = AssetDatabase.GenerateUniqueAssetPath(path + "/" + shaderName);
return shaderFullName;
}
接下来,既然已经获得要创建的shader的路径了,之后就是创建一个shader,这里由于没找到直接创建shader类实例的好方法,所以没有使用AssetDataBase.CreateAsset方法去创建shader,而是直接使用System.IO命名空间中的相关类来创建了一个.shader文件,并将对应模板shader的内容写入这个文件(我将对应的模板shader放在自定的目录,并编写了一个EditorWindow作为创建模板shader的设置窗口,在这个窗口设置模板shader的目录,并通过EditorPrefs存储)。
最后,.shader文件创建完了,此时应该在你右键创建shader的目录已经生成了一个你想要的shader,但是想要右键生成shader之后立即在Asset目录中看到,还需要使用AssetDatabase.ImportAsset将其导入,否则的话你只有在Asset中点刷新后才能看到生成的shader:
static void CreateShader(string shaderTemplateName)
{
string shaderPath = CreateShaderPath(shaderTemplateName);
if(!ShaderCreateUtils.CreateShader(shaderPath, shaderTemplateName)){
<span style="white-space:pre"> </span>return;
AssetDatabase.ImportAsset(shaderPath);
}