使用Projeny的优点
好吧,为什么要这样做?为什么要为每个项目创建这个看似复杂的目录结构的麻烦? Unity设计的标准方式有什么问题?
我们这样做是因为它比标准Unity开发有很多优点:
1 - 项目之间共享文件
通过使用目录链接,您可以让多个Unity项目都使用相同的软件包文件夹,而无需每个项目复制和粘贴每个软件包。您可以更改预制或C#文件等文件,并将该更改应用于所有使用它的项目
以前,在不同的Unity项目之间共享代码的最好方法是将代码放入DLL中,然后将该DLL输出到要使用它的所有Unity项目。这样可以正常工作,但有一些 gotchas 使得这种方法难以正确执行。
想在几个不同的游戏中重用一些常用的实用程序代码/ prefabs?每个游戏都有多个Unity项目,直接使用相同的实用程序包。
想要测试游戏的一部分,而不需要启动整个项目?只需创建另一个Unity项目,并仅引用要测试的游戏的部分。
要查看此操作,请执行以下操作:(注意:这假设您已经运行prj --init
,如上所述):
- 打开Unity然后在`UnityProjects / SphereMover / SphereMover-Windows’打开项目
- 打开Unity的另一个副本,然后在UnityProjects / CubeMover / CubeMover-Windows上打开项目
- 在第一个Unity中打开名为“SphereMain”的场景,并在第二个Unity中打开场景“CubeMain”
- 如果你运行它们,你应该看到形状移动和改变颜色 *这里用于移动Sphere和Cube的脚本是一样的,可以在共享包“CommonShapeMover”中找到。
- 作为另一个例子,在UnityProjects / AllMovers / AllMovers-Windows中打开Unity项目
- 运行场景
AllMovers
- 您应该在同一场景中看到立方体和球体
- 这是因为这三个项目都有一些共享的包。请注意,这允许共享代码以及预制(即立方体和球体预制),场景等。
2 - Package组织和Asset Store集成
Projeny允许您更轻松地管理自己创建的许多不同的Unity包,还可以管理您通过资产商店安装的那些包。
您可以建立您通过Asset Store购买并添加到您的“UnityPackages”目录中的大量包,然后通过简单地选择或不为每个项目选择它们来轻松地包含或排除它们。 Projeny还可以通过Unity中的简单界面轻松升级/下载安装的Asset Store package。有关通过Projeny管理Asset Store package的更多详细信息,请参阅本节。
3 - 即时平台切换
您可能会想知道为什么您处理的项目都标有后缀-Windows
。或者为什么在运行--init
命令之后会出现多个ProjectSettings
文件夹(一个位于“CubeMover”下方,另一个位于“CubeMover-Windows”下面)
原因是允许Projeny为每个平台创建完全独立的Unity项目目录。这使我们能够从一个平台立即跳转到另一个平台,而无需等待Unity来处理所有Assets。
在上面的例子中,我们只初始化了Windows Unity项目CubeMover-Windows
,但是我们也可以通过打开这个项目的这些平台来创建CubeMover-iOS
,CubeMover-Android
等。
当这种情况发生时,Projeny将创建一个目录链接到主要的ProjectSettings
目录,以便我们可以让所有这些不同平台的项目使用相同的Unity项目设置。
要查看此操作,请在Unity中打开“CubeMover”项目,然后选择菜单项Projeny - >Change Platform - > iOS
。第一次这样做将需要更长的时间,因为Unity必须处理文件,但随后的任何时间都应该几乎是即时的,因为它只不过是简单地打开另一个项目。
4 - 编译时间优化
Unity在多次通过中编译您的项目。第一遍编译Plugins /
目录中的所有C#文件,第二遍编译所有其他C#文件。如果Unity没有检测到Plugins /
目录中的任何更改,那么Unity将跳过此第一遍,只执行第二遍。 (注意:这有点简单 - 有关详细信息,请参阅[这里](http://docs.unity3d.com/Manual/ScriptCompileOrderFolders.html)
我们可以通过将所有稳定的Packages(例如通过Asset Store获得的Packages)放入Plugins
文件夹中,并将我们经常更改的软件包直接放在Assets
文件夹下方,从而获得优势。
而且因为我们正在使用目录链接,并且源控件忽略了整个CubeMover-Windows
文件夹,更改这些目录链接的位置是微不足道的。您可以通过简单地在Projeny Package Manager窗口中更改几个东西,根据您正在进行的工作,每天多次修改此目录结构。
要查看此操作,请打开AllMovers-Windows
项目。
默认情况下,Assets文件夹应显示如下:
- AllMovers
- CommonShapeMover
- CubeMover
- Plugins
- Projeny
- SphereMover
如果我们只在“AllMovers”项目中工作,那么每次脚本改变时,我们都不需要重新编译CommonShapeMover
,CubeMover
和SphereMover
项目。所以这些项目可以移动到Plugins
文件夹下面。
为此,请通过单击菜单项Projeny - >Package Manager...
来打开Package Manager。你应该看到这样的东西:
如果您单击编辑按钮,您将看到与该项目关联的ProjenyProject.yaml
文件。此文件包含项目的所有projeny配置设置。您可以手动编辑此文件,或使用如上所示的“Package Manager”窗口提供的GUI。
现在,将CommonShapeMover
,CubeMover
和SphereMover
项目拖动到Plugins
文件夹,这样它就像这样:
然后点击“Update Directories”按钮。这将更新ProjenyProject.yaml
文件,并更新我们项目中的目录链接以进行匹配。 Unity刷新后,如果您查看Assets
选项卡,现在应该显示如何:
- AllMovers
- Plugins
- CommonShapeMover
- CubeMover
- Projeny
- SphereMover
现在我们可以在AllMovers
项目中继续编码,并从更快的编译时间中获益。
5 - 平台特定的包文件夹
Unity 5添加了一些有用的功能,包括enable/disable基于平台的DLL的功能。如果您将一个DLL添加到项目中,那么点击它可以在检查器中获得一堆复选框,允许您选择该DLL的平台。 Projeny允许您做类似的事情,除了所有资产和目录。
这是可能的,因为当Projeny生成您的Unity项目时,可以根据当前平台选择不同的包文件夹集合,因为每个平台都有为其生成的自己的Unity项目目录。
一个例子是,如果你有一个大的资源文件夹包含特定平台的大量数据。由于Unity始终包含用于构建的Resources文件夹的内容,这将导致资源中的平台特定文件无需任何理由包含在其他平台中。使用Projeny,您可以简单地将Resources文件夹移动到平台特定的软件包来解决这个问题
这也可以使代码更容易。您可以使整个包文件夹具有平台特性,那么您不再需要在整个文件周围添加#if
,以避免其他平台上的编译错误。
有关如何使用此功能的更多详细信息,请参阅包配置部分。
6 - Packages的依赖管理
将包添加到UnityPackages
目录中时,还可以指定该包所依赖的包。然后,当Projeny生成您的Unity项目目录时,它可以自动找出所需的Packages。
这是非常强大的,因为经常在一个新项目上工作时,您只需要求包X,而您不需要考虑这个软件包所需的其他软件包。
要查看此操作,请再次打开AllMovers-Windows
项目。然后点击Projeny - >Package Manager
打开程序包管理器。在Project
部分,尝试删除项目CommonShapeMover
,CubeMover
和SphereMover
。您可以通过点击它们并点击删除,或右键单击并选择删除来执行此操作。Package Manager应该看起来像这样:
然后点击Update Directories
。如果您看看Assets
选项卡,您应该看到以下目录结构:
- AllMovers
- Plugins
- CommonShapeMover
- CubeMover
- Projeny
- SphereMover
所以问题是,为什么在ProjenyProject.yaml
文件中没有指定SphereMover
,CommonShapeMover
和CubeMover
包。
原因是AllMovers
包具有与项目独立的自己的列表依赖项。
要查看此信息,请单击Package Manager
窗口中最左侧的箭头。除了显示当前ProjenyProject.yaml
配置设置的上一个屏幕之外,这将更改视图,以显示可用于项目中的软件包的完整列表。
现在,右键单击Packages列表中的AllMovers
包,然后选择Edit ProjenyPackage.yaml
,如下所示:
这将打开UnityPackages / AllMovers / ProjenyPackage.yaml
的文件。应该显示如下:
Dependencies:
- CubeMover
- SphereMover
这告诉Projeny,每当将AllMovers
包添加到项目中时,也应该添加SphereMover
和CubeMover
包。一旦Projeny处理AllMovers
项目的ProjenyPackage.yaml
文件,它将会查看CubeMover
和SphereMover
项目的ProjenyPackage.yaml
,然后再次重复这些依赖关系等。 (CubeMover
和SphereMover
包是包含对CommonShapeMover
的引用)。
7 - 更智能的Visual Studio解决方案生成
Projeny还可以利用包之间的依赖关系信息来生成更好的Visual Studio项目。
要查看此操作,请打开AllMovers-Windows
项目,然后单击菜单项Projeny - >Package Manager...
。然后点击右侧的箭头按钮,直到到达此屏幕:
单击打开解决方案按钮。默认情况下,这将打开使用默认程序的解决方案,但您也可以通过设置VisualStudioIdePath
的值,在Projeny.yaml
中显式设置,如下所示:
PathVars:
UnityPackagesDir: '[ConfigDir]/UnityPackages'
UnityProjectsDir: '[ConfigDir]/UnityProjects'
LogPath: '[ConfigDir]/PrjLog.txt'
VisualStudioIdePath: 'C:/Program Files (x86)/Microsoft Visual Studio 12.0/Common7/IDE/devenv.exe'
打开解决方案后,您应该会看到两个C#项目。一个名为AssetsFolder
,其中包含Assets /
文件夹下的所有C#文件,一个名为PluginsFolder
,其中包含Plugins /
文件夹下的所有C#文件。到目前为止,这与Unity生成视觉工作室解决方案时所产生的解决方案相同。
返回到软件包管理器,并拖动以下项目:
现在,如果您点击更新解决方案,并返回到Visual Studio,您应该看到以下内容:
您可以看到,您拖动到包管理器右侧列表的每个包将为其创建一个C#项目。您还会注意到,AssetsFolder已经消失。这是因为Projeny没有找到任何文件放在其中,所以没有打扰创建该项目。但是,由于我们没有拖动CommonShapeMover
项目,所以PluginsFolder项目仍然存在。
这对代码组织有帮助,但更重要的是,这允许您设计模块级别的依赖关系。在正常的Unity项目中,每个代码文件可能会在整个项目中使用任何其他代码文件。对于小项目,这不是一个问题,但是,由于您的项目规模大小,因此能够在模块级别设计代码是有帮助的,并避免让您的项目进入[Big ball of mud](https:// en .wikipedia.org /wiki/ Big_ball_of_mud)。
例如,通常可以建立一个可重用的实用程序函数库,您可以在多个Unity项目中使用,例如数学库。对于这些情况,重要的是避免在数学库中使用特定于游戏的代码,因为那么您的数学库将强烈地耦合到您的游戏中,您将无法在其他项目中使用它。如果您使用Projeny生成的解决方案文件进行编译,这不会是一个问题,因为它将保证这些依赖关系保持不变,即使Unity本身允许它们。
如果要使用Projeny生成的visual studio解决方案作为主编辑器,您还可以将Unity设置为默认使用。您可以通过执行以下操作来执行此操作:
- 打开Unity并进入
Edit -> Preferences -> External Tools
- 点击
External Script Editor
旁边的下拉菜单 - 点击Browse
- 导航到Projeny的安装目录(默认情况下为
C:\ Program Files(x86)\ Projeny
),并选择Bin / PrjOpenInVisualStudio.bat
(请注意,您可能必须在底部选择AllFiles
右下拉) - 接着
External Script Editor Args
类型“$(File)” “$(Line)”
现在,当您双击Unity控制台中的C#脚本或错误消息时,应该在Projeny生成的解决方案中打开该文件。请注意,在这种情况下,您将必须如上所述为VisualStudioIdePath
设置一个值。
请注意以下事项:
- 包管理器中的“Visual Studio解决方案”列表的内容保存到
ProjenyProject.yaml
。如果您按照上述步骤单击程序包管理器中的编辑按钮,您可以看到这一点。 - 根据上一节中描述的
ProjenyPackage.yaml
文件中的包的依赖关系生成C#项目依赖关系。 (您可以通过单击References - >Add Reference
看到这一点,然后在Visual Studio中查看Solution -> Projects
) - 解决方案文件生成并保存在
UnityProjects / AllMovers-Windows.sln
中。不要混淆UnityProjects / AllMovers-Windows / AllMovers-Windows.sln
,这是通常由Unity生成的解决方案的路径 - 解决方案文件和所有csproj文件都是完全生成的,因此您不应该更改任何设置,例如预处理器定义,输出路径等。您在此处进行的任何更改将在下次更新解决方案时被覆盖。另外请注意,如果您使用源代码控制,csproj文件和解决方案文件将被忽略,因为整个Unity
Assets
目录被忽略。然而,您可以使用Visual Studio创建/删除文件,而不会出现问题,因为这些文件将在下次再次添加时Projeny进行更新。 - 这个自定义解决方案生成的DLL根本就没有使用,就像普通的Unity生成的解决方案所生成的DLL一样。 Unity仍然必须重新编译所有代码,即使我们已经使用自定义解决方案编译了它。
- 生成的解决方案文件是特定于平台的,因为每个平台包含不同的预处理器定义。这是很好的意识到,因为这意味着你将不得不退出视觉工作室,并重新打开解决方案,当更改平台。
- 您还可以将正则表达式添加到项目列表中。您可以通过右键单击Visual Studio解决方案列表中的空白处,然后选择
Add As Regex...
,在包管理器中执行此操作。例如,要为每个包创建一个Visual Studio项目,请添加一个值为。*
的正则表达式。请注意,此正则表达式的规则与python编程语言中使用的规则相同(更多详细信息,请此处)