udm差分ファイル作成ツールを使った自動アップデート機能の作り方

# 1. はじめに
同人ゲームやフリーゲームを一度配布・頒布してみたものの、
バグ修正や追加要素を後から入れたいということは多々ありますよね。
このとき、すべてパッケージングしなおすのではなく、
差分更新するパッチプログラムを配ることが多いと思います。

このパッチプログラムをWebサイトに置いてTwitterなどで
宣伝・周知するのも一つの手ですが、
ユーザ側からすればダウンロードしてパッチ当てて、、、と対応するのは面倒です。

ユーザに最新のゲームやアプリケーションを利用してもらえるよう、
パッチのダウンロードと適用を自動化をしましょう。

## 1.1. 本記事で実現すること
* ランチャを経由してアプリケーションを実行
* ランチャにバージョンチェックやパッチのDL機能を追加
* パッチは「udm差分ファイル作成ツール」で作成

ランチャまわりは下記のような仕組みでの作り方を紹介します。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293957/d448b4a7-d436-e3c3-350c-6dbc11b599d7.png)



## 1.2. 想定対象者
* Windows向けのゲーム開発者
* Windows向けのアプリケーション開発者
* Steamなどのプラットフォームを使わない方

# 2. udm差分ファイル作成ツールとは
https://www.lameije.co.jp/products/udm
ざっくりいうと2つのフォルダの差分を抽出してパッチを作ることができるとても便利なツールです。

たとえばver1.0とver1.1の2つのディレクトリの差分を抽出して、ver1.0から1.1にアップデートできるパッチが作れます。
また、パッチはudmの専用形式だけではなく自己解凍形式(.exe)で出力することもできます。
![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293957/03a1db20-eb44-c962-8c03-b5aa145a1cd0.png)
図ではVer.0.20とVer.0.21の差分を指定


## 2.1. udm差分ファイル作成ツールのすごいところ
このツールのすごいところは、パッチの対象となるディレクトリをユーザに指定させるだけではなく、
.iniファイルやレジストリに書き込まれたパスを利用できるところにあります。

アプリケーション側でレジストリにディレクトリのパスを書きこんでからパッチプログラムを起動すれば、
ディレクトリをユーザに指定させることなくパッチの適用をすることができるのです。

![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293957/38f0fa4f-629e-1f8a-297b-cd9c0b598f76.png)
図ではレジストリのルートキー＝HKEY_CURRENT_USER、
サブキー＝Software\BrokenDesk\BlockAngMagic_C97、
キー＝ExePathに記述されたパスを差分適用の対象としている。
後述するランチャでこのキーに対象のパスを指定


# 3. 差分パッチを作ってみよう

udm差分ファイル作成ツールにはFree EditionとProfessional Editionがあります。
用途によって使い分けましょう。

| Edition              | 区分                     | 用途 |
|:---------------------|:------------------------|:------------|
| Free Edition         | フリーソフト              | 個人かつ営利を目的としていないアプリケーション。フリーゲームなど。   |
| Professional Edition | シェアウェア:2,000円(税抜)| 法人または個人でも営利を目的としているアプリケーション。有料頒布の同人ゲームなど。 |

## 3.1. アップデートの対象となるプログラムを作ってみる
サンプルとしては味気ないですが、
BATファイルといくつかのファイルで構成された簡単なアプリケーションもどきを用意します。

### プログラム v1.00
下記の3ファイルをディレクトリ「v1.00\app」に格納します。
version.txtはランチャから参照されるこのプログラムのバージョンです。

```text:app\app.bat
@echo off
cd /d %~dp0
echo program v1.00
type data.txt
pause
```

```text:app\data.txt
このプログラムはバージョン1.00です。
```

```text:app\version.txt
1.00
```

試しに実行してみると下記のような出力が得られると思います。

```
program v1.00
このプログラムはバージョン1.00です。
続行するには何かキーを押してください . . .
```

