
Unitycn和Unity国际一直处于一种若即若离的状态。在引擎上,有unity国际版、unitycn和团结引擎三种区分;在云服务上,有unity云和团结云两种区分;在客户端hub上,有国区hub和国际hub两种区分。我们要知道的是,这三者之间并没有任何强制绑定的关系,它们大致可以看做是三个独立的环节,可以分别择优的。笔者将要介绍的是云服务部分,在引擎的版本选择上不做过多探讨。
云服务方面,对于中国开发者,笔者最推荐的无疑是团结云。团结云的步骤相比国际云略微复杂,但从长期使用的角度来看,它的稳定性和支持都优于国际unity云。由于unity最近种种操作在尝试国区和国际的脱钩,使用国际云可能像使用国际版引擎一样,面临失去支持、下载部署困难、甚至法律层面上的风险,所以笔者强力推荐使用团结云。
但是这并不意味着unity国际云就不可使用。Unity现在的账号是一号两用,其创建的组织即可以管理国际云项目,又可以管理团结云项目,正如unity的hub不论是国区版还是国际版,都能识别和下载任何种类的unity引擎:unitycn和unity国际之间仍然藕断丝连。所以目前对于中国开发者而言,使用国际云确实是一种可行的解决方案,甚至在部署以后,进行版本控制时不需要任何额外的科学上网环节。所以如果读者认为unity会继续保持这种藕断丝连的联系,不会加大国区和国际的脱钩,那么也可以阅读国际版的使用方法。

这是团结云适用的操作
这是国际云适用的操作
这是两者都适用的操作
使用团结云实现版本控制需要使用以下软件:
Tuanjie DevOps
DevOps Version Control
这两个软件都可以在https://devops.unity.cn/download下载。其中DevOps Version Control的前身是Plastic SCM,其在2024年底停止服务,故网站上显示的名称也是Plastic SCM。

为了方便起见,我们下载国区的Unity hub进行项目的创建和托管。
国际云理论上只需要DevOps Version Control这个软件,我们同样为了方便下载国际的unityhub进行项目的创建和托管。

不论是团结云还是国际云,都需要在Unity的网站上创建组织才能进行版本管理。Unitycn和国际可以分别在id.unity.cn/zh/organizations和cloud.unity.com/home找到相关入口。但是不管在哪里创建的组织,只要用的同一个账号,组织内容都会同步。
此外团结云有一个不同于这个组织的组织:团结云开发组织。它对于团结云版本控制是必须的,但是不需要我们手动创建,下面会做说明。
在创建项目的时候,我们可以通过勾选开启在线服务、同意团结云/国际云服务条款两个选项并选择组织,使这个项目自动被托管到相应的云端。如果是没有托管的已创建项目,点击项目中间的“Not Connected”即可。如果使用国际版unityhub,在其变为“Connected”之后还要点击左侧的链条按钮。

此时国际版会打开项目并弹DevOps Version Control应用即为成功。
接下来我们要邀请小组成员加入项目。对于国际云,直接在刚才管理组织的网站邀请即可,但对于团结云,我们需要打开Tuanjie DevOps来邀请成员。这是因为团结云的开发组织和unity组织是分开的。

此时队友有多种方法部署项目并连接到本地。
可以点击未连接并选择文件夹部署:

对于国际版,可以上网页选择Open in desktop app(会打开DevOps Version Control)

也可以直接在DevOps Version Control里下载

之后的操作,我们都在DevOps Version Control(DVC)中进行。
如果读者之前使用过git,上手DVC就会比较简单。没有用过也没关系,DVC优雅的图形化界面非常易于理解,是笔者见过最好最易于上手的git类工具之一。
分支是并行开发的重要手段。为了避免开发的文件相互冲突,一般情况下团队中的每个成员都会在不同的分支上工作。在正规、规模较大的开发中,一般会为每个待实现的功能创建一个分支。如新建分支名为“feature/MapGenerate”代表这个分支的目的是添加一个新功能,功能是地图生成。在小规模的开发中,至少也要保证每人一条分支。由于unity开发特性,笔者还建议每人在项目中不同场景中工作,以避免冲突。

