Unity3D 里使用自己的 DLL

ABSTRACT

2014 年博客教程。演示用 Visual Studio 类库项目编译自定义 DLL 放进 Unity 工程调用的完整流程,包括引用 UnityEngine.dll/UnityEditor.dll 以在 DLL 内调用引擎 API、.NET 版本兼容性坑,以及「把全部脚本编译成 DLL 防源码泄露」的用法。

核心要点

  • 基本流程:VS 新建类库项目 → 写 public 类与方法 → 生成 DLL → 拖进 Unity 的 Assets 任意位置(不强制 Plugins 目录)→ C# 脚本 using 对应命名空间后调用。
  • 命名空间可有可无:不用命名空间则调用时无需 using;Unity 默认脚本本身无命名空间,直接编译成 DLL 也能用,但不建议。
  • 在 DLL 里调用引擎 API:引用 Unity 安装目录 Editor/Data/Managed 下的 UnityEngine.dll 与 UnityEditor.dll,即可 using UnityEngine 写创建 GameObject 等逻辑。
  • 兼容性坑:编辑器里能跑不代表能出包;.NET 4.0+ 编译的 DLL 在当时 Unity 里无法通过编译,需用 .NET 2.0/3.0(部分现成 DLL 还要求完整 .NET 2.0 Profile)。
  • 进阶用途:把 Unity 工程全部脚本剪进类库项目编译成 DLL 放回工程,他人即无法直接阅读/编辑源码——早期的代码保护手段。
  • 该方法同样用于沉淀与游戏无关的通用库,跨项目复用。

关键实体与概念

类库项目、DLL、UnityEngine.dll、UnityEditor.dll、命名空间、.NET Framework 版本、Api Compatibility Level、代码保护

关联概念

来源回溯

  • 原始文件:raw/gamedev/unity3d里使用自己的dll.md(evernote/FW-游戏3研发技术 导入)

时效性评估

  • 仍有效:自定义托管 DLL 放 Assets 即用、引用引擎程序集写库的做法至今成立;「通用逻辑抽 DLL 跨项目复用」仍是常见工程实践。
  • 已过时:.NET 2.0/3.0 限制属于 Unity 5 前的 Mono 时代,现代 Unity 用 .NET Standard 2.0/2.1;「DLL 防源码泄露」意义大减——IL2CPP 直接把 C# 转 C++ 编译,反编译门槛远高于混淆 DLL(见 Unity 热更新方案演进 的现代运行时部分)。