我尝试在自定义着色器中使用预处理器宏,以便在 Unity 编辑器中执行不同的步骤:
#if defined(IS_UNITY_EDITOR)
// something
#else
// other thing
#endif
为了实现这一目标,我正在尝试 the Shader.EnableKeyword()
method在 MonoBehavior 中:
if (Application.isEditor) {
Shader.EnableKeyword("IS_UNITY_EDITOR");
}
但是,看起来我的着色器正在编译之前 MonoBehavior 可以检查它是否在统一编辑器中。我尝试在 Start()
上运行它,于Awake()
, OnEnable()
但着色器永远不会收到 IS_UNITY_EDITOR
定义。我如何定义IS_UNITY_EDITOR
在编译着色器之前在我的着色器中?
最佳答案
刚刚偶然发现this doc page这解释了多重编译是如何工作的。为了能够创建两个分支,我必须通过编写 #pragma multi_compile
行来告诉编译器我将使用 IS_UNITY_EDITOR
关键字:
SubShader {
Pass {
CGPROGRAM
#pragma multi_compile __ IS_UNITY_EDITOR
#pragma vertex vertShader
#pragma fragment fragShader
// ...
双下划线__
表示着色器的一个版本将具有IS_UNITY_EDITOR
,而另一个版本将没有任何定义。
关于unity-game-engine - 如何在着色器中定义自定义预处理器宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64924780/