如何 refresh/recompile 自定义预处理器
How to refresh/recompile custom preprocessor
我在我的 PlayerSettings 中添加了一个自定义预处理器以统一。根据统一文档 Unity Custom Define Link 基本上你只需在
中添加预处理器
Player Settings->OtherSettings->Scripting Define Symbols
并在脚本中使用该预处理器 #if 预处理器。
我的问题是当我添加它时,VS 编辑器不会更改代码以编译启用的代码并导致未编译的代码。添加预处理器后,我还需要向脚本添加其他内容吗?我尝试将 AssetDatabase.Refresh();
添加到,但它没有用。是否需要刷新记忆?我确实重新启动了 unity,但没有帮助。
更新:现在我已经使用以下脚本在运行时添加预处理器
/// <summary>
/// Symbols that will be added to the editor
/// </summary>
public static readonly string[] Symbols = new string[] {
"MYPreprocessor1"
};
/// <summary>
/// Add define symbols as soon as Unity gets done compiling.
/// </summary>
static void AddDefineSymbols()
{
string definesString = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);
List<string> allDefines = definesString.Split(';').ToList();
allDefines.AddRange(Symbols.Except(allDefines));
PlayerSettings.SetScriptingDefineSymbolsForGroup(
EditorUserBuildSettings.selectedBuildTargetGroup,
string.Join(";", allDefines.ToArray()));
}
通过脚本添加的预处理器块有效,但我必须清除“Scripting Define Symbols”值并重新启动 unity 允许编译预处理器块代码。但是直接添加就不行了
注意:以上代码通过脚本将预处理器块添加到 Scripting Define Symbols 中。如果预处理器块已经存在,它不会做任何其他事情,只会添加它。
AssetDatabase.Refresh
或 AssetDatabase.SaveAssets
应该无需任何手动步骤即可完成这项工作,至少对于 JetBrains Rider 而言。
检查您的首选项是否启用了编辑器附加。
好的,这是 Visual Studio 2017 的问题。如果您只是重新加载解决方案,预处理器将无法工作。每当检测到预处理器语句发生变化时,VS 都会提供四个选项 Reload、Reload solution、Ignore 和 Ignore All。我总是使用重新加载解决方案在更改后重新加载所有数据,但是为了让预处理器获得 activated/refreshed VS 中的第一个选项,即必须按下重新加载按钮。这样您就不需要添加上面的任何其他脚本。我也用单声道测试过,单声道似乎可以自动完成上述工作。 VS2017 社区就是这种情况。希望这对某人有所帮助。
正如 ARMatt 所说,AssetDatabase.Refresh 或 AssetDatabase.SaveAssets,但我发现在我的情况下我需要两者(首先保存资产,但不确定它是否重要)。一个或另一个似乎没有保留我试图存储在可编写脚本的对象中的构建信息。
我在我的 PlayerSettings 中添加了一个自定义预处理器以统一。根据统一文档 Unity Custom Define Link 基本上你只需在
中添加预处理器Player Settings->OtherSettings->Scripting Define Symbols
并在脚本中使用该预处理器 #if 预处理器。
我的问题是当我添加它时,VS 编辑器不会更改代码以编译启用的代码并导致未编译的代码。添加预处理器后,我还需要向脚本添加其他内容吗?我尝试将 AssetDatabase.Refresh();
添加到,但它没有用。是否需要刷新记忆?我确实重新启动了 unity,但没有帮助。
更新:现在我已经使用以下脚本在运行时添加预处理器
/// <summary>
/// Symbols that will be added to the editor
/// </summary>
public static readonly string[] Symbols = new string[] {
"MYPreprocessor1"
};
/// <summary>
/// Add define symbols as soon as Unity gets done compiling.
/// </summary>
static void AddDefineSymbols()
{
string definesString = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup);
List<string> allDefines = definesString.Split(';').ToList();
allDefines.AddRange(Symbols.Except(allDefines));
PlayerSettings.SetScriptingDefineSymbolsForGroup(
EditorUserBuildSettings.selectedBuildTargetGroup,
string.Join(";", allDefines.ToArray()));
}
通过脚本添加的预处理器块有效,但我必须清除“Scripting Define Symbols”值并重新启动 unity 允许编译预处理器块代码。但是直接添加就不行了
注意:以上代码通过脚本将预处理器块添加到 Scripting Define Symbols 中。如果预处理器块已经存在,它不会做任何其他事情,只会添加它。
AssetDatabase.Refresh
或 AssetDatabase.SaveAssets
应该无需任何手动步骤即可完成这项工作,至少对于 JetBrains Rider 而言。
检查您的首选项是否启用了编辑器附加。
好的,这是 Visual Studio 2017 的问题。如果您只是重新加载解决方案,预处理器将无法工作。每当检测到预处理器语句发生变化时,VS 都会提供四个选项 Reload、Reload solution、Ignore 和 Ignore All。我总是使用重新加载解决方案在更改后重新加载所有数据,但是为了让预处理器获得 activated/refreshed VS 中的第一个选项,即必须按下重新加载按钮。这样您就不需要添加上面的任何其他脚本。我也用单声道测试过,单声道似乎可以自动完成上述工作。 VS2017 社区就是这种情况。希望这对某人有所帮助。
正如 ARMatt 所说,AssetDatabase.Refresh 或 AssetDatabase.SaveAssets,但我发现在我的情况下我需要两者(首先保存资产,但不确定它是否重要)。一个或另一个似乎没有保留我试图存储在可编写脚本的对象中的构建信息。