ウディタでオンラインアップデートを導入する方法

皆様こんにちは、くろくまです。今回は「日雇い勇者」に搭載した「オンラインアップデート」をどのように作ったかをメモしておきます。

ウディタの「ダウンロード機能」について

オンラインアップデートを実装するにあたって使ったのはウディタのイベントコマンド「ダウンロード」です。デフォルトでは表示されていないので気づかない方も多いかと思います。これは指定したURLにアクセスして、そこからファイルをダウンロードできるというそのものズバリな機能です。

まず初めに、この「ダウンロード」コマンドを表示させましょう。表示させる方法は「オプション」→「エディターオプション」と進んで「上級者向けコマンドを使用する」にチェックを入れるだけです。上手くいけばイベントコマンドウィンドウの最後に「ダウンロード」が表示されるはずです。

オンラインアップデートの仕組み

それではオンラインアップデートの仕組みを見ていきましょう。

ファイル構成

アップデートの際にサーバーから取得するファイルは次の2種類です。

  • version.txt…バージョン情報を記載
  • BasicData.wolf等のファイル…ゲームデータ作成時に「暗号化フォルダを限定する」にすると、フォルダごとに分かれた暗号化ファイルが作成されます。日雇い勇者ではそうやって作った暗号化ファイルのうち、BasicData.wolfとMapData.wolfをダウンロードする仕様にしてあります。

アップデートまでの主な手順

上記を踏まえると、大まかな手順は下記のとおりです。

  1. サーバーにあるversion.txtにアクセスし、ダウンロードして読み込む。
  2. ゲームフォルダ内の現行のversion.txtを読み込み、1.と比較する。
  3. 最新版が出ているならBasicData.wolf等のファイルをダウンロードし、「Data/_NetDownloadData」内に保存する。そうでなければ「ゲームは最新版です」と表示させる。
  4. 3.で最新版をダウンロードした場合は一旦ゲームを終了させる。再起動すると_NetDownloadData内のファイルが自動的に現行のファイルに上書きされる。
  5. これで完了。

補足ですが、ダウンロード機能では「Data/_NetDownloadData」に保存すると、ゲームを再起動したときにそのフォルダ内のデータが自動的にDataフォルダに移動して上書きされるというのがあります。これによりゲーム起動中に直接ファイルを上書きしなくて済みます。

サーバーの選定

さて、手順が分かったところでサーバーの選定に入ります。というのは、オンラインからデータをダウンロードするということはサーバーに最新のデータをアップロードしておかなければならないからです。一体どのサーバーを選べばいいのでしょうか?

サーバーというとホームページ用のレンタルサーバーが思い浮かびますが、これはファイル置場としての利用がNGの場合が多いのでダメです。そこで使うのがオンラインストレージです。これも色々な種類があって使えたりNGだったりしますが、結論から言うと日雇い勇者では「Googleドライブ」を使っています。

なぜGoogleドライブか?

Googleドライブを選定した理由はいくつかあるのですが、ウディタでダウンロードするうえで最も重要な点として挙げられるのが「直リンクができる」ことです。ウディタはファイルを直接ダウンロードすることしかできないので、直リンクできないストレージサービスではダウンロードが行えません。その点Googleでは直リンク可能なためオンラインアップデートに利用することができます。

それからもう一つはファイルの保存期間です。すぐに消去されてしまうようでは困りますが、Googleの場合は無期限なので安心です。

Googleドライブ側の設定

Googleドライブにアップロードしたファイルはデフォルトでは非公開なので、設定を変更してゲームからアクセスできるようにする必要があります。

変更方法はドライブ上のファイルを右クリックして「共有」から「アクセスできるユーザ」の「変更」をクリックし、設定を「オフ」から「オン:リンクを知っている全員」にします。

こうするとファイルを右クリックしたときのメニュー「共有可能なリンクを取得」からダウンロード可能なURLが取得できます。…が、これは直リンク可能なURLではないので少し変更する必要があります。

例えば、取得したURLは「https://drive.google.com/open?id=○○○」のようになっていると思いますが、これを「https://drive.google.com/uc?id=○○○」のように変更します。これで直リンク可能なURLを取得することができました。

アップデート用コモンの作成

あとは先述の手順通りにコモンを組めば完了です。実際のコモンは下記の通り。

