咨询:编译Unity DLL时Visual Studio移除Odin属性的保留方法
解决Odin属性编译后从DLL中消失的问题
1. 引用正确的Odin程序集
- 直接从你的Unity项目目录里找Odin的DLL来引用,路径一般是
Packages/Sirenix/Odin Inspector/Runtime/Sirenix.OdinInspector.dll(如果是Editor用的属性就找Editor目录下的),别用网上随便下的或者版本不对的Odin DLL。 - 在VS的引用设置里,把这个Odin DLL的「复制本地」改成
True,保证编译时属性的元数据能被正确打包进你的DLL。
2. 关闭VS的编译优化
- 打开VS项目属性,切到「生成」标签页,取消勾选优化代码选项。有些编译优化会把没被直接调用的属性元数据给剥离掉,关了优化大概率能解决。
3. 先确认属性真的被移除了
- 用ILSpy或者dnSpy这类反编译工具打开你编译好的DLL,看看目标类/成员上还能不能找到
[HideReferenceObjectPicker]。要是反编译能看到,那只是Unity Inspector没识别到——这时候要确保Unity里的Odin正常加载,而且你的DLL是放在Assets目录下的(别丢到Packages或者其他特殊目录)。
4. 极端情况:强制保留元数据
如果上面的方法都没用,试试在项目里加这段代码,强制编译器保留属性:
using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("Sirenix.OdinInspector")]
另外也检查下自己的代码,确保属性是正确应用的,比如:
using Sirenix.OdinInspector.Attributes; public class MyCustomClass { [HideReferenceObjectPicker] public MyReferenceType MyField; }
5. 检查版本兼容性
- 确认你用的Odin版本和Unity版本兼容,而且VS里引用的Odin DLL和Unity项目里装的Odin版本完全一致——版本不匹配很容易导致属性元数据保留失败或者无法被识别。
内容的提问来源于stack exchange,提问作者bomfirit
相关产品推荐
相关产品推荐

