# スマートマージ

> Use the UnityYAMLMerge tool to merge scene and prefab files in a semantically correct way.

**UnityYAMLMerge** ツールを使用して、シーンファイルとプレハブファイルをセマンティックに正しい方法でマージします。このツールはコマンドラインからアクセスでき、サードパーティのバージョン管理ソフトウェアでも利用できます。

## Unity でスマートマージの設定

バージョン管理のプロジェクト設定 (メニュー:**Edit** > **Project Settings** > **Version Control**) では、**Mode** フィールドで Perforce や PlasticSCM などのサードパーティ製バージョン管理ツールを選択すると、**Smart Merge** が表示されます。このメニューには以下のようなオプションがあります。

* **Off**: スマートマージのない環境設定でデフォルトのマージツールだけを使用します。
* **Premerge**: スマートマージを有効にし、クリーンなマージを受け入れます。クリーンでないマージは、base のプレマージされたバージョン、そのファイルの theirs バージョンと mine バージョンを作成します。次に、これらをデフォルトのマージツールで使用します。
* **Ask**: スマートマージを有効にしますが、競合が発生した場合、それを解決させるためのダイアログをユーザに表示します (これはデフォルトの設定です)。

## UnityYAMLMerge をサードパーティツールで使用するための設定

UnityYAMLMerge ツールは、Unity editor が同梱されています。 Unity が標準の場所にインストールされていると仮定すると、UnityYAMLMerge へのパスは以下のようになります。

```
C:\Program Files\Unity\Editor\Data\Tools\UnityYAMLMerge.exe

or

C:\Program Files (x86)\Unity\Editor\Data\Tools\UnityYAMLMerge.exe
```

上は Windows用。

```
/Applications/Unity/Unity.app/Contents/Tools/UnityYAMLMerge
```

上は Mac OSX 用 (このフォルダーにアクセスするには、Finder から *Show Package Contents* コマンドを使用します)。

UnityYAMLMerge には、どのように未解決のコンフリクトまたは未知のファイルを続行するかを指定する、デフォルトのフォールバックファイル (Tools フォルダーでも mergespecfile.txt と呼ばれます) が同梱されています。また、これにより、ファイル拡張子に基づいて自動的にマージツールを選択しない (例えば、git のような) バージョン管理システムのための主要なマージツールとして使用できるようになります。もっとも一般的なツールは、すでにデフォルトで mergespecfile.txt にリストされていますが、新しいツールや変更オプションを追加するために、このファイルを編集することができます。

コマンドラインからスタンドアロンツールとして UnityYAMLMerge を実行することができます (引数なしで実行すると、全機能を参照できます)。一般的なバージョン管理システム用の設定方法を以下に説明します。

### P4V

1. Preferences > Merge に移動します。
2. *Other application* を選択します。
3. *Add* ボタンをクリックします。
4. 拡張子フィールドに `.unity` と入力します。
5. Application フィールドに、UnityYAMLMerge ツールへのパスを入力します（上記参照）。
6. Arguments フィールドに `merge -p %b %1 %2 %r` と入力します。
7. Save をクリックします。

次に、同じ手順に従って `.prefab` 拡張子を追加してください。

### Git

`.git` または `.gitconfig` ファイルに以下のテキストを追加します。

```
	[merge]
	tool = unityyamlmerge

	[mergetool "unityyamlmerge"]
	trustExitCode = false
	cmd = '<path to UnityYAMLMerge>' merge -p "$BASE" "$REMOTE" "$LOCAL" "$MERGED"
```

### Mercurial

`.hgrc` ファイルに以下のテキストを追加します。

```
	[merge-patterns]
	**.unity = unityyamlmerge
	**.prefab = unityyamlmerge

	[merge-tools]
	unityyamlmerge.executable = <path to UnityYAMLMerge>
	unityyamlmerge.args = merge -p --force $base $other $local $output
	unityyamlmerge.checkprompt = True
	unityyamlmerge.premerge = False
	unityyamlmerge.binary = False
```

### SVN

`~/.subversion/config` ファイルに以下を追加します。

```
	[helpers]
	merge-tool-cmd = <path to UnityYAMLMerge>
```

### TortoiseGit

