目录

一、unity仓库创建流程

1、新建仓库

2、把仓库克隆到本地

3、把工程文件拷贝到克隆地址

4、在unity中进行设置

5、提交到远程仓库

6、分支结构

二、关于提交中的冲突处理

1、线性流程

2、使用冲突处理工具(酌情)

(1)添加环境变量

(2)创建.gitattributes文件

(3)设置冲突处理工具

(4)设置外部merge工具

(5)若不慎保存冲突文件

(6)另:推荐UniMerge插件(该方法好用)

3、充分利用预制体

三、关于大文件上传

1、SSH方式

2、git lfs

四、注

一、unity仓库创建流程

1、新建仓库

注意在.gitignore中选Unity。

unity protobuf 协议 unity github协作_unity protobuf 协议

2、把仓库克隆到本地

选择用desktop打开或者点击复制按钮,复制URL在本地githubdesktop进行clone。

unity protobuf 协议 unity github协作_上传_02

unity protobuf 协议 unity github协作_unity_03

3、把工程文件拷贝到克隆地址

只需要拷贝Assets、Packages、ProjectSettings三个文件夹,其他文件在重新打开工程时会自动生成,可能要花一定时间。

unity protobuf 协议 unity github协作_unity_04

4、在unity中进行设置

打开工程文件,在unity中对一些选项进行设置,记得要保存场景。

unity protobuf 协议 unity github协作_上传_05

【解释】在使用git进行merge时,如果文件是二进制文件,一旦冲突发生很难查看git插入的冲突标识,无法解决冲突。因此修改设置,使得Unity项目的资产序列化生成文本文件。可以按照上图操作修改Unity的序列化策略,改Mixed为Force Text。这样场景文件和prefab等文件会被序列化为yaml文本文件。

5、提交到远程仓库

在github desktop中commit工程所做的改变,并点击push提交到github远程仓库。

unity protobuf 协议 unity github协作_github_06

之后的上传以及拉取都与上面类似,需要注意的是,当其他人修改并上传了内容时,我们在上传的时候会收到提示,这时候点fetch就行。

unity protobuf 协议 unity github协作_上传_07

然后再继续点右上角,先把他人的提交拉取,再提交自己的修改。

unity protobuf 协议 unity github协作_上传_08

6、分支结构

可以按照全员改动全放在master分支上的方式,但是不直观,条理性不强,建议的分支结构是master-develop的形式,即平常的开发工作都放在develop上,在develop上建立分支,或者直接提交,将develop分支的稳定版本合并到master上,需要再次开发时,只需要将master分支合并到develop上,继续开发即可。

二、关于提交中的冲突处理

unity protobuf 协议 unity github协作_unity_09

由于unity中有大量的二进制文件,而git对于这些文件的合并效果并不理想,这个时候如果两个或多个人同时上传内容,就可能会发生冲突,最简单的方式就是从远程和本地中选择一个进行保存,但是和场景关联的timeline等文件会出现对象丢失的现象。

unity protobuf 协议 unity github协作_unity protobuf 协议_10

目前有三套方案以供解决:

1、线性流程

顾名思义,就是场景轮着来改,甲先打个招呼要改场景,那其他人就不要再做改动了,等甲改完了,其他人再轮着做改动。非常稳,但是效率不够高。可以通过频繁提交来加快速度。

如果改动时没有同时场景时,比如只做了代码修改添加时,或者在不同的场景上修改,这个时候便可以并行工作。

2、使用冲突处理工具(酌情)

unity自身为我们提供了工具,这个工具可以自动识别比如场景文件,预制体文件之间的不同,并合并其中的差异。

在合并前,我们需要做一些预备工作。首先这个工具我们是用命令行打开的(当然,如果使用SourceTree等工具则不需要),所以我们要预先把git设置好环境变量,再之后,我们需要创建.gitattribute文件,这个文件的作用是设置一个路径下所有文件的属性,把诸如.unity,.prefab标记为文本文件,以便于合并工具进行处理,最后,我们需要把unity内置的合并工具进行一些设置。

步骤如下:

(1)添加环境变量

找到git所在的文件夹,将cmd的文件夹加入环境变量。

unity protobuf 协议 unity github协作_上传_11

unity protobuf 协议 unity github协作_上传_12

(2)创建.gitattributes文件

以文本格式创建,然后直接修改后缀名为.gitattributes。

unity protobuf 协议 unity github协作_unity_13

以文本文档的形式打开,在里面添加:

* text=auto

# keep lf on unity files

*.unity binary

*.prefab binary

*.asset binary

当我们以文本形式存储如场景文件,预制体文件时,git会自动对这些文本进行merge处理,但是格式和语义不全是正确的,因此设置为binary,让unity的mergetool和我们的扩展工具去处理这些文件的合并操作。

(3)设置冲突处理工具

unity编辑器里内置了这一工具,文件名称为UnityYAMLMerge.exe,我的文件路径如下:

unity protobuf 协议 unity github协作_git_14

在.git文件夹里用文本格式打开config(.git为隐藏文件夹,要设置为显示),并添加如下语句:

[merge]
tool = unityyamlmerge

[mergetool "unityyamlmerge"]
trustExitCode = false
cmd = 'D:/soft/unity/unity18-4.14/file/Editor/Data/Tools/UnityYAMLMerge.exe' merge -p "$BASE" "$REMOTE" "$LOCAL" "$MERGED"

在config中的视图,路径部分填写该工具的路径:

unity protobuf 协议 unity github协作_github_15

(4)设置外部merge工具

如果在合并的时候出现了这样的弹窗:

unity protobuf 协议 unity github协作_上传_16

