Unity x Git === 心酸血淚史 === Jason Pan @ SITCON 2017 --- ### Who am I ? ---- Jason Pan 大同大學資訊工程系四年級 大同資訊創意研究社總務 https://github.com/jason8399 --- # 前情提要 ---- ### 在不斷的換題目迴圈中 ### 我們終於選定了題目<!-- .element: class="fragment" data-fragment-index="1" --> ### 要使用 Unity 製作 VR 遊戲<!-- .element: class="fragment" data-fragment-index="2" --> ### 但多人開發時就會需要用到 版本控制<!-- .element: class="fragment" data-fragment-index="3" --> ### 接下來就是噩夢的開始<!-- .element: class="fragment" data-fragment-index="4" --> --- # 工具介紹 ---- ### Unity 是一個遊戲引擎 ---- ### Unity 推薦使用的 VCS - Perforce<!-- .element: class="fragment" data-fragment-index="1" --> - Plastic SCM<!-- .element: class="fragment" data-fragment-index="2" --> ---- ### 都要錢 ---- ### Git 版本控制系統 --- # 悲劇是這樣發生的... Note: ---- ### 正常的 Git work flow - A 同學從 develop 開一個 branch<!-- .element: class="fragment" data-fragment-index="1" --> - B 同學從 develop 開一個 branch<!-- .element: class="fragment" data-fragment-index="2" --> ``` A---B---C A_student_branch / D---E---F---G develop \ H---I---J B_student_branch ``` <!-- .element: class="fragment" data-fragment-index="3" --> ---- - A 完成一個 feature 後 merge 回 develop branch - B 完成一個 feature 後 merge 回 develop branch<!-- .element: class="fragment" data-fragment-index="4" --> ``` A---B---C A student branch / \ D---E---F---G---H---I develop \ / H---I---J---- B student branch ``` <!-- .element: class="fragment" data-fragment-index="5" --> ---- Git 會自動 merge 若無法自動 merge 時就會... ---- # <p style="color: red;">CONFLICT!!!</p> ---- ### 看到 conflict 不用太擔心 打開你常用的 merge tool (e.g. vimdiff) 修改完後 存檔就可以就解決了 ---- # 輕鬆! ---- ### 但是當我打開 Unity Scene 檔案時... ---- ![](https://i.imgur.com/Yjeazug.png) Note: 圖片大小調整 ---- ![](https://i.imgur.com/4elFtKJ.png) ---- # 這時候我們"才"發現 Unity Scene 是以 binary 方式儲存(大哭 ---- ### 上網 Google 了一下 發現原來 [Unity 說明書](https://docs.unity3d.com/Manual/Versioncontrolintegration.html)有寫 <!-- .element: class="fragment" data-fragment-index="1" --> ---- ### 簡單三步驟 - 至 Edit->Project Settings->Editor<!-- .element: class="fragment" data-fragment-index="1" --> - <p>將 <b>Version Control Mode</b> 改為 <b>Visible Meta files</b></p><!-- .element: class="fragment" data-fragment-index="2" --> - <p>將 <b>Asset Serialization Mode</b> 改為 <b>Force Text</b></p><!-- .element: class="fragment" data-fragment-index="3" --> ---- ### 就可以把 Scene 從 Binary ### 轉為 YMAL 語法儲存 ---- ### 但是檔案也會跟著變大 ### 因為轉成文字檔了嘛 ¯\\\_\(ツ\)_/¯ <!-- .element: class="fragment" data-fragment-index="1" --> ---- #### 這樣就可以快快樂樂的 vimdiff 了! ![](https://i.imgur.com/2cBLt45.png) Note: 改圖[](https://i.imgur.com/CmSQYPx.png) ---- ### 那幾千幾萬行的 YAML 檔誰看得懂? ### 會不會解完 conflict Scene 就壞了?<!-- .element: class="fragment" data-fragment-index="1" --> --- ### Unity YAML merge tool 是 Unity 用來處理 merge YAML 的 tool 可以將 Scene 以及 Prefab 以正確的語法做 merge<!-- .element: class="fragment" data-fragment-index="1" --> Note: merge 原理 ---- ![](https://i.imgur.com/k4hyNTG.png) Note: ![](https://i.imgur.com/GBFZ74q.png) ---- ![](https://i.imgur.com/qqkC7Ot.png) ---- ### 有兩種 mode - Premerge - Ask ---- ### Premerge 會將沒有 conflict 的區塊做 merge 再交由使用者做選擇 ---- ### Premerge ![](https://i.imgur.com/hcspTv3.png) Note: ![](https://i.imgur.com/FtD1nzN.png) ---- ### Ask 只要有 conflict 就由使用者來決定使用的版本 ---- ### Ask mode ![](https://i.imgur.com/ZlmjxbL.png) Note: ![](https://i.imgur.com/EifDtgO.png) ---- ### 如何使用呢? ---- ### 在 .git/config 或 .gitconfig 加入這段 ``` [merge] tool = unityyamlmerge [mergetool "unityyamlmerge"] trustExitCode = false cmd = '<UnityYAMLMerge 的 path>' merge -p "$BASE" "$REMOTE" "$LOCAL" "$MERGED" ``` ---- ### 而這個 Tool 的 Path (for Windows): ``` C:\Program Files\Unity\Editor\Data\Tools\UnityYAMLMerge.exe or C:\Program Files (x86)\Unity\Editor\Data\Tools\UnityYAMLMerge.exe ``` ---- ### 而這個 Tool 的 Path (for macOS): ``` /Applications/Unity/Unity.app/Contents/Tools/UnityYAMLMerge ``` ---- ### 太快? ### 沒關係<!-- .element: class="fragment" data-fragment-index="1" --> ### <p>Unity <a href="https://docs.unity3d.com/Manual/SmartMerge.html">說明書</a>也有寫</p><!-- .element: class="fragment" data-fragment-index="2" --> ---- ### 當 Scene 或 Prefab merge 產生 Conflict 時 #### 下 git mergetool 呼叫 UnityYAMLmerge 來拯救你 ---- # 愉悅! ---- ### Windows 用戶會遇到一個問題 ---- ### Mac 有內建 FileMerge ### Windows 沒有內建 merge tool <!-- .element: class="fragment" data-fragment-index="1" --> ---- ### 執行完沒有視窗跑出來啊 # ಥ_ಥ ---- ### 1. 安裝 merge tool (e.g. kdiff3) ### 2. 去修改 Tools 資料夾中的 mergespecfile.txt<!-- .element: class="fragment" data-fragment-index="1" --> <h3>可參考<a href="https://gist.github.com/Ikalou/197c414d62f45a1193fd">這篇</a>做設定</h3><!-- .element: class="fragment" data-fragment-index="2" --> --- # 另一個故事是這樣的... ---- ### 同學 A 將素材加入專案內 ### git add 完也 commit ### 很開心地 push 出去 ---- ### 同學 B 說我沒有看到你新的 commit ### 同學 A 一看 log ``` remote: warning: Large files detected. remote: error: File giant_file is 123.00 MB; this exceeds GitHub's file size limit of 100 MB ``` ---- ## 素材檔案太大 push 被 reject ... ---- ### GitHub repo 限制 - 單一 repo 不超過 1GB<!-- .element: class="fragment" data-fragment-index="1" --> - 單一檔案 不超過 100MB<!-- .element: class="fragment" data-fragment-index="2" --> ---- ## Git LFS 可以將大型 binary 檔案交由遠端 server 儲存 在 repo 中使用 text pointer 指向 ---- ![](https://i.imgur.com/cT64g5E.png) <p style="font-size:10px">src:https://git-lfs.github.com/</p> ---- ### Pros - 減少 repo 空間 - 加快 clone 以及 fetch 速度 - 跟操作 git 沒有太大差別 ---- ### Cons 我想不太出來... ---- ### 如何使用呢 官網也有[教學](https://git-lfs.github.com/) 但是我還是要講(硬要<!-- .element: class="fragment" data-fragment-index="1" --> ---- ### Step 1. 下載 git-lfs 並安裝 然後在 terminal 下 git lfs install ---- ### Step 2. 輸入追蹤的檔案類型 git lfs track "*.psd" 且 讓 git 追蹤 .gitattributes git add .gitattributes Note: 在這邊 git lfs 會將相關設定寫入.gitattributes中 ---- ![](https://i.imgur.com/CI17NU6.png) ---- ### Step 3. Add 你的檔案 & Commit & Push ---- ## 就是這麼簡單 ---- ### GitHub 提供一般 Account 一個 repo - 1 GB LFS stroage - 1 GB bandwidth per month --- ### 趕快讓你們的 Unity 專案上 GitHub 吧 ---- # Thanks for your listening ---- # Q&A
{"metaMigratedAt":"2023-06-14T12:26:03.604Z","metaMigratedFrom":"Content","title":"Unity x Git","breaks":true,"contributors":"[]"}
    2409 views