1. Preferences > Diff Viewer > Merge Tool に移動し、**Advanced** ボタンをクリックします。
2. ポップアップ画面の拡張子フィールドに `.unity` と入力します。
3. **External Program** フィールドに次のように入力します。

```
	<path to UnityYAMLMerge> merge -p %base %theirs %mine %merged
```

次に、同じ手順に従って `.prefab` 拡張子を追加してください。

### PlasticSCM

1. Preferences > Merge Tools に移動し、**Add** ボタンをクリックします。
2. **External** Merge Tool を選択します。
3. **Use with files that match the following pattern** を選択します。
4. `.unity` 拡張子を追加します。
5. 次のコマンドを入力します。

```
	<path to UnityYAMLMerge> merge -p "@basefile" "@sourcefile"  "@destinationfile" "@output"
```

次に、同じ手順に従って `.prefab` 拡張子を追加してください。

### SourceTree

1. Tools > Options > Diff に移動します。
2. Merge Tool ドロップダウンで **Custom** を選択します。
3. **Merge Command** フ​​ィールドに UnityYAMLMerge へのパスを入力します。
4. **Arguments** フィールドに `merge -p $BASE $REMOTE $LOCAL $MERGED` と入力します。

## mergerules.txt の設定

UnityYAMLMerge によるファイルのマージ方法をカスタマイズするには、mergerules.txt ファイルを設定します。これは、Unity インストールの `Editor/Data/Tools` フォルダーにあります。様々な設定オプションは以下の通りです。

### 配列

配列の設定セクションでは、キーの値を使用した "set" か使用しない "plain" 配列かを問わず、UnityYAMLMerge に指定したパスを配列として扱うように指示できます。すべての配列のデフォルトはハイブリッドモードで、いくつかの既知のヒューリスティックでマッチングを試みます。

* \<mode> は "set" または "plain" のいずれかです。

#### 例 (デフォルトの mergerules ファイルによる)

```
[arrays]
set *.GameObject.m_Component *.fileID
set *.Prefab.m_Modification.m_Modifications target.fileID target.guid propertyPath
plain *.MeshRenderer.m_Materials
plain *.Renderer.m_Materials
```

### Exclusions

除外の設定セクションでは、どのパスをマージから除外するかを示します。両方が変更されている場合、これらは競合として扱われ、ユーザーが入力できるように表示されます。

* \<mode> is one of "include", "exclude", "includeIfContains", "excludeIfContains"

#### 例 (デフォルトの mergerules ファイルによる)

```
[exclusions]
exclude *.MeshRenderer.m_Materials.*
exclude *.SpriteRenderer.m_Materials
exclude *.SpriteRenderer.m_Color
include *.ParticleSystem.InitialModule
exclude *.ParticleSystem.*
exclude *.ParticleSystem.InitialModule.*
#excludeDepend *.MonoBehaviour m_Script ^m_
excludeIfContains *.MonoBehaviour.* x y z
excludeIfContains *.MonoBehaviour.* r g b
```

### Comparisons

比較のセクションでは、Float 値間の微小な差について、ユーザー設定に基づいて無視することを計算に含めることができます。有効にすると、浮動小数点の比較が相対的に行われ、相対的な誤差が考慮されます。比較は以下の方法で設定できます。

* "float" \<比較する float 値> (これにより、イプシロンをマシンのイプシロンに近いデフォルト値に設定します)
* "float" \<比較する float 値> \<相対的な比較値と絶対的なカットオフ>
* "float" \<比較する float 値> \<相対的な比較値> \<絶対的な比較カットオフ>

相対的な比較値は、イプシロンと、float の相対誤差の大きさに応じた比較のスケール方法を決定します。絶対的な比較カットオフ値は、float の比較が絶対からゼロからの相対に切り替わるグラフ上のポイントを決定します。

**ノート**: 比較値は、float イプシロン (\~0.00000011921) から 1.0 までの間でなければなりません。

#### 例

```
[comparisons]
float *.Transform.m_LocalPosition.x 0.0000005
float *.Transform.m_LocalPosition.y 0.0000005
float *.Transform.m_LocalPosition.z 0.0000005
float *.Transform.m_LocalRotation.x 0.00005 0.001
float *.Transform.m_LocalRotation.y
float *.Transform.m_LocalRotation.z 0.00005 0.001
float *.Transform.m_LocalRotation.w
```