### プログラム v1.01
アップデートを想定した下記4ファイルをディレクトリ「v1.01\app」に格納します。
同じく、version.txtはランチャから参照されるこのプログラムのバージョンです。

```text:app\app.bat
@echo off
cd /d %~dp0
echo program v1.01
type data.txt
type data2.txt
pause
```

```text:app\data.txt
このプログラムはバージョン1.01です。
```

```text:app\data2.txt
v1.01で追加されたコンテンツです。
```

```text:app\version.txt
1.01
```

試しに実行してみると下記のような出力が得られると思います。

```
program v1.01
このプログラムはバージョン1.01です。
v1.01で追加されたコンテンツです。
続行するには何かキーを押してください . . .
```


## 3.2. udb差分ファイル作成ツールで自己解凍形式のパッチを作る
https://www.lameije.co.jp/products/udm
こちらからダウンロードしたら早速起動します。

### 3.2.1. 基本
まずは基本の設定を記述していきます。

* 差分ファイル名 : 生成されるパッチ名に影響します。verを含めたファイル名にしましょう
* 自己解凍差分ファイルの作成 : これのチェックを入れると自己解凍可能なexeファイルを生成します
* 差分適用前/適用後のバージョン : 今回はv1.00→v1.01なのでv1.00、v1.01と記入します
* それ以外は自由にいれましょう
![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293957/6aac2d38-9177-5a3d-b977-d2a1eb2e76a1.png)

### 3.2.2. 差分作成元ファイル
先ほど作成した2つのバージョンのディレクトリを指定します。
![図5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293957/d1bdab49-93b5-a869-7f71-2dff213c2ba3.png)

### 3.2.3. 差分適用フォルダ
自動アップデートで重要な設定箇所です。今回はレジストリを使ってみようと思います。

| 項目名 | 設定値 |
|-----------|-------------------|
| ルートキー | HKEY_CURRENT_USER |
| サブキー | Software\Hogehoge\Sample |
| キー | ExePath |

![図6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293957/a8c37e6a-223c-67a6-a431-7772d9e60703.png)

### 3.2.4. 差分適用時に表示するドキュメント
ここにはアップデート時の注意文言を表示できます。適当に入れてみます。
![図7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293957/2e7f0d2d-f2ad-7c52-f323-9399fa20424f.png)

### 3.2.5. オプション設定 - 高度なオプション
パッチ適用後にランチャを実行するように設定すれば、
ユーザはアップデート後そのまま遊ぶことができるようになります。
後述のランチャを「Launcher.exe」とするので、ここではLauncher.exeを指定します。
![図9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293957/742b4505-344b-2e94-687e-e709a2c548b0.png)


### 3.2.6. いったん保存
一旦ファイルを保存しましょう。「設定保存」をクリックすればよいです。
とりあえず「sample_patch_1.00_to_1.01.mup」とでもしておきます。

### 3.2.7. 差分ファイル作成 - 差分ファイルのビルド
ここまできたらあとはビルドするだけです。
「差分ファイルのビルドを開始」を押すとビルドが始まります。
![図8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293957/36df1a3d-ed00-4c77-9b3b-d6dd126e2bf2.png)

### 3.2.9. ファイルを確認
3.2.1.で指定したudmと同じディレクトリに「sample_patch_1.00_to_1.01.exe」というのができてるはずです。
これが自己解凍形式のパッチプログラムです。


## 3.3. Webサイトなどにパッチを配置しよう
拡張子が.exeの場合、サイトによっては置くことができないことがあるので、
拡張子を.datに変えておきます。
また、下記のようなバージョンファイルをdatと同じ場所に作成します。

```plaintext:1.00.txt
1.01
```

これはバージョン1.00の時は1.01が最新のバージョンである、ということを示しています。

### 3.3.1. Webサイトに配置
「1.00.txt」と「sample_patch_1.00_to_1.01.dat」の2つのファイルをWebサイトに配置します。
※もちろん、Webサイトに限らずAmazon S3等に配置してもOKです。


# 4. ランチャを作ろう
アプリケーションに組み込まず、ランチャを使うのには下記のメリットがあります。

