前言
不开玩笑的说,我在Reddit上看到过一个帖子,楼主问大家备份Unity工程的频率。
我猜你看到这就已经开始笑了,别笑,当年你我都是这么过来的。我不以偏概全哈,我只说我的情况,当年我也是玩游戏玩的沉迷,老爸学的数据库,他治疗游戏沉迷的方法就是引导我去分析游戏的原理。我也就这么入坑了。
初中时候做unity的时候,那时候还没接触到版本控制这个事,那时候家里限制我每周末能碰电脑,所以只能周六日写点,周日晚上备份。那时候还真的是右键工程目录,WinRAR分卷压缩,传到百度网盘。
(一说做unity都做了十年,还好实习还和unity相关,也算满足自己的一个小心愿)
好了,言归正传。
文件夹结构
无论你是用版本控制还是像小时候意气风发的我用WinRAR压缩备份,你都避不开选择性忽略文件夹。因为,如果你完整备份,最后的结果就是压缩文件离奇的大,这肯定是能做优化的。
虽说现在硬盘白菜价,但不能这么造。
我们先看一下文件夹结构,以我在Github上托管的UniGPT项目为例:
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2023/10/1 18:08 .vscode
d----- 2023/10/1 18:08 Assets
d----- 2023/10/1 18:08 Build
d----- 2023/10/1 18:11 Library
d----- 2023/10/1 18:11 Logs
d----- 2023/10/1 18:11 obj
d----- 2023/10/1 18:11 Packages
d----- 2023/10/1 18:11 ProjectSettings
d----- 2023/10/1 18:11 Temp
d----- 2023/10/1 18:11 UserSettings
-a---- 2023/8/18 18:04 118 .gitattributes
-a---- 2023/8/11 11:00 1371 .gitignore
-a---- 2023/7/23 2:33 99 .vsconfig
-a---- 2023/7/20 19:12 69883 Assembly-CSharp-Editor-firstpass.csproj
-a---- 2023/7/20 19:32 76292 Assembly-CSharp-firstpass.csproj
-a---- 2023/9/18 23:46 70892 Assembly-CSharp.csproj
-a---- 2023/9/8 13:58 61465 Assembly-CSharp.Player.csproj
-a---- 2023/10/2 0:02 0 dir.txt
-a---- 2023/7/20 19:32 70883 EasySave3.csproj
-a---- 2023/9/11 16:44 58000 IngameDebugConsole.Editor.csproj
-a---- 2023/9/11 16:44 56675 IngameDebugConsole.Runtime.csproj
-a---- 2023/9/8 13:53 51086 IngameDebugConsole.Runtime.Player.csproj
-a---- 2023/9/11 16:44 57174 kcp2k.csproj
-a---- 2023/9/8 13:53 51592 kcp2k.Player.csproj
-a---- 2023/8/30 20:42 58701 LeTai.TranslucentImage.csproj
-a---- 2023/8/30 20:42 57143 LeTai.TranslucentImage.Demo.csproj
-a---- 2023/8/30 20:42 52486 LeTai.TranslucentImage.Demo.Player.csproj
-a---- 2023/8/30 20:42 58453 LeTai.TranslucentImage.Editor.csproj
-a---- 2023/8/30 20:42 54030 LeTai.TranslucentImage.Player.csproj
-a---- 2023/8/30 20:42 56765 LeTai.TranslucentImage.UniversalRP.csproj
-a---- 2023/8/30 20:42 57955 LeTai.TranslucentImage.UniversalRP.Editor.csproj
-a---- 2023/8/30 20:42 52108 LeTai.TranslucentImage.UniversalRP.Player.csproj
-a---- 2023/7/2 23:24 1523 LICENSE
-a---- 2023/9/11 16:44 55416 Mirror.Authenticators.csproj
-a---- 2023/9/8 13:53 49856 Mirror.Authenticators.Player.csproj
-a---- 2023/9/11 16:44 57764 Mirror.CompilerSymbols.csproj
-a---- 2023/9/11 16:44 58494 Mirror.Components.csproj
-a---- 2023/9/8 13:53 52899 Mirror.Components.Player.csproj
-a---- 2023/9/11 16:44 63345 Mirror.csproj
-a---- 2023/9/11 16:44 59453 Mirror.Editor.csproj
-a---- 2023/9/11 16:44 62697 Mirror.Examples.csproj
-a---- 2023/9/8 13:53 57060 Mirror.Examples.Player.csproj
-a---- 2023/9/8 13:53 57463 Mirror.Player.csproj
-a---- 2023/9/11 16:44 56183 Mirror.Transports.csproj
-a---- 2023/9/8 13:53 50661 Mirror.Transports.Player.csproj
-a---- 2023/9/11 16:44 57772 NativeGallery.Editor.csproj
-a---- 2023/9/11 16:44 55606 NativeGallery.Runtime.csproj
-a---- 2023/9/8 13:53 50028 NativeGallery.Runtime.Player.csproj
-a---- 2023/9/11 16:44 57764 NativeShare.Editor.csproj
-a---- 2023/9/11 16:44 55403 NativeShare.Runtime.csproj
-a---- 2023/9/8 13:53 49827 NativeShare.Runtime.Player.csproj
-a---- 2023/8/24 12:47 373 README.md
-a---- 2023/9/11 16:44 56038 SFB.csproj
-a---- 2023/9/8 13:53 50620 SFB.Player.csproj
-a---- 2023/9/11 16:44 57538 SimpleWebTransport.csproj
-a---- 2023/9/8 13:53 51941 SimpleWebTransport.Player.csproj
-a---- 2023/9/11 16:44 56430 Telepathy.csproj
-a---- 2023/9/8 13:53 50843 Telepathy.Player.csproj
-a---- 2023/9/11 16:44 58657 UniGPT.csproj
-a---- 2023/9/11 16:44 59755 UniGPT.Editor.csproj
-a---- 2023/9/8 13:53 52720 UniGPT.Player.csproj
-a---- 2023/9/16 23:11 6691 UniGPT.sln
-a---- 2023/9/11 16:44 56564 Unity.Mirror.CodeGen.csproj
Assets文件夹是资产文件夹,模型、脚本都在里面。
Build文件夹是打包存放的文件夹,比如Android的APK,Windows的EXE等。(这个看个人习惯,毕竟打包路径是可以自定义的,一般规范是Build),可以从备份中忽略。
Library文件夹,这非常的重点,这个文件夹是存放本机一些缓存的地方,比如你的Package缓存、场景缓存什么的。你说你备份要它何用?这玩意一个机器一个样,换到别的机器,这Library文件夹里有相当一部分要重新import。哪怕就是本机用,不涉及到协作,脚本啥的搞砸了,直接把Assets文件夹里的对应内容替换不香吗?所以请从备份中忽略,我保证,你这原本备份的大小至少减了一半。
Logs文件夹就不用说了,存放日志的地方,忽略掉。
obj是调试文件夹,也忽略。
Packages就是存放工程用到的Package的列表(指Unity Package Manager)。
ProjectSettings就不用说了,工程配置文件。
Temp,顾名思义,直接忽略。
UserSettings,一般都是编辑器布局那些玩意,这个你随意。
其他留着就可以啦。
版本控制
我估计看到这的朋友一定是受够了上文中的笨拙备份方式,毕竟每次备份就相当于全量备份。
既然想避免全量备份,肯定少不了版本控制系统。
目前有两大版本控制系统,Git和SVN。
SVN是传统的CVS,也是很多前辈入坑版本控制的首选(也是美术人员的首选),毕竟你只要操心两件事,checkout和commit就完了。目前最好用的客户端是小乌龟TortoiseSVN。它嵌入到你的Windows资源管理器,高度契合用户的Windows使用习惯。但是缺点也很明显,笨拙。
一个是第一次checkout时间会很漫长(包括第一次传工程,毕竟它不压缩),另一个是切分支麻烦。
什么时候你会用到分支?比如你要开发一个新功能,一般一个新功能就是一个分支,主分支是目前的稳定版本(或者你理解成大版本、小版本的关系)。SVN说白了就是开一个分支相当于完整地checkout一个工程副本出来,可想而知。
那么有没有软件改善呢?有,那就是Git。
Git这个东西从Linux过来的,发明人我想大家都知道是谁,那个暴躁老哥Linus。Git这个名字如果你看过百科的话,它的寓意是愚蠢的人。这也和它的分布式理念有关,Linus认为所有人不可能按照规则走,所以一定要自己有个人的版本,这样避免一个人搞砸连累其他人。(这也说明SVN是中心式)
Git的传输也是压缩过的,所以很快,而且不太占地方。
Git另一大特点就是指针,你工程里的每个文件以及改动都有指针对应,所以切分支这个事对于Git来说就是把指针改一下的事情,所以非常快。
当然缺点就在于上手比较难,我实习第一天就干出来了force push(切分支pull的时候出冲突了,然而不知道怎么解决冲突),把其他人的改动都干没了。其次就是它的习惯和Linux密不可分,如果你不熟悉Linux,那么上手也有点困难,毕竟它涉及到SSH这个东西,包括搭建起来一个服务器也是。(如果你用Github、Gitee托管,那当我没说,我也推荐新手先用这些公共的源代码托管平台入门,但日后还得学自己怎么搭建。)
但目前主流都是git,所以建议是早日投入git怀抱,其实也不难,只要你能想明白树和树干的关系就好了。然后就是耐心点,多沟通,解决冲突。
git的客户端就很多了,GitExtension、Fork、SourceTree等等,找一个你看着顺眼的即可。