我们刚刚打开项目的时候,默认处于main分支,我们只需右键main分支的变更集(黑色圆点)-从此变更集创建分支即可。为了避免冲突,十分建议在从main分支创建个人分支之前,在main分支上,把所有重要子文件夹(如Scene、Script)都创建好,避免开发中两个人创建了同名文件夹。(可以参考https://indienova.com/indie-game-development/unity-develop-standards-directory-standards/)
节点(变更集)是分支的组成单位,也是版本控制的基本单位。一个变更集代表的就是某个时间的游戏开发状态。一般来说,我们如果不满意某个更改,想要回退版本,或者想要查看队友的开发进度,合并与队友的更改,都可以通过节点操作完成。
当我们做了一些更改之后,就可以将其推送到云端,成为一个变更集。

如图,我对项目做了一些更改,此时待定更改中就会显示我更改、添加和删除的信息。在上面的注释框中写清楚我们所做的操作,方便日后总结或搜寻,这相当于编辑了git commit -m中的信息。之后点击check in,我们当前的项目状态,所有文件信息就会成为一个变更集,相当于git的push。而add这一步是DVC帮我们自动完成的。
当我们变更节点的时候,由于unity运行会自动生成或更改文件,经常导致待定更改中有项而无法切换。对于这些无关紧要的更改和添加,我们直接点击“undo”即可,这会撤销所做的所有更改,也会使unity重载项目、脚本,删除/回退有变化的文件。当我们不小心把项目改崩了,不得不放弃所有更改,回退版本的时候,也可以undo。

我们接着讲解这个右键菜单。
这个菜单中的前四个选项可以帮助开发者快速了解这个变更集的情况。
“浏览此变更集中的存储库”,就能看到我们项目下有什么文件:

“差异比较此变更集”,就可以看到相比于其他变更集,该变更集有哪些文件不同。
“标记此变更集”可以给变更集打上标签,便于以后查找同一标签下的多个变更集。
“将工作区切换到此变更集”是开发中非常常用的一个功能,相当于git中的checkout。有房子图案的变更集就是我们的工作区,我们切换工作区之后也会随着来到对应的变更集上。此时unity会从服务器下载需要的文件并重载场景、脚本,我们项目的文件就会变成那个变更集的样子。
接下来四个操作与合并相关。
“从此变更集合并”是以右键工作区作为源,合并到你所在的分支上;
“从此变更集合并到”是将右键的工作区为源,合并到你选择的工作区上,这两个操作相当于git的merge。
“从此变更集挑拣”相当于cherry pick,它与合并不同的是,合并会尝试将源分支的所有更改都应用到目标分支上,而挑拣只会尝试应用这个变更集做出的更改,源分支前面的变更集添加或更改的东西则不管。在图像上,合并使用绿色箭头,挑拣使用紫色箭头。
“高级合并”包含了更多合并可用的选项。
在与另一个队友合并了之后,我们最好让对方或者另外一个队友切换到合并之后的工作区,确认合并顺利完成。这是因为合并效果可能会因冲突解决不好、私有项没有推送等原因导致文件错误、缺失。而私有项没有托管这一情况我们自己的unity是不会出现错误的,一般只有在另一个队友接手后才会发现。
接下来的功能对新手来说较不常用,值得一提的是,删除分支的指令在高级选项里。
如果两个人同时更改了一个文件,就会产生最常见的冲突,被称为更改/删除冲突。而这种冲突中最常见的是因为在同一个scene里工作而引起的冲突。而另一种冲突则是由于两个人在项目里建立了相同的文件夹引起的,被称为双面恶魔冲突。


删除更改冲突要求保留源或者目标中的某一个文件版本,页面最上方显示的“从变更集...到变更集...”中,从后面的变更集是源,到后面的变更集是目标。右键冲突的文件-差异比较,我们就能看到源和目标有何不同。如果两个人都对脚本文件做了重要更改,只能备份某人的代码,保留另一个人的文件,再手动粘贴代码更改。场景冲突同理。

双面恶魔冲突经常在第一次合并到main分支时发生,这是因为main分支创建时路径下几乎没有文件夹,而团队成员会在自己的分支下分别建立Script、Scene等基本文件夹,导致冲突。
双面恶魔冲突允许你将目标分支的文件夹更改名字来规避冲突,但不会像文件资源管理器那样智能合并文件夹,我们只需保留两种更改,再在文件资源管理器/unity中手动完成文件夹合并,删除多余的_dst文件夹即可。