【Git】【Unity】VRChatterのためのGit入門

この記事はVRChat Advent Calendar 2018の17日目の記事になります。

昨日の記事はじぇしか(@jscmla1118)さんによる、「[VRChatと外部世界を繋ぐインターフェース](https://qiita.com/jscmla1118/items/27e12a12ffc60e4617e4)」でした。

# はじめに

元々エンジニアとしてGitを使っていた私が、VRChatのアバターやワールドをGit管理するようになって便利だったので、今回はVRChat用のUnityプロジェクトをGit管理する方法や注意点について書いていきたいと思います。

# そもそもGitとは？

[こちら](https://qiita.com/satoshi1335/items/ead109412430a078feaa)に書かれている用に、分散バージョン管理システムというものですが、簡単に書くと、**作っているものの途中過程を随時記録して管理**できるシステムのことです。

作っているものの状態はリポジトリというデータベースに保存されていきます。

また、ファイルをリポジトリに記録させる事をコミットすると言います。

![スクリーンショット 2018-12-13 17.22.13.png](https://qiita-image-store.s3.amazonaws.com/0/123264/67e80255-d31a-937f-0b8e-b7c91d7b71d8.png)

# Gitでプロジェクト管理することの利点

作っているものの過程を随時記録できるので**簡単にプロジェクトのバックアップをとることができます**

そして、**リモートリポジトリ**を利用すれば、インターネットの**サーバー上にバックアップをアップロードして管理**することも簡単にできてしまします。

また、過程が別々に保存されているので、**過去のある時点で作ったものを取り出す**といったこともできます。

他にも、ブランチという機能を使ってそれまでに作ったものを残したまま別バージョンのものを作ることもできます。

# VRChatのプロジェクトをGit管理する時の注意点

VRChatのプロジェクトの中には購入した3Dモデルなどを含めている人が多いと思います。

こういったプロジェクトをローカルのリポジトリで管理している分には問題ないのですが、リモートリポジトリにアップロードする際の設定として**publicなプロジェクトとして管理しない**ようにしてください。

publicなプロジェクトとして管理してしまうと、他の人がそのプロジェクトをコピーできてしまうため、多くの販売アバターの利用規約にある**再配布禁止の規約に違反**してしまう恐れがあります。

また、そうでなくとも勝手に自分の作っているものをコピーされる事がありますので、**VRChatのプロジェクトはprivateで管理**するようにした方がいいと思います。

しかし、リモートリポジトリのホストとして有名な [GitHub](https://github.com/) は ~~privateリポジトリは有料で提供されています。~~ (学生であれば2年間は無料で使えます 詳しくは[こちら](https://qiita.com/mtfum/items/d8c06c9a28ce04d3043a))

(2019年10月1日追記) 現在はGithubのプライベートリポジトリも無料で使えるようになっています。

[Bitbucket](https://bitbucket.org/product) というリモートリポジトリのホストサイトではprivateリポジトリが無料で使用できるので、個人的にはこちらがおすすめです。 (以下のチュートリアルでもこちらを使っています)


もう一つの注意点として、VRChatのプロジェクトにはモデル、テクスチャ等の容量の大きいファイルが多く含まれています。

容量の大きいプロジェクトは最終的に操作に数十分かかるようになったり、リモートリポジトリの容量制限に引っかかってしまうことがあります。

目安としては、プロジェクトの `Assets` フォルダの容量が `500~600MB` ほどのプロジェクトが限界かと思います。

巨大なプロジェクトは [GitLFS](https://qiita.com/msh5/items/582c086311d3630563bc) というサービスを利用して管理したり、完全にローカルで管理するようにした方がいいでしょう。

# 実際にやってみよう！

では、実際にGitを使ってプロジェクトを管理してみたいと思います。

## SourceTreeのインストール

Gitを使う場合、コマンドライン(Windowsでいうコマンドプロンプトなど)上から使う方法と、GUIのソフトウェアから使う方法の2種類の使い方があります。

前者は素早く操作できるものの、コマンドラインの入力に慣れていなかったり、コマンドを覚えて入力する必要があり最初は大変なので、今回は直感的に操作できる後者のソフトウェアを使っていきたいと思います。

今回使用する「SourceTree」は、後者のGitクライアントソフトのひとつです。

詳しいダウンロードやインストール方法については [こちら](https://nelog.jp/sourcetree) のサイトを参考に行ってみてください。

## Unityプロジェクトの事前準備

### Gitで管理しないファイルを設定する

Unityのプロジェクトにはアセットから生成された Unity 内部の形式のデータを`Library`フォルダに保存していますが、この`Library`フォルダの容量がめちゃくちゃでかいです。

また、Unityのプロジェクトを開く際にこの`Library`フォルダは自動生成されるため、Gitで管理しないように設定してしまった方がいいです。

他にもGitで管理しなくていいファイルがいくつかあるため、そういったGitで管理しないファイルの情報をまとめた`.gitignore`というファイルを作成する必要があります。

Githubの[gitignoreテンプレートunity版](https://github.com/github/gitignore/blob/master/Unity.gitignore)が以下のようになっていますので、まずは適当なテキストエディタ(メモ帳など)に以下の設定をコピペしてUnityプロジェクトフォルダのすぐ下に`.gitignore`というファイルを作成してみてください。

(追記) Githubのgitignoreテンプレートだと一部のマテリアル設定がはがれてしまうという報告をいただいたので修正したものを以下に記載しています。

```shell-session:.gitignore
/[Ll]ibrary/*
!/[Ll]ibrary/metadata
!/[Ll]ibrary/assetDatabase3
/[Tt]emp/
/[Oo]bj/
/[Bb]uild/
/[Bb]uilds/
/[Ll]ogs/
/[Uu]ser[Ss]ettings/

# MemoryCaptures can get excessive in size.
# They also could contain extremely sensitive data
/[Mm]emoryCaptures/

# Asset meta data should only be ignored when the corresponding asset is also ignored
!/[Aa]ssets/**/*.meta

# Uncomment this line if you wish to ignore the asset store tools plugin
# /[Aa]ssets/AssetStoreTools*

# 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
*.aab
*.unitypackage

# Crashlytics generated file
Assets/StreamingAssets/crashlytics-build.properties

# Packed Addressables
/[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin*

# Temporary auto-generated Android Assets
/[Aa]ssets/[Ss]treamingAssets/aa.meta
/[Aa]ssets/[Ss]treamingAssets/aa/*
```

### Unityの設定

次にUnityプロジェクト側の設定を変更します。

管理したいプロジェクトをUnityで開き、メニューバーの`Edit`から`Project Settings -> Editor` を開きます。

すると`Inspector`に`Editor Settings`が出てくるので、その中の`Version Control`と`Asset Serialization`の項目を以下のように設定します。

![unity_editor_settings.png](https://qiita-image-store.s3.amazonaws.com/0/123264/43acfd30-9ccc-bba0-05e7-cb568567eac9.png)

これでプロジェクトをGitで管理する準備は完了です。

## リポジトリの作成

それではSourceTreeを起動してみてください。

![2018-12-15 (2).png](https://qiita-image-store.s3.amazonaws.com/0/123264/7402b61b-186f-5243-616c-641b4b39be53.png)

最初はこのような画面になっていると思うので、まず上のCreateボタンを押します。

![2018-12-15 (4).png](https://qiita-image-store.s3.amazonaws.com/0/123264/c03643ac-97a9-30c7-f562-95e596920436.png)

するとリポジトリを作成する画面が出てくるので、参照ボタンから管理したいプロジェクトのフォルダを指定して作成ボタンを押します。

![2018-12-15 (5).png](https://qiita-image-store.s3.amazonaws.com/0/123264/7624e7be-0e44-34f1-f3b4-f30ccd4a5c98.png)

このような画面が出てくるかもしれませんが、はいをクリック。

![ripository.png](https://qiita-image-store.s3.amazonaws.com/0/123264/e0d1b2a2-9aca-e3b7-de08-cf4951a49f4c.png)

すると、このような画面がでてきます。これでリポジトリの作成は完了です。

## プロジェクトをGit管理下に置く

画面の作業ツリーのファイルの横にある`全てインデックスに追加`ボタンを押すと、ファイルをGit管理する準備が整います。

![2018-12-15 (8).png](https://qiita-image-store.s3.amazonaws.com/0/123264/b94adb50-09d8-e09f-f32d-5d8ab5f87232.png)

そして、ファイルをGit管理下に置く(コミットする)前にコミットメッセージというのを書きます。

このコミットメッセージというのは後で自分が見返した時に、どんな変更を加えたのかというのを把握するために書くものです。

自分の名前の下の空欄にコミットメッセージを追加してコミットボタンを押します。

![commit.png](https://qiita-image-store.s3.amazonaws.com/0/123264/686c10f1-7525-836e-d75b-e1d302107be4.png)

すると、左のブランチタブに`master`という名前が追加されます。

![master.png](https://qiita-image-store.s3.amazonaws.com/0/123264/b17f0f58-ffb8-193e-5921-67dc17a509ad.png)

これでプロジェクトがGitで管理されるようになりました。

## Bitbucket にアップロードしてみる

では、このプロジェクトをBitbucketのリモートリポジトリにアップロードしてみましょう。

ブラウザで https://bitbucket.org/product を開きます。

![bitbucket.png](https://qiita-image-store.s3.amazonaws.com/0/123264/0957c0b8-e57e-0234-06ad-36eca9b9f11c.png)

右上の log in をクリックするとSource treeのインストール時に登録したAtlassianのアカウントが求められますのでAtlassianアカウントでログインします。

すると、下のような画面になります。

![remote_repo.png](https://qiita-image-store.s3.amazonaws.com/0/123264/5022be8b-2640-be78-50d6-deb8605e9639.png)

左のプラスボタンを押してCREATEメニューからリポジトリを選択します。

![make_repo.png](https://qiita-image-store.s3.amazonaws.com/0/123264/5bc37a66-ac99-54ed-599f-ef7106bffe8d.png)

リポジトリ名を入力し、これは非公開リポジトリですにチェックがついていることと、バージョン管理システムのラジオボタンにGitが選択されていることを確認してリポジトリの作成ボタンを押します。

![remote_repo2.png](https://qiita-image-store.s3.amazonaws.com/0/123264/69ced95e-bfab-9ee3-9732-eb1a37db26d6.png)

すると上のような画面に切り替わるので、赤枠で囲まれた部分をコピーします。

SourceTreeの方に戻り、右上のターミナルボタンを押します。

![terminal.png](https://qiita-image-store.s3.amazonaws.com/0/123264/62e434a5-df47-6069-fe52-7dd518ee26f6.png)

上のようなコマンドラインの画面が出てくるので、ここに先程コピーしたコマンドを貼り付けてEnterを押します。

SourceTreeに戻り、上のプッシュボタンを押すと以下のような画面になるので対象の下のチェックボックスにチェックを入れてプッシュボタンを押します。

![2018-12-15 (17).png](https://qiita-image-store.s3.amazonaws.com/0/123264/2ca34f11-0c80-9b83-b187-02623883e16d.png)

ブラウザの先程のページを更新して以下のようにプロジェクトファイルが見えるようになっていれば完了です。

![pushed.png](https://qiita-image-store.s3.amazonaws.com/0/123264/8362b7a5-33cc-97b2-e96f-e4f6816aa6d7.png)

## プロジェクトの更新

プロジェクトの更新方法についても説明します。

![2018-12-17 (2).png](https://qiita-image-store.s3.amazonaws.com/0/123264/def7448a-0177-d067-b48d-3140be1533e7.png)

Unity上で変更を加えた後にSourcetreeのブランチタブのmasterを開くとこのように表示されますのでこの変更をコミットしていきましょう。

![2018-12-17 (3).png](https://qiita-image-store.s3.amazonaws.com/0/123264/8f5e2bdd-702d-9993-a609-257a573cd8b3.png)

ファイルステータスタブの作業コピーに移動すると変更のあったファイルが表示されるので`全てインデックスに追加`ボタンを押します。

![変更.png](https://qiita-image-store.s3.amazonaws.com/0/123264/c28b0571-212d-499d-9f69-5cce9b81bfc5.png)

これでコミット準備ができたのでコミットメッセージを書いてコミットしましよう。
ここで、左下の変更をすぐにorigin/masterにプッシュするチェックボックスにチェックをしておくと、コミットが自動的にリモートリポジトリにも反映されるようになります。

![2018-12-17 (5).png](https://qiita-image-store.s3.amazonaws.com/0/123264/cc20b17f-0ed7-9d57-5f49-fc94504e9ffb.png)

ブランチ->masterに戻ると変更が反映されているのが分かると思います。

![変更remote.png](https://qiita-image-store.s3.amazonaws.com/0/123264/825455a6-bdc3-a9e7-5f20-bb7642e5550c.png)

リモートリポジトリにも反映させた場合はプロジェクトのリモートリポジトリページのコミットを見ると変更が反映されてるのが分かると思います。

これでプロジェクトの更新をGitへ反映させる作業は完了です。

# 終わりに

ここまでGitを使ってプロジェクトを管理し、リモートリポジトリへのアップロード、プロジェクトの更新の反映までを記載しましたが、Gitにはまだまだ沢山の機能があります。(私も全部把握できてないです)

他の機能やこういう時はどうするの？というTipsについては他のQiitaの記事や色んなWebサイトに載っていますので必要になったら調べてみるといいでしょう。

また、Gitに関する質問は私の方でも受け付けていますので質問のある方はTwitter [@sansuke05_vr](https://twitter.com/sansuke05_vr) の方まで連絡いただければ、分かる範囲でお答えします。

この記事をきっかけに少しでもGitを使う人が増えてもらえれば幸いです。

# 参考資料

[【Unity/Git】Unityでチーム開発をする(1) 概要と初期設定編](https://qiita.com/Sansuusetto/items/9d6965e688fb0dbf9d8b)

[Unity向け .gitignoreの設定について](https://qiita.com/nariya/items/97afba6b7b448920cdf0)