時代に翻弄されるエンジニアのブログ

ゲームプログラマをやっています。仕事やゲームや趣味に関してつらつら書きたいと思います。

iOS Unity OnDemandResources ことはじめ

f:id:tkymx83:20190205194819j:plain:w1000

オンデマンドリソーシーズ(OnDemandResources:ODR)をしっていますか?僕は今日知りました。

簡単に言うと、Appleにビルドを提出する段階で画像などのアセットをサーバーに登録しておき、アプリ内からリアルタイムに取得するという仕組みです。

今日はそんな OnDemandResources の機能を始めるにあたって概念的なことメモしたいと思います。

なお、OnDemandResourcesは iOS の機能です。Unity 上でもそれを利用することができると言うだけです。

f:id:tkymx83:20190205192934p:plain:w1000

リソースにタグ付をする

OnDemandResources を実現するにあたって、リソースにタグ付をします。具体的には画像のように、この画像は "image" だという形で決めていきます。

このタグを目印にアプリ上からはリソースのダウンロードを行います。アプリ上でタグを指定することでそのタグがついているリソースをダウンロードしてくるということです。

ゲームで言えば、ステージごとに違うアセットを使っている場合に役に立ちます。ステージ1の開始時点でステージ1のマップをとってくる。ステージ2ではまたステージ2のマップを取ってくるなどができます。

Unity では、アセットバンドルにタグをつけてダウンロードすることをおすすめします。

OnDemandResources とは、基本的にこれだけです。

Unity はスクリプト上でタグ付けを行う

OnDemandResourcesは基本的に iOS の機能ですので、Xcode上からは手動でタグ付などの設定ができます。しかし、Unity は基本的にXcode をそのまま扱うことはしないので、スクリプト上でタグ付をしていきます。

new UnityEditor.iOS.Resource( "textures", "Assets/ODR/textures" ).AddOnDemandResourceTags( "textures" )

上記のように、AddOnDemandResourceTagsを使用することで、タグ付けをできます。上記のコードは UnityEditor.iOS.Resourceの機能をつかい、"Assets/ODR/textures"フォルダ内の texturesのアセットバンドルタグを持つものに、textures と ODRのタグを打っています。

基本的に Unity では、Asset Bundle タグというものがあるので、それを利用してODR のタグをつけるのも良いと思います。

Prefetching Tags を利用してインストール時に選択ダウンロード

Prefetching Tags はアプリのインストール時に、ダウンロードするタグを指定することができます。この場合、アプリの容量にタグ付けしたリリースがそのまま乗ってくるのでサイズがかなり大きくなってしまいます。

しかし、近年はゲーム内ダウンロードを極力しない方向性で動いているため、これを利用することができるかもしれません。

OnDemandResourcesで Prefetching Tags を使った場合、アプリのアップロード時にすでにローカルにファイルがある場合は差分のみダウンロードすることができます。

Xcode上からは手動で設定できるのですが、Unity でこれを実現する方法はまだわかっていません。。。。
誰か教えて〜〜

使用していない場合はローカルから消える

これが一番大きい機能ですね。アプリ上から使用されないで一定日たったリソースはローカル上から排除されます。これによって、リソースの無駄を省くことができます。

逆を言うと、毎日使うものに関しては、毎度リソースをダウンロードすることになるので、通信量の無駄になります。なのでチュートリアルや期間限定のイベントなど、もう使用することのないリソースに対しては効果的です。

まとめ

OnDemandResources は便利な面が多いです。Unity 5.2 からあったそうで、知らなかったのでびっくりです。ただ近年にゲーム内ダウンロードを縮小しようと言う方向性には反しているので使うときは注意ですね。

リジェクトされるかも。。

参考資料を貼っておきます。


developer.apple.com

blogs.unity3d.com

docs.unity3d.com