Unity 3D ve Version Control Sistemi (SourceTree İle)

Yayınlandı: 20 Eylül 2016 yasirkula tarafından Oyun Tasarımı, UNITY 3D içinde

GÜNCELLEME (03.11.2019): git hooks ile başıboş .meta dosyalarının Git‘e eklenmesini engellemek açıklandı.

NOT: Bu ders SourceTree‘nin kullanımından ziyade, Unity’de Version Control sistemi kullanmak için neler yapmanız gerek onları anlatmakta. Eğer Version Control ilginizi çekmeyen/ihtiyacınız olmayan bir şeyse bu dersi atlayabilirsiniz.

Hepinize merhabalar,

Bu derste Unity ile SourceTree‘yi beraber kullanırken yapmanız gereken/tavsiye edilen ayarlardan ve Unity’nin Smart Merge isimli yardımcı programının kurulumundan bahsedeceğim. Eğer daha önce bir version control sistemi kullanmadıysanız dersi anlamakta güçlük çekebilirsiniz, bilginize.

Belki bildiğiniz üzere, birden çok kişinin aynı anda üzerinde çalıştığı projelerde, düzenli/kontrollü bir çalışma ortamı için genellikle bir version control sistemi kullanılır. Bu yaz yaptığım staj esnasında ben de bir arkadaşımla beraber bir Unity projesi üzerinde çalıştım ve version control’ü SourceTree+Bitbucket ile sağladık. Ne yalan söyleyeyim çok da memnun kaldık çünkü yaptığımız değişikliklerin bir kısmını kontrollü bir şekilde geri almak zorunda kaldığımızda ya da oyunun birkaç gün önceki versiyonu ile mevcut versiyonunu kıyaslamak istediğimizde bunu yapmak gerçekten de çok kolay oldu.

O halde hazırsanız başlayalım!

Projeyi Oluşturmak

İlk iş olarak Unity projemizi SourceTree’ye tanıtalım. Burada iki seçeneğimiz var: ya yeni bir proje oluşturacağız ya da Bitbucket üzerinde var olan bir projeyi bilgisayarımıza klonlayacağız.

1. Yeni Bir Proje Oluşturmak

