C#中是否可将类导出至新命名空间以管控类型可见性?
C#/Unity 程序集类型可见性管控方案
你当前尝试的别名写法无法生效:普通using别名的作用域仅限书写该语句的当前代码文件,你在UnityTypes命名空间块内声明的using Vector2 = UnityEngine.Vector2不会对外暴露,其他引用UnityTypes的程序集无法识别到这个类型别名。
你的三层程序集拆分思路完全正确:把纯逻辑工具库和Unity引擎层做物理隔离,既方便写单元测试拿覆盖,也能清晰划清模块边界。针对你的需求,最低成本、完全匹配要求的实现方式是用C# 10的全局using别名,Unity 2022及以上版本默认支持该语法:
- 在
UnityTypes程序集中新建一个专门存放全局别名的代码文件,把所有允许工具库调用的Unity类型做全局映射,不需要做任何自定义封装:
// UnityTypes/GlobalTypeAliases.cs global using Vector2 = UnityEngine.Vector2; global using Vector3 = UnityEngine.Vector3; global using Quaternion = UnityEngine.Quaternion; // 后续需要开放给工具库的类型,直接按上述格式追加即可
- 给
PathFinding这类工具库的asmdef(程序集定义文件)仅添加UnityTypes的引用,不要直接引用UnityEngine程序集。配置完成后,工具库代码可以直接使用你做了别名映射的类型,但凡有人尝试引用不在别名列表里的Unity类型(比如MonoBehaviour、GameObject、Transform),编译器会直接报错,从编译层面彻底堵死非预期的引擎依赖,完全实现类型可见性管控的目标。 - 该方案零运行时开销:全局using是纯编译期语法糖,编译后所有别名对应的都是原生
UnityEngine类型,不存在任何类型转换成本。上层TheGame这类同时引用UnityEngine和工具库的业务程序集,调用工具库方法时直接传Unity原生对象即可,不需要做任何适配。
如果项目使用Unity 2020及更早版本,不支持C# 10全局using语法,可以接入一个轻量Roslyn分析器,给工具库程序集配置类型引用白名单:只要检测到代码引用了UnityEngine下不在白名单内的类型就抛出编译错误,管控效果和全局别名方案完全一致,只是初始配置成本稍高。
不要通过自定义结构体/类封装Unity原生类型,这种做法只会产生大量无意义的类型转换逻辑,抬高维护成本,没有任何实际收益。
注:你贴的示例代码中有两处C#/Unity语法笔误:C#遍历集合需使用foreach关键字,而非Java风格的冒号遍历写法;Unity生命周期脚本的基类是MonoBehaviour,注意拼写不要漏写字母'u'。
内容的提问来源于stack exchange,提问作者daicoden
相关产品推荐
相关产品推荐

