Unity 定义程序集Assembly definitions

什么是程序集

官方解释:An assembly is a C# code library that contains the compiled classes and structs that are defined by your scripts and which also define references to other assemblies.
程序集一个C#代码库,包含编译后的类和结构体,并定义了对其他程序集的引用,表现为dll或exe文件。
程序集类似一个文件夹,可以对其中的脚本进行管理。
Unity有4个预定义程序集,编译的顺序如下:

Phase Assembly name Script files
1 Assembly-CSharp-firstpass Plugins文件夹下的运行时脚本
2 Assembly-CSharp-Editor-firstpass Plugins\Editor文件夹下的脚本
3 Assembly-CSharp 其他不在Editor目录下的脚本
4 Assembly-CSharp-Editor 在Editor目录下的脚本

在这里插入图片描述
每一个csproj文件对应导出工程的dll文件,dll文件路径:项目名\Library\ScriptAssemblies
在这里插入图片描述
预定义程序集之间的依赖关系

默认情况下,游戏的脚本会编译进Assembly-CSharp这个程序集中,每次修改脚本都会重新编译这个程序集,随着项目脚本增多,编译时间会逐渐增加,而且任何脚本都可以直接访问其他脚本,这也会使代码重构变得困难。
在这里插入图片描述
将项目中的代码分配到不同的程序集就可以降低不同模块之间的耦合,也可以减少编译时间,比如修改了程序集Main中的内容,会重新编译Main,其他的程序集如Stuff就不会编译。
不同程序集之间的依赖是单向的,不能互相依赖,这是为了避免循环依赖的问题,如Main依赖Stuff,Main中的脚本可以引用Stuff中的脚本,反过来就不能引用,而Library因为没有依赖其他程序集,就可以轻松的移植到其他项目中,方便复用代码。

创建程序集和依赖

在这里插入图片描述
在项目中新建一个文件夹GamePlay用来存放所有游戏逻辑相关的代码,在文件夹内右键 -> Create - > Assembly Definition,创建一个名为GamePlay的程序集,则GamePlay文件夹下所有脚本都归这个程序集管理。
在这里插入图片描述
另外新建一个GameProto的文件夹存放所有配置和协议代码,同样创建一个名为GameProto的程序集。
在这里插入图片描述
点击GamePlay程序集,在面板上添加对GameProto的依赖,这样游戏内逻辑可以引用配置和协议,反过来就不行,代码结构更加清晰。
Auto Referenced,默认情况,预定义的程序集会依赖我们自己定义的程序集,取消勾选就会取消这个依赖。
No Engine References,勾选的话就不会引用UnityEngine
在这里插入图片描述
定义程序集后,根目录也会出现对应的csproj文件,也会生成对应的dll文件
在这里插入图片描述
定义程序集之后的依赖关系,即自己定义的程序集优先级高于Assembly-CSharp-firstpass
在这里插入图片描述
点击脚本即可看到它属于那个程序集

程序集相关操作

// 根据AssembliesType获取程序集
// Selects assemblies compiled for the editor
// Assembly[] playerAssemblies = CompilationPipeline.GetAssemblies(AssembliesType.Editor);
// Selects assemblies compiled for the player 
UnityEditor.Compilation.Assembly[] playerAssemblies = CompilationPipeline.GetAssemblies(AssembliesType.Player);
foreach (var assembly in playerAssemblies)
{
    
    
    //程序集名称
    Debug.LogError(assembly.name);
    //所有依赖的程序集
    Debug.LogError(assembly.assemblyReferences);
    //程序集包含的所有文件
    Debug.LogError(assembly.sourceFiles);
}

//监听编译开始或结束
CompilationPipeline.compilationStarted += OnCompilationStarted;
CompilationPipeline.compilationFinished += OnCompilationFinished;

反射获取程序集

// 获取当前程序集
System.Reflection.Assembly assembly1 = System.Reflection.Assembly.GetExecutingAssembly();
Debug.LogError(assembly1.FullName);

// 获取类型对应的程序集
System.Reflection.Assembly assembly2 = typeof(CharacterUI).Assembly;
// 获取程序集中的类型
System.Type type = assembly2.GetType("UIManager");
Debug.LogError(assembly2.FullName + "--" + type.Name);

// 根据名称加载程序集
var assembly3 = System.Reflection.Assembly.Load("GameProto");
Debug.LogError(assembly3.FullName);

猜你喜欢

转载自blog.csdn.net/sinat_34014668/article/details/127741427
今日推荐