出现这种情况的原因是unity合并工具会尝试为其无法处理的文件查找替代的mergetool,如果找不到所有的默认工具,就会抛出上面的错误。

可以通过上面给出的路径,找到这个mergespecfile文本文件,然后再下载一个merge工具,我下载的是merd

unity protobuf 协议 unity github协作_unity_17

下载此工具到默认地址,然后将这个工具的地址复制到打开的文本中,对mergespecfile文本进行修改:

unity protobuf 协议 unity github协作_上传_18

修改前:

unity protobuf 协议 unity github协作_github_19

更换内容:

unity use "%programs%\Meld\Meld.exe" "%r" "%b" "$l" -o "%d" --auto-merge

prefab use "%programs%\Meld\Meld.exe" "%r" "%b" "$l" -o "%d" --auto-merge


#

# Default fallbacks for unknown files. First tool found is used.

#

* use "%programs%\Meld\Meld.exe" "%r" "%b" "$l" -o "%d" --auto-merge

修改后:

unity protobuf 协议 unity github协作_git_20

之后就是出现冲突时的处理,比如双方同时修改了.unity文件,这时候就会报出冲突,选择open in command line

unity protobuf 协议 unity github协作_unity_21

然后在命令行里输入”git mergetool”,回车,这时候就会自动处理合并修改的部分了。

unity protobuf 协议 unity github协作_上传_22

当遇到unityYAMLmerge无法解决的问题时,控制台会为我们打开meld的工作界面:

unity protobuf 协议 unity github协作_unity protobuf 协议_23

在右侧选择我们需要合并修改的文件:

unity protobuf 协议 unity github协作_上传_24

有时候我们会看到除了本体的文件外,还出现了BACKUP、BASE、LOCAL、REMOTE这样的文件,这是git帮我们自动生成的,在合并后会自动删除,这里我们不用管它们,直接选择原文件就行。

等待加载好之后,选择下一冲突,或者前一冲突,就可以跳转到有冲突的区域,我们选择保留哪一项。如果没有冲突项的话,那就不用再修改,直接保存退出就行。

unity protobuf 协议 unity github协作_unity_25

unity protobuf 协议 unity github协作_unity protobuf 协议_26

合并修改后,会生成额外的.orig文件,比如我合并的是场景文件,我生成了这些,直接把他们discard掉就可。

unity protobuf 协议 unity github协作_unity protobuf 协议_27

之后再打开工程,会提示reload,点击reload,会发现场景已经合并了。

(5)若不慎保存冲突文件

若不慎保存了有冲突的场景文件或者其他文件,这个时候就会因为冲突而无法打开:

unity protobuf 协议 unity github协作_上传_28

我们可以以文本格式打开文件,手动解决冲突。

以文本格式打开冲突文件,在文件中搜索 <<<<<<< HEAD,这个是git为我们生成的冲突标记,找到冲突项,然后我们可以从中选择一项进行保留,当处理完所有的冲突项后,再尝试打开场景,这时候就可以打开了。

unity protobuf 协议 unity github协作_git_29

但是,虽然我们可以利用这些冲突处理工具来处理,在有时候仍然会出现各种各样的问题,原因是unity将场景强制文本化,转换成的是YAML格式,简单的通过对比来进行替换有时候会造成不正确的结果,我在这个问题上研究了几周还是不尽如人意。

(6)另:推荐UniMerge插件

最后找到这么一款插件,效果还不错,可以直接可视化比较场景与场景,以及物体与物体之间的差别,并修改,名称是UniMerge,可以在unityAssetStore里搜到,亲测好用,但是和git的配置做的不太好,也就是说得要手动保存两次的场景,然后放在一块比较修改,然后将修改后的场景保存,虽然这一步有一点点麻烦,但是还是可以尝试。

unity protobuf 协议 unity github协作_unity protobuf 协议_30

3、充分利用预制体

思路来源于这个视频:https://www.youtube.com/watch?v=YgoCp2tzRh0

具体思路是将场景内需要修改的物体分别转换为预制体,在提交修改时不提交场景,提交其他文件和修改后的预制体,达到弱化和细化冲突的目的。但是由于在资源中的预制体不会保留关于场景中的引用信息,完全不修改场景还是不太可行(或者改善代码的结构,尽量少用public直接赋值),可以留一至两个人可以更改场景,其他合作的成员提交修改的预制体来跟进修改情况。

unity protobuf 协议 unity github协作_上传_31

另外,由于timeline中的Bindings是和场景绑定的,如果二者不同时上传的话,就会丢失绑定,这个问题可以

具体实践时可以这几种方式一起用,但是考虑到其中可能带来的问题,场景文件还是不应该有太多人同时修改。

三、关于大文件上传

1、SSH方式

在使用gitee进行上传时,有时候可能会因为文件过多而出现一些奇怪的问题,原因可能是使用https进行克隆时出现了差错,而SSH方式则更稳定一些。

unity protobuf 协议 unity github协作_上传_32

配置码云的SSH时,官方有教程。

2、git lfs

这个扩展是git中用来传输大的二进制文件的, git传输的单个文件推荐是不超过50MB,上限是100MB(好像,我没查)。如果要传输大文件时,就应该使用git lfs。

       首先在官网上下载lfs,然后在需要应用lfs的工程里打开git bash,输入git lfs install,可以看到下面的画面。

      

unity protobuf 协议 unity github协作_unity_33

然后输入git lfs track进行追踪需要的文件、文件夹、文件类型等即可。

unity protobuf 协议 unity github协作_unity protobuf 协议_34

其他的操作和git的普通操作类似,若想了解更多可以参考其他文档。


四、注

  • 尽量不要保留空文件夹,git不托管空文件夹,但是文件夹生成的.meta文件则会接收,这样再互相协作时会比较麻烦。