■変数操作: CSelf20[基本ピクチャ番号] = 200 + 0 
■変数操作: CSelf21[テキストX] = 320 + 0 
■変数操作: CSelf22[テキストY] = 280 + 0 
▼ 現在のバージョンを取得
■文字列操作:CSelf6[現在バージョン文字列] =<ファイル内容読込> "Data/version.txt"
■変数操作: CSelf11[現在バージョン] = CSelf6[現在バージョン文字列] + 0 
■文章:現在のバージョンは「\cself[6]」です。\n最新バージョンを確認します。
■ピクチャ表示:CSelf20[基本ピクチャ番号] [中心]文字列[確認中…] X:CSelf21[テキストX] Y:CSelf22[テキストY] / 0(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 100% / カラー R[100] G[100] B[100]
▼ 最新バージョンの情報をダウンロード
■ダウンロード:URL[ https://drive.google.com/uc?id=〇〇〇 ]<ウェイト> > [ CSelf5[最新バージョン文字列] ]に格納
■条件分岐(変数): 【1】 Sys48:[読]ネット/状態 -1失敗 0通信中 1終了 が 1 と同じ 
-◇分岐: 【1】 [ Sys48:[読]ネット/状態 -1失敗 0通信中 1終了 が 1 と同じ ]の場合↓
 |▼ 取得成功
 |■変数操作: CSelf10[最新バージョン] = CSelf5[最新バージョン文字列] + 0 
 |■ピクチャ消去:CSelf20[基本ピクチャ番号] / 0(0)フレーム
 |■条件分岐(変数): 【1】 CSelf10[最新バージョン] が CSelf11[現在バージョン] 超 
 |-◇分岐: 【1】 [ CSelf10[最新バージョン] が CSelf11[現在バージョン] 超 ]の場合↓
 | |▼ 新しいバージョンがあったらダイアログ表示
 | |■文章:新しいバージョン「\cself[10]」があります。\nダウンロードしますか?
 | |■文章選択肢:/ 【1】はい / 【2】いいえ 
 | |-◇選択肢:【1】 はい の場合↓
 | | |■文章:データのダウンロードを開始します。
 | | |■ピクチャ表示:CSelf20[基本ピクチャ番号] [中心]文字列[ダウンロード中…] X:CSelf21[テキストX] Y:CSelf22[テキストY] / 0(0)フレーム / パターン 1 / 透 255 / 通常 / 角 0 / 拡 100% / カラー R[100] G[100] B[100]
 | | |■ダウンロード:URL[ https://drive.google.com/uc?id=〇〇〇 ]<ウェイト> 保存先[ Data/_NetDownloadData/BasicData.wolf ] 
 | | |■ダウンロード:URL[ https://drive.google.com/uc?id=〇〇〇 ]<ウェイト> 保存先[ Data/_NetDownloadData/MapData.wolf ] 
 | | |■ピクチャ消去:CSelf20[基本ピクチャ番号] / 0(0)フレーム
 | | |■条件分岐(変数): 【1】 Sys48:[読]ネット/状態 -1失敗 0通信中 1終了 が 1 と同じ 
 | | |-◇分岐: 【1】 [ Sys48:[読]ネット/状態 -1失敗 0通信中 1終了 が 1 と同じ ]の場合↓
 | | | |■文字列操作:CSelf5[最新バージョン文字列] =<を→のファイルに出力> "Data/version.txt"
 | | | |■文章:最新版のダウンロードが\n完了しました。\n一旦ゲームを終了します。
 | | | |■ゲーム終了
 | | | |■
 | | |-◇上記以外
 | | | |■文章:データのダウンロードに失敗しました。
 | | | |■
 | | |◇分岐終了◇
 | | |■
 | |-◇選択肢:【2】 いいえ の場合↓
 | | |■
 | |-◇キャンセルの場合
 | | |■
 | |◇分岐終了◇
 | |■
 |-◇上記以外
 | |▼ 既に最新版の場合
 | |■文章:確認が終わりました。\n現在のバージョンが最新バージョンです。
 | |■
 |◇分岐終了◇
 |■
-◇上記以外
 |▼ 取得失敗
 |■ピクチャ消去:CSelf20[基本ピクチャ番号] / 0(0)フレーム
 |■文章:バージョンの確認に失敗しました。\nインターネットに接続されているかを\nご確認ください。
 |■
◇分岐終了◇

今回は以上です。