Attribute
(это то, что вы определяете с помощью [...]
), дает метаданные о классе или его члене. Другими словами, он не может выдержать все, он всегда должен предшествовать некоторому символу. Вот почему это не компилируется:
#if UNITY_POST_PROCESSING_STACK_V2 && AQUAS_PRESENT
[Space(5)]
[Header("Post Processing Profiles (Must NOT be empty!)")]
[Space(5)] } <-- attribute must preceed a member or class
#endif
Мне кажется, все, что вам нужно, - это разные атрибуты, основанные на том, какое из двух условий применимо, поэтому вы должны переносить только те строки в #if #elif
, которые должны отличаться, а не те, которые являются общими .
[System.Serializable]
public class UnderWaterParameters {
[Header("The following parameters apply for underwater only!")]
[Space(5)]
public float fogDensity = 0.1f;
public Color fogColor;
#if UNITY_POST_PROCESSING_STACK_V1 && AQUAS_PRESENT
[Space(5)]
[Header("Post Processing Profiles (Must NOT be empty!)")]
[Space(5)]
#elif UNITY_POST_PROCESSING_STACK_V2 && AQUAS_PRESENT
[Space(5)]
[Header("Post Processing Profiles (Must NOT be empty!)")]
[Space(5)] }
#endif
public PostProcessingProfile underwaterProfile;
public PostProcessingProfile defaultProfile;
}
Конечно, приведенное выше не имеет особого смысла, поскольку в обоих случаях применяются одни и те же атрибуты. Но это кажется другим вопросом для меня.
См. Также документы из MSDN: https://docs.microsoft.com/dotnet/csharp/language-reference/preprocessor-directives/preprocessor-elif