这应该unity5才出的新功能了,今天看文档时刚巧看到了,就来尝试了一下。

效果如图:


shader 的编辑器扩展分为2种方法:

  1. 是通过UnityEditor下的ShaderGUI类来实现的,形式比较近似于我们一般对unity编辑器的扩展方式。
  2. 是通过直接在shader代码上通过unity为我们预定义好的一些命令来扩展。

个人比较推荐使用第一种方法,第二种在尝试时发现

①是第二种控件的种类有限。限制还特别多,变量申请的不对的话,有时也不报错,不利于维护。

②是文档里还有错误+没说清楚的地方。

③是第一种方法创建的.cs文件是可以复用到,我们可以只写一个.cs文件,然后跟好几个shader文件进行关联。


先来说说第一种方法:

官方文档:http://docs.unity3d.com/Manual/SL-CustomShaderGUI.html

CS代码如下:

 using UnityEngine;
using UnityEditor;
using System; public class TestShaderGUI : ShaderGUI
{
public override void OnGUI(MaterialEditor materialEditor, MaterialProperty[] properties)
{
// render the default gui
base.OnGUI(materialEditor, properties); Material targetMat = materialEditor.target as Material; // see if redify is set, and show a checkbox
bool CS_BOOL = Array.IndexOf(targetMat.shaderKeywords, "CS_BOOL") != -; EditorGUI.BeginChangeCheck();
CS_BOOL = EditorGUILayout.Toggle("CS_BOOL", CS_BOOL); if (EditorGUI.EndChangeCheck())
{
// enable or disable the keyword based on checkbox
if (CS_BOOL)
targetMat.EnableKeyword("CS_BOOL");
else
targetMat.DisableKeyword("CS_BOOL");
}
}
}

Shader代码:

 Shader "MyTest/TestShaderGUI"
{
Properties
{
_MainTex("Texture", 2D) = "white" {}
}
SubShader
{
Tags{ "RenderType" = "Opaque" }
LOD CGPROGRAM #pragma surface surf Lambert addshadow #pragma shader_feature CS_BOOL sampler2D _MainTex; struct Input
{
float2 uv_MainTex;
}; void surf(Input IN, inout SurfaceOutput o)
{
half4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a; #if CS_BOOL
o.Albedo.gb *= 0.5;
#endif
} ENDCG
}
CustomEditor "TestShaderGUI"
}

重点就是 
#pragma shader_feature CS_BOOL 
CustomEditor "TestShaderGUI"

shader_feature 是unity用来在shader中创建编译指令变量的关键字,它的作用与multi_compile几乎是一样的。 
我们通过创建的变量与TestShaderGUI类中创建的控件来相关联,达到传值的目的。 
CustomEditor的作用则是将shader文件与cs文件关联起来。

#pragma shader_feature#pragma multi_compile的问题可以看这里来进行了解,官方文档: 
http://docs.unity3d.com/Manual/SL-MultipleProgramVariants.html

这里说一下我的理解: 
首先#pragma shader_feature#pragma multi_compile的作用其实都是为了给unity所谓的"mega shaders""uber shaders"创建变量的。 
唯一的区别就是没有被使用过的shader_feature变量将不会被编译。 
所以在使用上区别就是在materials的作用范围内用shader_feature,而multi_compile的范围一般则是全局的。 
例如有一种全局变量是multi_compile_fog,则是跟开启雾效相关的。


第二种方法:

官方文档:http://docs.unity3d.com/ScriptReference/MaterialPropertyDrawer.html

Shader代码:

Shader "MyTest/TestShaderGUI"
{
Properties
{
_MainTex("Texture", 2D) = "white" {} // 声明需要的控件
[Toggle(S_BOOL)] _S_BOOL("S_BOOL", Int) =
[Toggle] _MyToggle1("MyToggle1", Float) =
[Toggle(MyToggle2)] _MyToggle2("MyToggle2", Float) =
[KeywordEnum(One, Two, Three)] _MyEnum("MyEnum", Float) =
}
SubShader
{
Tags{ "RenderType" = "Opaque" }
LOD CGPROGRAM #pragma surface surf Lambert addshadow // 创建变量,用来接收控件的值
#pragma shader_feature S_BOOL
#pragma shader_feature _MYTOGGLE1_ON
#pragma shader_feature MyToggle2
#pragma multi_compile _MYENUM_ONE _MYENUM_TWO _MYENUM_THREE sampler2D _MainTex; struct Input
{
float2 uv_MainTex;
}; void surf(Input IN, inout SurfaceOutput o)
{
half4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a; #if S_BOOL
o.Albedo.gb *= 0.5;
#endif //#if _MYTOGGLE1_ON
//o.Albedo.gb *= 0.5;
//#endif //#if MyToggle2
//o.Albedo.gb *= 0.5;
//#endif //#if _MYENUM_ONE
//o.Albedo.gb *= 0.2;
//#elif _MYENUM_TWO
//o.Albedo.gb *= 0.5;
//#elif _MYENUM_THREE
//o.Albedo.gb *= 0.7;
//#endif
} ENDCG
}
}

