我們的項目使用SVN管理。這幾天遇到了幾個問題,攻克了一下。順便做了一個總結。
1.關於使用SVN管理unity項目的一些設置和說明
首先在unity中進行兩部操作:Edit->ProjectSettings->Editor菜單。選擇Verion Control Mode 為VisivaleMeta File。選擇Asset SeriaLization Mode 為ForceText。第一步選擇外部版本號控制可見Meta文件,這樣子會為Asset目錄以下每一個資源創建一個.Meta文本文件,來記錄unity所須要的重要信息。
重要在哪里。后面會看到。第二步是由於unity大部分文件都是二進制存儲的,會頻繁導致莫名其妙的沖突,會帶來巨大的數據量。不能合並,另一個優點,在blame的時候比較清晰直觀。
而能夠merge場景帶來的方便的無可計量的。文章的第二第三點環繞這個兩個設置做了具體說明。
以下先談談SVN文件夾的創建。Window下新建的unityproject一般文件夾例如以下:
這里我們須要關心的僅僅有兩個目錄:Assets和ProjectSetting。前者不用多說。后者保存一些setting文件tag layerphysics等等也是必要的。而Library不過導入資源的一個緩存,網上有說法要保留各種manager文件之類,事實上不是必需的。
是剩下的都是mono或者VS產生的不用關心的。
所以正式項目一般都是本地做好須要SVN保存的兩個目錄,然后上傳到SVNserver,這樣能夠在保證不影響工作的情況下把unityproject的最小量保存。
2.兩個問題:預設腳本丟失和文件移動
前面常常會出現這種情況:我做好了一個prefab。包含gameobject和掛在上面的腳本,上傳prefab和cs文件到SVN,但是別人pull下來project后發現你這個prefab的腳本是missing的。這個是無比讓人頭疼的,又一次拖一遍的工作量是巨大的,並且又一次設置腳本參數也是一件非常頭疼的事情。這個問題原因就在於這就是前面提到的meta文件。Meta文件中有個重要的東西就是guid,guid是文件唯一標示,文件中的關聯關系都是基於guid而不是基於文件名稱和文件路徑的。當一個新文件創建之后,unity會自己主動給它生成一個guid。
假設沒有上傳meta,所以兩個project的guid不同,則關聯關系自然找不到。
所以我們也必須把相應的meta文件上傳。當然,假設願意解析meta文件,然后直接改動guid就是更好的做法了。當然相對的也easy出錯。
相同的。當移動或重命名資源時。確保你也對應的移動或重命名了meta文件。當腳本文件內容發生變化的時候,實際上guid是不會發生變化的。並且unity事實上並不基於文件內容增量變化的版本號管理。而是覆蓋式的。
所以官方文檔提到文件的移動的時候也特別小心翼翼,直接在unity中操作是最好的方式。這里特別要說明的是git和SVN的差別,在unity中新建的文件,git會默認在本地庫給你找出來,然后讓你提交。而SVN則不會。須要你手動的add。假設沒有選擇顯示meta,就悲劇了。
這里就是上文提到Verion ControlMode選擇可見meta的重要性了。
3關於場景的merge
前面我們提到了我們讓資源序列化為text。相同的對一個場景進行改動。
A添加一個怪物,B添加了一棵樹。
A先進行提交,B則必須進行merge。打開場景會告訴你有沖突,場景中什么都沒有。
打開場景的文本格式,由於我們之前選擇用text來存儲資源,這時候的優點就來了。文件的text格式應該是這種:
Mine:
Middle:
Theirs:
Ok,這個顯而易見了。具體的XXXX內容有興趣的話能夠具體的看看,可是我想。大多數的基於場景的merge應該僅僅合並不改動吧。所以說,對場景的改動之前還是團隊內部要協商好,場景的merge費事並且不討好。
也是剛用SVN管理unity項目,所曾經面兩個問題還都被我遇到了。所幸涉及的反復工作量不大。上論壇的時候有看到這樣一句話“用一個人當作SVN管理員。
全部東西都是通過這個管理員提交。
其余人僅僅能下載(沒提交權限)。
改動的全部東西全部給管理員整合”。事實上也認為挺不錯的,特別是項目大起來后。涉及美術策划和程序交互的時候,這個管理員既整合又優化,能夠解決大量的合作問題。對項目非常有優點。
希望對用unity工作的團隊有所幫助。