任务45:unity的项目管理,创建程序集.asmdef管理项目代码
C#,C++等开发项目,需要通过解决方案 .sln,解决方案中的项目 .csproj 来管理项目中代码
项目中每个 .csproj 会生成一个dll文件,也就叫程序集。dll可以是启动程序,也可以是能被其它dll调用的类库。
解决方案 .sln 文件,定义了此解决方案包含哪些子项目,哪个是启动项目,而.csproj文件定义子项目包含哪些类,还有对其它dll的引用关系
用文本编辑器打开一个 .sln文件,可以看出来,解决方案文件,包含哪些项目和加载顺序:
- 开发者可以手动直接编辑这个 .sln文件
- 也可以在vs 操作菜单创建子项目,或者编辑指定启动项目,这些操作结果会自动修改并保存到.sln文件中
-
Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.27130.2010 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Server.App", "App\Server.App.csproj", "{11464C2C-E0B6-476E-ABB1-87445E736B76}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Server.Hotfix", "Hotfix\Server.Hotfix.csproj", "{E383A68D-1928-46F4-8896-4E99DF331476}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Server.ET.Core", "ET.Core\Server.ET.Core.csproj", "{85CB09B5-6392-4A13-BAF8-025218BFF496}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ThirdParty", "ThirdParty", "{5D11E730-0CAA-4A47-BA1A-379004F0F6D9}" EndProject
Unity能用 vs 来开发脚本代码,是因为Unity自动帮我们生成了这些.sln,.csproj文件
- 每次打开整个项目,首先要成功的加载解决方案中的各个子项目到开发环境中:
这句话怎么理解呢,只有vs 开发环境成功加载了这个方案的所有子项目,我们打开各个类,才能看到属性与方法的引用关系,点击变量或调用方法名才可以跳转到原始定义的地方,才能编译才能调试。 - 如果某个项目中有代码错误,导致打开解决方案时,不能成功加载这个子项目到开发环境中,那这个项目中的所有类就会显示找不到了,当然方法和属性也不会有自动提示。
- Unity项目开发时,会经常碰见Text,Image类不能用,找不到的情况,那是因为项目中的代码用到了UI程序集,但是没有正确的生成项目的.csproj文件,里面没有引用 "UnityEngine.UI"程序集,那在这个项目的开发环境中自然找不到UI程序集中的Text,Image等类了。
Unity自动生成Assembly-CSharp项目
如果我们没有自己创建与设定.csproj子项目来管理脚本,那只要Assets目录下有脚本文件,Unity都会自动生成一个Assembly-CSharp项目来管理这些代码。
vs code打个这个Assembly-CSharp.csproj文件,可以看到对这些脚本文件的引用:
- 每次打开整个项目,首先要成功的加载解决方案中的各个子项目到开发环境中:
-
<Compile Include="Assets\Joystick Pack\Examples\JoystickPlayerExample.cs" /> <Compile Include="Assets\Joystick Pack\Examples\JoystickSetterExample.cs" /> <Compile Include="Assets\Joystick Pack\Scripts\Base\Joystick.cs" /> <Compile Include="Assets\Joystick Pack\Scripts\Joysticks\DynamicJoystick.cs" /> <Compile Include="Assets\Joystick Pack\Scripts\Joysticks\FixedJoystick.cs" /> <Compile Include="Assets\Joystick Pack\Scripts\Joysticks\FloatingJoystick.cs" /> <Compile Include="Assets\Joystick Pack\Scripts\Joysticks\VariableJoystick.cs" /> <None Include="Assets\Res\Config\Moba5V5Config.txt" /> <None Include="Assets\Res\Config\HeroConfig.txt" /> <None Include="Assets\Res\Config\SkillConfig.txt" /> <None Include="Assets\Res\Config\GlobalProto.txt" />
如果你既创建了项目来管理代码,又还有一些是直接在Aseets中,没有归入到指定项目中的(这里我把他们叫“散落脚本”,这些代码就是在Assembly-CSharp项目中)。
那么可以得出结论,Unity正确的管理项目代码的方式是,自己创建项目进行管理,最好不要有散落脚本。
有了前面的理解,终于可以进入正题了
我们可以在任一Assets目录下的某个目录下创建.asmdef文件,那么Unity就会帮我们创建一个以这个.asmdef文件名为名称的项目,并把.asmdef所在目录,及以下所有子目录中的脚本全部纳入到创建的这个项目中。
箭头所指就是我们在对应目录下创建的.asmdef文件,自然就形成了我们需要的项目文件:
在Unity Project面板中选择.asmdef文件
可以给这个项目添加对其它项目的引用,比如上图Unity.Model项目引用了ET.Core,Unity.ThirdParty项目。
通过这节课,大家应该理解和掌握什么是项目,什么是程序集了吧?以及通过解决方案管理所有包含的子项目。
如果大家再遇到上面所说的那些意外情况,有寻找问题和解决问题的思路了吧。
另外,还有可能插件,package manager中的包导致Unity不能正确生成.csproj文件的情况,大家可以参考:https://www.taikr.com/article/3928
当然.asmdef管理项目代码还有别的益处:如果仅更改了某个.dll中的脚本,其它程序集都不需要重新编译。因此它的编译速度比所以脚本都放在Assembly-CSharp.dll编译更快。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)