原链接:http://lib.csdn.net/article/unity3d/41995

unity shader 编辑器扩展类 ShaderGUI的更多相关文章

  1. Thinkphp编辑器扩展类kindeditor用法

    一, 使用前的准备. 使用前请确认你已经建立好了一个Thinkphp站点项目. 1,Keditor.class.php和JSON.class.php 是编辑器扩展类文件,将他们拷贝到你的站点项目的Th ...

  2. Unity 3D编辑器扩展介绍、教程(二) —— 创建窗口

    Unity编辑器扩展教程(二) 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 一 Brief Introd ...

  3. Unity 3D编辑器扩展介绍、教程(一) —— 创建菜单项

    Unity编辑器扩展教程 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 一 Brief Introduct ...

  4. Unity编辑器扩展chapter1

    Unity编辑器扩展chapter1 unity通过提供EditorScript API 的方式为我们提供了方便强大的编辑器扩展途径.学好这一部分可以使我们学会编写一些工具来提高效率,甚至可以自制一些 ...

  5. Unity 编辑器扩展 场景视图内控制对象

    http://blog.csdn.net/akof1314/article/details/38129031 假设有一个敌人生成器类,其中有个属性range用来表示敌人生成的范围区域大小,那么可以用O ...

  6. Unity Shader IDE — Sublime Text2

    使用MonoDevelop写了一段时间的Shader代码,发现效率太低了,所以换用Sublime Text. 安装Sublime Text 1.下载 sublime Text2 官网:http://w ...

  7. Unity编辑器扩展

    在开发中有可能需要自己开发编辑器工具,在Unity中界面扩展常见两种情况,拿某插件为例: 1,自建窗口扩展 2,脚本Inspector显示扩展 不管使用那种样式,都需要经常用到两个类EditorGUI ...

  8. Unity3D编辑器扩展(五)——常用特性(Attribute)以及Selection类

    前面写了四篇关于编辑器的: Unity3D编辑器扩展(一)——定义自己的菜单按钮 Unity3D编辑器扩展(二)——定义自己的窗口 Unity3D编辑器扩展(三)——使用GUI绘制窗口 Unity3D ...

  9. Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据

    Unity编辑器扩展 Chapter7--使用ScriptableObject持久化存储数据 unity unity Editor ScirptableObject  Unity编辑器扩展 Chapt ...

随机推荐

  1. django book多站点学习

    多个站点 Django 的多站点系统是一种通用框架,它让你可以在同一个数据库和同一个Django项目下操作多个网站. 这是一个抽象概念,理解起来可能有点困难,因此我们从几个让它能派上用场的实际情景入手 ...

  2. TCP/IP协议组随笔

    原文:https://my.oschina.net/xianggao/blog/654677 IP层负责网络主机的定位,数据传输的路由,由IP地址可以唯一的确定Internet上的一台主机. TCP层 ...

  3. Spark map-side-join 关联优化

    在spark中要进行join操作,如果在shuffle的时候进行join效率较低.如果满足 所需要join的表中有一张表较小,那么可以考虑在map端进行join操作. 转载:http://blog.c ...

  4. Java 实现模板方法(TemplateMethod)模式

    类图 /** * 业务流程模板.提供基本框架 * @author stone * */ public abstract class BaseTemplate { public abstract voi ...

  5. node - post - 上传图片

    html代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  6. vuex简单示例

    一.vuex是什么,解决了什么问题? 官方解释是:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生 ...

  7. C++Singleton的DCLP(双重锁)实现以及性能测评

      本文系原创,转载请注明:http://www.cnblogs.com/inevermore/p/4014577.html   根据维基百科,对单例模式的描述是: 确保一个类只有一个实例,并提供对该 ...

  8. linux服务器性能检测工具nmon使用

    今天介绍一款linux系统服务器性能检测的工具-nmon及nmon_analyser (生成性能报告的免费工具),亲测可用. 一.介绍 nmon 工具可以帮助在一个屏幕上显示所有重要的性能优化信息,并 ...

  9. STL学习笔记(移除性算法)

    本节所列的算法是根据元素值或某一准则,在一个区间内移除某些元素. 这些算法并不能改变元素的数量,它们只是将原本置于后面的“不移除元素”向前移动,覆盖那些被移除的元素. 这些算法都返回逻辑上的新终点 移 ...

  10. STL学习笔记(迭代器配接器)

    Reverse(逆向)迭代器 Reverse迭代器是一种配接器. 重新定义递增运算和递减运算.使其行为正好倒置. 如果你使用这类迭代器,算法将以逆向次序处理元素.所有标准容器都允许使用Reverse迭 ...