* アプリケーション側に一切実装を持たせなくてよい
* Unityで作られたものだろうが、Unreal Engineだろうが、RPGツクールだろうが関係なく動く
* 別のアプリケーションでも設定を変えるだけで使いまわしが効く


## 4.1. 要件
ランチャーは下記の要件を満たすように作ります。

* 最新のバージョンがあるかどうかインターネットを経由して確認
 * 今回はWebサイトのファイルを見に行く
* 最新のバージョンがあれば、アップデートするかどうかをユーザーにゆだねる
* アップデートする場合は、サイトから先ほど配置したパッチをダウンロードする
* レジストリにアプリケーションのディレクトリを書きこむ
* ダウンロードしたパッチプログラムを起動する
* アップデートが不要の場合はアプリケーションを起動する

## 4.2. サンプル
実装量はそれなりにあるため、今回は実装例のサンプルを置いておきます。
https://github.com/ishin4762/LauncherSample

下記のパラメータを変更してビルドをしてみてください。

|名前|例|使い方|
|----|----|----|
|Title|`Launcher Sample`|ダイアログに表示するアプリケーション名|
|DownloadTitle|`Downloader`|ダウンロード時のダイアログに表示する名前|
|ExecuteFilePath|`app\app.bat`|実行するアプリケーションの相対パス|
|LocalVersionFilePath|`app\version.txt`|現在のバージョンを記述|
|PatchFilename|`sample_patch_{0}_to_{1}.exe`|パッチのファイル名。拡張子はexeにする。{0}には今のバージョン、{1}にはアップデート後のバージョンを指定|
|RegistryKey|`ExePath`|udm差分ツールのキー名に相当|
|RegistryPathKey|`Software\HogeHoge\Sample`|ルートキー＋サブキーを指定|
|ServerVersionFilePath|`https://hogehoge.jp/sample/{0}.txt`|サーバ側のバージョンファイル。{0}には今のバージョンを指定する。中身はアップデート後のバージョンを書く|
|ServerPatchFilePath|`https://hogehoge.jp/sample/sample_patch_{0}_to_{1}.dat`|サーバ側のパッチファイル。{0}には今のバージョン、{1}にはアップデート後のバージョンを指定||


## 4.3. ランチャを配置
bin/Release配下にできたLauncher.exeを「v1.00」「v1.01」のディレクトリに入れます。
これで作業は完了です。

<img width="40%" alt="図10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293957/b95eaadf-e474-86cb-c2b2-c99c42ddedd1.png">　　<img width="40%" alt="図11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293957/34a03c5d-5a55-ef2d-8e88-d27a9f2cd950.png">

<img width="40%" alt="図12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293957/90320d8d-a719-3c73-ca1b-fb8d152aaa91.png">　　<img width="40%" alt="図13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293957/1e05c36f-8891-cc91-204d-bf3f62c3f7ff.png">

「v1.00」のディレクトリごと圧縮して、これを公開しましょう。

# 5. 動作確認
v1.00ディレクトリを複製して、Launcher.exeを実行してみましょう。
正しく動くと思います。

![launcher_test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293957/b8883191-65ba-8407-d1cb-1b9b8a36ff11.gif)


# あとがき
* 自動アップデートのない同人ゲームを結構見るので、参考になればいいなと記事を書いてみました。
* Launcher.exe自身のアップデートを考えて、Launcher.exeもふくめた差分作成をした方がよいかもです。
    * 4.3. ランチャを配置 までやったあと、再度3.2.7.の内容を実行すればランチャを含めた差分パッチが作成できます。
* udm差分ファイル作成ツールは最新のバージョン2.3.2でWindows Vistaまでしか公式でサポートしてないので将来がやや不安。。。
* ファイルをアップロードしたら(もしくはGitやSVNのtag/branchの差分を見て)勝手に差分抽出してAmazon S3とかにパッチをアップロードしてくれるようなWebサービスって需要ありますかね…？