概要
1年程前に実装した内容のまとめ
最近まで実装の変更はあったが、下記で落ち着いた感じです。
一応、アプリのバージョンアップを考慮した設計にしたつもり。
開発環境の前提
- 更新リストを利用したAssetBundleの利用が前提
- バージョン管理にSubversionの利用を前提
- ブランチ毎にアプリのバージョンが異なる前提
設計
-
依存関係の取得
AssetBundleにするファイルの依存関係のファイルリストを取得し、そのファイルと.metaについてもリビジョンを取得
※ 依存関係はAssetDatabase.GetDependencies
にリストを渡すことで取得
更新するかは、最終の更新リストのリビジョンと照らし合わせる ※更新リストについては後述 -
リビジョンの取得方法
svn infoにある
Last Changed Rev: からファイルのリビジョンを取得する -
ビルド後の格納パス
ビルドしたファイルは下記のフォルダに格納する
[platform]/[アプリバージョン]/[リビジョン]/ファイル名
アプリバージョンは変更を考慮し、アプリバージョンとは別でナンバーリングした値を利用
例) Android/11/12345/hoge.prefab
気をつけること
WWW.LoadFromCacheOrDownloadのバージョンにリビジョンを利用した場合、 別ブランチ(異なるアプリバージョン)でのリビジョンの方が上のことがある。
更新リスト取得時に以前のアプリバージョンのAssetBundleを消す事で対処とする
※ WWW.LoadFromCacheOrDownloadのCRCの値にダミーを放りこむことで削除する
更新リストの管理
ビルド後、[platform]_ [アプリバージョン]_ [連番].csvを作成
- csvフォーマット
ファイル名,容量,リビジョン,CRC
※ アプリバージョンは前述のナンバーリングした値
※ 連番は更新リストの作成数
CRCの管理
- AssetBundleの更新の無い分については最終の更新リストから継続
- AssetBundle更新分はビルド時に収集していく
後処理
- ビルドが正常に完了した場合のみ、AssetBundleは別フォルダに格納して利用可能な状態にする
メモ
外部コマンドの結果を取得する場合に、取得出来ないバグがあるので下記で対応
static string systemCommand(string command, string args){
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = command;
p.StartInfo.Arguments = args;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardError=true;
p.StartInfo.RedirectStandardOutput = true;
p.Start();
//string output = p.StandardOutput.ReadToEnd();
string output = "";
while (p.StandardOutput.Peek() > -1)
{
output += p.StandardOutput.ReadLine() + "\n";
}
p.WaitForExit();
p.Close();
return output;
}