unity github协作

    技术2022-07-10  153

    目录

    一、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

    四、注


    预装:Git、GithubDesktop

    远程仓库:Github 或者 码云

    一、unity仓库创建流程

     

    1、新建仓库

    注意在.gitignore中选Unity。

    2、把仓库克隆到本地

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

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

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

    4、在unity中进行设置

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

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

    5、提交到远程仓库

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

     

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

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

    6、分支结构

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

     

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

     

     

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

     

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

    1、线性流程

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

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

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

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

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

    步骤如下:

    (1)添加环境变量

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

     

     

    (2)创建.gitattributes文件

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

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

    * text=auto

    # keep lf on unity files

    *.unity binary

    *.prefab binary

    *.asset binary

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

     

    (3)设置冲突处理工具

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

    在.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中的视图,路径部分填写该工具的路径:

    (4)设置外部merge工具

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

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

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

     

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

     

    修改前:

    更换内容:

    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文件,这时候就会报出冲突,选择open in command line

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

     

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

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

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

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

     

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

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

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

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

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

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

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

    (6)另:推荐UniMerge插件

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

    3、充分利用预制体

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

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

    另外,由于timeline中的Bindings是和场景绑定的,如果二者不同时上传的话,就会丢失绑定,这个问题可以参照我的另一篇博客:https://blog.csdn.net/weixin_43347688/article/details/107322890

    此外,如果需要修改的预制体太多,全部应用的话太麻烦,可以参照我的这一篇博客:

    https://blog.csdn.net/weixin_43347688/article/details/107322813

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

    三、关于大文件上传

    1、SSH方式

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

    关于SSH的配置,可以参考这篇文章

    https://www.cnblogs.com/ayseeing/p/3572582.html

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

    2、git lfs

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

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

          

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

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


    四、注

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

    参考:

    https://blog.csdn.net/lxc2314554296/article/details/79155048

    https://zhuanlan.zhihu.com/p/57468011

    https://blog.csdn.net/lxbhahaha/article/details/88052205

    https://blog.csdn.net/weixin_30487317/article/details/97338203

    https://answers.unity.com/questions/1265292/unityyamlmerge-error.html

    https://stackoverflow.com/questions/36884337/unity-yamlmerge-error

    如果上面的工具下载慢:

    链接:https://pan.baidu.com/s/11wwNnxSoVU8j-X8HVwYhfQ  提取码:m74z 

    Processed: 0.016, SQL: 10