【发布时间】:2018-09-26 09:41:32
【问题描述】:
我知道这被问了几次并回答了几次,例如 Solution-wide #define、Is There anyway to #define Constant on a Solution Basis? 和 How to define a constant globally in C# (like DEBUG)。
但就我而言,我不能使用任何建议的方法:
我正在为 UnityProjects(一种提供特定功能的包)编写不同的“模块”(或插件,如果你愿意的话)。这个想法是开发人员可以通过导入包含所有脚本和资源的UnityPackage 来加载某个“模块”以在他的项目中使用。
但其中一些模块本身依赖于其他模块。所以到目前为止我尝试的是在每个模块中都有一个类Constants,具有单独的命名空间和预处理器定义。
模块 A
#if !MODULE_A
#define MODULE_A // BUT I WOULD NEED THIS GLOBAL NOT ONLY HERE
#endif
namespace Module_A
{
public static class Constants
{
// some constants for this namespace here
}
}
模块 B
#if !MODULE_B
#define MODULE_B // BUT I WOULD NEED THIS GLOBAL NOT ONLY HERE
#endif
#if !MODULE_A // WILL BE NOT DEFINED OFCOURSE SINCE #define IS NOT GLOBAL
#error Module A missing!
#else
namespace Module_B
{
public static class Constants
{
// some constants for this namespace here
}
// and other code that might require Module A
}
#endif
当然,这不能像这样工作,因为#defines 不是全局的,而是仅在当前文件中。
问题
对于模块的整个想法和简单的“加载您的模块”,我不能要求用户首先更改项目或解决方案设置,例如由this answer 建议,但必须仅使用随 UnityPackage 导入的 (c#) 资源(至少以我目前的专业知识)。
有没有办法通过仅导入模块的 UnityPackage 以某种方式为整个 Unity-Project 设置/定义这些常量?
编辑:
我可以使用Assets/msc.rsp 在 Unity 中找到 1 定义的解决方案。但这仍然不适用于多个模块,因为它们必须写入同一个文件。
【问题讨论】:
-
您要解决的问题是什么?全局常量是必需的,还是“解决方案”?从您的示例看来,至少有一个要求是模块 B 依赖于模块 A,如果未提供 A,则应引发错误。
-
对不起,如果我的解释难以理解。我稍微修改了我的示例 sn-ps。但是,正如您所说:如果我导入了模块 B,而不是从需要模块 A 的代码中抛出所有编译器错误,我想禁用整个模块 B 的编译,而是显示必须导入模块 A 的错误。
-
这是您正在寻找的设计时解决方案吗?编辑器里的东西呢?例如查找依赖项并显示缺失项列表的属性?
-
我实际上也尝试过类似的方法,但问题是这个额外的窗口/对话框弹出的代码甚至没有编译,因为编译器已经停止了缺少类的错误required module ... 有没有办法检查某个类是否已定义而不会导致编译器错误?
标签: unity3d c-preprocessor constants global conditional-compilation