Eğer yeni bir proje oluşturuyorsanız, projeyi oluşturduktan sonra projenin olduğu klasöre gidin (içerisinde Assets, Library, ProjectSettings vb. alt klasörlerin olduğu klasör). Şimdi Notepad’i açıp bu klasör içerisinde “.gitignore” adında bir metin dosyası oluşturun. Dikkat edin: bu metin dosyasının bir ismi yok ve uzantısı da “gitignore“. Şimdi bu “.gitignore” dosyasının içerisine şu komutları ekleyin ve dosyayı kaydedin (kaynak: https://github.com/github/gitignore/blob/master/Unity.gitignore):

/[Ll]ibrary/
/[Tt]emp/
/[Oo]bj/
/[Bb]uild/
/[Bb]uilds/
/[Ll]ogs/
/[Mm]emoryCaptures/

# Never ignore Asset meta data
!/[Aa]ssets/**/*.meta

# Autogenerated Jetbrains Rider plugin
[Aa]ssets/Plugins/Editor/JetBrains*

# Visual Studio cache directory
.vs/

# Gradle cache directory
.gradle/

# Autogenerated VS/MD/Consulo solution and project files
ExportedObj/
.consulo/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd
*.pdb
*.mdb
*.opendb
*.VC.db

# Unity3D generated meta files
*.pidb.meta
*.pdb.meta
*.mdb.meta

# Unity3D generated file on crash reports
sysinfo.txt

# Builds
*.apk
*.unitypackage

# Asset Store'dan indirilen paketlerle gelen .unitypackage'lari elleme
!/Assets/*.unitypackage

# Crashlytics generated file
crashlytics-build.properties

Bu, gereksiz dosyaların Version Control üzerinden senkronize edilmesini engelleyerek hem hızımızı hem de internet kullanımımızı optimize edecek.

Şimdi Unity’de Edit-Project Settings-Editor yolunu izleyin ve Inspector‘da açılan “Editor Settings“ten “Version Control” altındaki “Mode“u “Visible Meta Files“, “Asset Serialization” altındaki “Mode“u ise “Force Text” yapın. Artık projenizdeki asset’ler binary serialization yerine text şeklinde serialize edilecek ve hem yaptığınız değişiklikler SourceTree’de daha okunaklı bir şekilde görünecek hem de büyük bir dosyada yaptığınız ufak bir değişiklik için SourceTree tüm dosyayı tekrar server’a yüklemek zorunda kalmayacak, sadece yaptığınız ufak değişikliği dosyanın üzerine yazması yeterli olacak. İlaveten, Smart Merge için bu değişiklikleri yapmak zorundasınız da zaten.

Artık projeyi SourceTree’ye ekleyebiliriz. Bunun için SourceTree’de File-Clone/New yolunu izleyip gelen pencereden “Create New Repository“e tıklayın ve “Destination Path“ten projenin olduğu klasörü seçin (“Repository Type” kısmı “Git” olarak kalsın). Create butonuna basarak projeyi SourceTree’ye tanıtın. Dosyaları “Stage All” yapıp “Commit” de yaptıktan sonra artık local repository’niz kullanıma hazır!

Eğer proje üzerinde birden çok kişi çalışıyorsa veya projenin bir kopyasını internette tutmak istiyorsanız bu local repository’e bir web sunucusu (remote) tanıtmanız lazım. Bu aşamada biz Bitbucket kullanmıştık çünkü Bitbucket’ta projenizi ücretsiz bir şekilde private yaparak meraklı gözlerden saklama imkanınız bulunuyor. Siz de Bitbucket kullanmak isterseniz önce bir Bitbucket hesabı oluşturun ve ardından Bitbucket üzerinden Repositories-Create Repository ile yeni bir repository oluşturun. Ayarları dilediğiniz gibi yapıp “Create Repository” ile işlemi tamamladıktan sonra “Command line” altındaki “I have an existing project“e tıklayın:

1

Resimde görüldüğü gibi, oradaki kodun 2. satırını kopyalayın. Şimdi SourceTree’de sağ üstteki “Terminal“e tıklayın, konsol gelince boş bir yere sağ tıklayıp Yapıştır (Paste) yapıp kodu yapıştırın ve Enter ile çalıştırın. Artık konsolu kapatıp projeyi Bitbucket’a Push yapabilirsiniz:

2

2. BitBucket Üzerinde Var Olan Projeyi Klonlamak

Projeyi oluştururken bu derste bahsettiğim ayarları yaptığınızı varsayıyorum. Bu durumda tek yapmanız gereken SourceTree’den File-Clone/New yolunu izlemek ve buradaki “Clone Repository” altında yer alan “Source Path / URL“den Bitbucket’taki repository’nizi seçip “Destination Path“ten de projeyi üzerine klonlayacağınız boş bir klasör seçmek.

Smart Merge Kurulumu

Bir proje üzerinde birden çok kişi çalışırken bazen bir sahne veya prefab aynı anda birkaç kişi tarafından düzenlenebilmekte. Bu durumda projeyi Bitbucket üzerinde senkronize ederken genellikle conflict hataları alırız ve yapılan tüm değişiklikleri bir kişinin elle gözden geçirmesi gerekir ki bu gerçekten zahmetli bir şeydir. Unity, bu conflict’leri nispeten azaltmak için Smart Merge isimli bir yardımcı programla beraber gelmekte; ancak bu tool’un çalışması için ufak bir ayar safhası gerekmekte (kaynak: https://www.reddit.com/r/Unity3D/comments/39bdq5/how_to_solve_scene_conflicts_with_unitys_smart/).

İlk iş olarak SourceTree’de Tools-Options yolunu izleyip “Diff” sekmesine geçiş yapın. Burada “Merge Tool” olarak “Custom“u seçin. “Diff Command” kısmına “D:\Program Files\Unity\Editor\Data\Tools\UnityYAMLMerge.exe” yazın (Unity sizde farklı bir path’te kurulu ise o path’teki “Editor\Data\Tools\UnityYAMLMerge.exe“nin konumunu yazın). “Arguments” kısmına ise “merge -p $BASE $REMOTE $LOCAL $MERGED” yazın ve OK diyerek değişiklikleri kaydedin:

3

Smart Merge sadece scene ve prefab’lar üzerinde çalışmakta. Bunun dışında kalan dosyaları merge etmek için (fallback) dışarıdan bir merge programı kullanmak zorundayız. Bu noktada ben Perforce‘un p4merge uygulamasını kullanıyorum. Siz de bu programı kurmak için https://www.perforce.com/downloads/visual-merge-tool adresine gidip “P4Merge“i indirin:

4

Setup dosyasını açtıktan sonra sadece “Visual Merge Tool (P4Merge)“ü kurun:

5

Geriye son bir adım kaldı. Unity’nin kurulu olduğu yerdeki “Data\Tools\mergespecfile.txt” dosyasını açın ve aşağıda vurgulanan değişiklikleri/eklemeleri yapın (p4merge’in path’i sizde farklı ise sizdeki path’i yazın):

# On Windows %programs% is replaced with "C:\Program Files" and "C:\Program Files (x86)" there by resulting in two entries to try out
# On OSX %programs% is replaced with "/Applications" and "$HOME/Applications" thereby resulting in two entries to try out
 
unity use "D:\Program Files\Perforce\p4merge.exe" "%b" "%l" "%r" "%d"
prefab use "D:\Program Files\Perforce\p4merge.exe" "%b" "%l" "%r" "%d"
 
#
# Default fallbacks for unknown files. First tool found is used.
#
 
* use "D:\Program Files\Perforce\p4merge.exe" "%b" "%l" "%r" "%d"
 
# Apple File Merge

Şu aşamada Smart Merge’ün doğru bir şekilde kurulmuş olması lazım. Ancak gözlemlediğim kadarıyla maalesef ki Smart Merge otomatik olarak çalışmıyor, bir conflict esnasında elle çalışması gerekiyor. Diyelim ki SourceTree üzerinden bir işlem yaparken conflict çıktı ve merge işlemi gerçekleşemedi. Bu durumda yapmanız gereken şey, “Unstaged files” altındaki conflict yapan asset’lere sağ tıklayıp “Resolve Conflicts-Launch External Merge Tool” yolunu izlemek:

6

Bir süre bekledikten sonra ya işlem başarılı olacak ve bir hata mesajı almayacaksınız ya da Smart Merge de merge işlemini yapamayacak ve hata alacaksınız. Bu durumda mecburen conflict yapan dosyaları elle düzenlemek zorundasınız.

NOT: Eğer merge işlemi başarılı olursa conflict’li dosyanın orijinalini kaybetmemek için otomatik olarak “dosya ismi.orig” isminde “orig” uzantılı bir dosya oluşuyor. Ben bu dosyaya sağ tıklayıp “Remove” ile projeden siliyorum çünkü merge işlemi başarılı olduğu için zaten değişiklikler asıl dosyaya yansıyor, eski halinin bir kopyasını tutmaya gerek duymuyorum.

BONUS: Başıboş .meta Dosyalarını Engellemek

Boş klasörleri Git otomatik olarak yoksayar, yani bu klasörler Git’e eklenmezler. Ancak Unity’nin bu klasörler için oluşturduğu .meta dosyası Git’e eklenir. Bu gibi bir durum, aynı proje üzerinde birden çok kişi çalışırken sıkıntı çıkarır çünkü boş klasöre sahip A kişisi klasörün .meta dosyasını Git’e eklerken, bu klasöre sahip olmadığı için .meta dosyası Unity tarafından otomatik olarak silinen B kişisi ise, commit atarken .meta’nın silinmesini de Git’e commit’ler. A kişisi boş klasörü kendi bilgisayarından silene kadar bu döngü devam eder. Neyse ki bunun bir çözümü var!

  • Şu zip arşivini indirin: https://github.com/doitian/unity-git-hooks/archive/master.zip
  • Arşivin içindeki post-checkout, post-merge ve pre-commit dosyalarını, Git projenizin olduğu konumdaki .git/hooks klasörüne kopyalayın
  • Eğer Assets klasörünüz direkt Git projenizin olduğu konumda değilse (mesela GIT_PROJESİ_KONUMU/UnityProjesi/Assets konumunda ise), .git/config dosyasını Notepad ile açın ve Assets klasörünün konumunu oraya şu şekilde ekleyin:
[unity3d]
	assets-dir = UnityProjesi/Assets
  • Artık başıboş bir .meta dosyasını Git’e commit’lemeye çalışınca şöyle bir hata alacaksınız (bu hatayı alan kişi, commit atabilmek için o boş klasörü silmek zorunda):
Meta file `Assets/BosKlasor.meta' is added, but `Assets/BosKlasor' is not in the git index.
Please add `Assets/BosKlasor' to git as well.

Bu dersin de burada sonuna geldik. Bir sorun yaşarsanız önce sorunu internette aramayı deneyin çünkü version control sistemi konusunda ben de acemi sayılırım. İlaveten, eğer SourceTree nasıl kullanılır bilmiyorsanız internetten tutorial izleyerek/okuyarak Commit/Push/Pull/Merge/Checkout vb. nedir/nasıl kullanılır araştırmanızı şiddetle öneririm.

Bir sonraki derste görüşmek üzere!

yorum
  1. Eren ALKAN dedi ki:

    Hocam sizce github destkop mu iyi SourceTree mi?

Cevap Yazın

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.