【Unity Shader】在Asset创建面板中添加新的shader模板

版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.csdn.net/mobilebbki399/article/details/50531223

我们知道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


然后获取右键创建shader的对象或目录

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);
}




猜你喜欢

转载自blog.csdn.net/mobilebbki399/article/details/50531223