试验版本 Unity2020.3
编译符号,就是#if UNITY_ANDROID这个东西,在处理多平台多分支的情况下挺有用的,但是在ProjectSettings里面设置比较麻烦,不主动代码调用保存的话就要关编辑器才保存,有的非技术同事那里有时莫名其妙就变了,然后编译报错。csc.rsp这个东西一直有点印象但是了解不深,为了省点事还是要看下。
Unity2020.2文档
Unity2020.3文档
这个东西官方文档也是语焉不详的,2020.2文档里面有的,2020.3文档就没了。不同的Unity版本也对应不同的文件。
大概是 Unity5 smcs.rsp(runtime) & gmcs.rsp(editor) -> Unity2017 mcs.rsp -> Unity2020 csc.rsp
2021.1文档里面又有了, 2021.2文档里面又没了, 估计这里的文档没人维护…
mcs.rsp这个文件实际已经过时了,C#的API兼容性等级不论是.NET Standard 2.0还是.NET 4.x,使用的都是csc.rsp文件
但是有一个比较坑的点,官方文档的说明:
As an example, if you include the single line -define:UNITY_DEBUG in your mcs.rsp file, the #define directive UNITY_DEBUG exists as a global #define for C# scripts, except for Editor scripts.
文档里面说,在mcs.rsp里面设置编译符号,对编辑器代码是无效的,那么实际有没有效果?
现在已经用Assets/csc.rsp了,修改rsp文件后,能看到重新编译dll了,查看Temp文件夹下的编译器参数也是有rsp文件的内容的,应该是有效果的
可以用更直观的可视化方法测试下
csc.rsp文件内容
-define:TEST_RSP
编辑器代码内容
[MenuItem("测试/rsp文件")]
public static void TestRsp()
{
#if TEST_RSP
EditorUtility.DisplayDialog("", "有效", "确定");
#else
EditorUtility.DisplayDialog("", "无效", "确定");
#endif
}
应该是可以看到有效的
Every time you make changes to .rsp files, you need to recompile in order for them to be effective. You can do this by updating or reimporting a single script (.js or .cs) file.
这里应该也是过时的文档,现在保存之后是会立即进行编译的。(需要unity窗口失去焦点才会编译)
如果代码直接通过File.WriteAllText()等非Unity的API来写rsp文件,需要调用AssetDatabase.RefreshAll()来立即执行编译。但是这样的话,csproj文件又需要收到点生成。
如果调用Unity.CodeEditor.CodeEditor.CurrentEditor.SyncAll(); 就可以执行编译,生成csproj文件一条龙服务
原文链接
https://www.cnblogs.com/lunoctis/p/16592875.html