unity 工程编译顺序(转)

本文详细解析了Unity3D开发中自动生成的Assembly-CSharp等工程文件的产生方式及其作用,包括脚本语言类型、前缀、后缀、编译顺序等关键信息。

我们在Unity3D开发的时候,经常会看到它会产生不少固定命名工程文件,诸如:

Assembly-CSharp-vs.csproj 
Assembly-CSharp-firstpass-vs.csproj

Assembly-CSharp-Editor-vs.csproj

Assembly-CSharp-Editor-firstpass-vs.csproj

看得不少人云里雾里的。那么,这些工程是如何产生的呢?各自的作用是什么?下面就来逐一解析。


一. 首先从脚本语言类型来看,Unity3D支持3种脚本语言,都会被编译成CLI的DLL

如果应用中含有C#脚本,那么Unity3D会产生以Assembly-CSharp为前缀的工程,名字中包含"vs的"是产生给Visual Studio使用的,不包含"vs"的是产生给MonoDevelop用的。

应用中包含的脚本语言

工程前缀

工程后缀

C#

Assembly-CSharp

csproj

JavaScript

Assembly-UnityScript

unityproj

Boo

Assembly-Boo

booproj


如果工程中这3中脚本都存在,那么Unity3D将会生成3种前缀类型的工程。


二. 对于每一种脚本语言,根据脚本放置的位置(其实也部分根据了脚本的作用,比如编辑器扩展脚本,就必须放在Editor文件夹下),Unity3D会生成4种后缀的工程。其中的firstPass就表示先编译,Editor表示放在Editor文件夹下的脚本。

下面以C#脚本为例。如果工程中只有C#脚本,不考虑为VS和MonoDevelop各自生成工程的差异性,我们可以得到4个工程文件:

Assembly-CSharp-firstpass-vs.csproj

Assembly-CSharp-Editor-firstpass-vs.csproj

Assembly-CSharp-vs.csproj 

Assembly-CSharp-Editor-vs.csproj

(1) 所有在Standard Assets,Pro Standard Assets或者 Plugins文件夹中的脚本会产生一个Assembly-CSharp-firstpass-vs.csproj文件,并且先编译;

(2) 所有在Standard Assets/Editor, Pro Standard Assets/Editor 或这Plugins/Editor文件夹中的脚本产生Assembly-CSharp-Editor-firstpass-vs.csproj工程,接着编译;

(3) 所有在Assets/Editor外面的, 并且不在(1),(2)中的脚本文件(一般这些脚本就是我们自己写的非编辑器扩展的脚本)会产生Assembly-CSharp-vs.csproj工程,被编译;

(4) 所以在Assets/Editor中的脚本产生一个Assembly-CSharp-Editor-vs.csproj工程,被编译。

之所有这样建立工程并按此顺序编译,也是因为DLL间存在的依赖关系所决定的。


转http://blog.youkuaiyun.com/jjiss318/article/details/7632041

<think>好的,我现在需要帮助用户了解Unreal Engine(UE)文件的编译顺序设置方法或解决方案。首,我需要回忆一下UE的编译流程和相关知识。根据用户提供的引用内容,特别是引用[3]中的代码示例,可以看出UE中的组件和属性设置可能涉及编译顺序的问题。 首,UE的编译顺序主要由编译系统(Unreal Build Tool,UBT)控制。UBT负责解析模块之间的依赖关系,并决定编译顺序。用户可能需要调整模块的依赖关系来改变编译顺序。例如,在模块的.build.cs文件中添加依赖项,这样UBT会编译被依赖的模块。 其次,用户可能需要处理头文件的包含顺序,这在C++项目中常见。确保头文件正确包含,避免循环依赖,可以使用前向声明来减少头文件依赖。此外,在代码中正确使用UPROPERTY和UFUNCTION等宏,确保UHT(Unreal Header Tool)能够正确生成代码,这可能影响编译顺序。 另外,项目的.Build.cs文件中的配置也很重要。比如,添加公共或私有依赖项,设置包含路径等。如果用户遇到编译错误,可能需要检查这些配置是否正确。 用户提供的引用[1]提到注册表写入,这可能与引擎安装和项目设置有关,但编译顺序更多涉及项目内部的模块和文件配置。引用[2]建议查阅官方文档,所以需要推荐用户查看UBT和UHT的相关部分。 可能的问题包括模块依赖导致编译失败,头文件找不到,或者生成的代码不正确。解决方案包括调整依赖项、检查头文件包含、使用前向声明,以及清理中间文件重新生成等步骤。 用户可能需要具体的步骤来设置编译顺序,例如修改.build.cs文件,或者如何解决常见的编译错误。因此,在回答中应分点说明UBT的作用、模块依赖配置、头文件处理、UHT的角色,以及问题排查步骤。同时,生成的相关问题可以涉及更具体的配置方法或常见错误处理。</think>### Unreal Engine文件编译顺序解析与设置方法 Unreal Engine的编译顺序由**Unreal Build Tool (UBT)** 和**Unreal Header Tool (UHT)** 协同控制,以下是具体机制与解决方案: --- #### 1. 编译系统的核心逻辑 - **UBT依赖分析** UBT通过解析项目中的`.Target.cs`和模块的`.Build.cs`文件,建立模块间依赖关系树。依赖规则为: $$ \text{被依赖模块} \rightarrow \text{当前模块} $$ 例如,若模块A依赖模块B,则B会于A编译[^1]。 - **UHT代码生成** 在C++代码中使用的`UPROPERTY`/`UFUNCTION`等宏会触发UHT生成胶水代码(如`*.generated.h`),此过程在正式编译前执行[^3]。 --- #### 2. 编译顺序配置方法 || 场景 | 操作步骤 | |--|--|--| | **模块级调整** | 修改模块依赖关系 | 在模块的`YourModule.Build.cs`中添加: ```csharp PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine" }); PrivateDependencyModuleNames.Add("PhysicsCore"); // 添加私有依赖 ``` | **文件级控制** | 强制头文件包含顺序 | 在`.cpp`文件中手动调整`#include`顺序: ```cpp #include "GeneratedCode.h" // 必须放在首位 #include "MyClass.h" ``` | **工程级优化** | 减少编译单元 | 使用预编译头文件(PCH),在`Build.cs`中配置: ```csharp bUseUnityBuild = true; // 启用Unity Build合并编译单元 ``` --- #### 3. 常见问题与解决方案 | 问题现象 | 排查步骤 | 修复方案 | |--|--|--| | **"Undefined symbol"错误** | 检查模块依赖是否缺失 | 在依赖模块的`.Build.cs`中添加缺失模块 | | **头文件找不到** | 验证包含路径配置 | 在`Build.cs`中添加: ```csharp PublicIncludePaths.Add("Path/To/Headers"); ``` | **UHT生成失败** | 检查宏语法错误 | 确保`UCLASS()`/`UFUNCTION()`等宏参数正确[^3] | | **循环依赖** | 使用`Forward Declare` | 用`class MyClass;`替代`#include "MyClass.h"` | --- #### 4. 高级调试技巧 - **编译过程可视化** 运行命令`UBT -graph`生成依赖关系图(需安装GraphViz): ```bash Engine\Build\BatchFiles\Build.bat -project="MyProject.uproject" -graph > dependencies.dot ``` - **强制重新编译** 删除中间文件目录: ``` MyProject/Intermediate/ MyProject/Binaries/ ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值