#unity3d #hlsl
#unity3d #hlsl
Вопрос:
Я пытаюсь использовать макрос препроцессора в моем пользовательском шейдере, чтобы он выполнял другой шаг, если он находится в редакторе Unity:
#if defined(IS_UNITY_EDITOR)
// something
#else
// other thing
#endif
Для достижения этой цели я пробую Shader.EnableKeyword()
метод в режиме MonoBehavior:
if (Application.isEditor) {
Shader.EnableKeyword("IS_UNITY_EDITOR");
}
Однако, похоже, что мой шейдер компилируется до того, как MonoBehavior сможет проверить, находится ли он в редакторе Unity. Я пытался запустить его Start()
Awake()
, OnEnable()
но шейдер никогда не получает IS_UNITY_EDITOR
определение. Как я могу определить IS_UNITY_EDITOR
в своем шейдере до компиляции шейдера?
Ответ №1:
Просто наткнулся на эту страницу документа, которая объясняет, как работает мультикомпиляция. Чтобы иметь возможность создавать две ветви, я должен сообщить компилятору, что я буду использовать IS_UNITY_EDITOR
ключевое слово, написав #pragma multi_compile
строку:
SubShader {
Pass {
CGPROGRAM
#pragma multi_compile __ IS_UNITY_EDITOR
#pragma vertex vertShader
#pragma fragment fragShader
// ...
Двойное подчеркивание __
означает, что одна версия шейдера будет иметь IS_UNITY_EDITOR
, а в другой версии ничего не будет определено.