iOS 用のプラグインをビルド
iOSのWWWリクエストをカスタマイズ

アプリケーションでの“アプリ内課金” の準備

本項では Apple の“StoreKit” API をゲームと連動させる方法についてはカバー していません 。ここでは プラグイン を通して“StoreKit” と連動ができていることが前提となっています。

Apple の “StoreKit” ドキュメントにより四つの 製品 を“アプリ内課金” で販売することができます:

  • コンテンツ
  • 機能
  • サービス
  • 購読

本項では最初のケースのみをカバーしていてダウンロード可能なコンテンツの考え方に、フォーカスします。AssetBundle はダウンロード可能なコンテンツとその使い方をカバーします。

iOS で使用するためにエクスポートする

ダウンロード可能コンテンツのためにプロジェクトを分けることはよいアイデアでメインアプリケーションと後からダウンロードするコンテンツを適切に分けられます。しかしオブジェクトにより参照されるすべての スクリプト はメインのメインの実行ファイルにも含まれる必要があります。アセットバンドルを作成するのに使用したプロジェクトには iOS をビルドターゲットにする必要があります。これはアセットバンドルファイルのコンテンツが iOS と他のプラットフォームで互換性がないためです。

アセットバンドルはエディタースクリプトを使用して作成します。次に簡単なサンプルを示します:

// C#
using UnityEngine;
using UnityEditor;

public class ExportBundle : MonoBehaviour {
    [MenuItem ("Assets/Build AssetBundle From Selection - Track dependencies")]
    static void DoExport() {
        string str = EditorUtility.SaveFilePanel("Save Bundle...", Application.dataPath, Selection.activeObject.name, "assetbundle");
        if (str.Length != 0) {
            BuildPipeline.BuildAssetBundle(Selection.activeObject, Selection.objects, str, BuildAssetBundleOptions.CompleteAssets, BuildTarget.iPhone);
        }
    }
}

// JS
@MenuItem ("Assets/Build AssetBundle From Selection - Track dependencies")
static function ExportBundle() {
    var str : String = EditorUtility.SaveFilePanel("Save Bundle...", Application.dataPath, Selection.activeObject.name, "assetbundle");
    if (str.Length != 0) {
        BuildPipeline.BuildAssetBundle(Selection.activeObject, Selection.objects, str, BuildAssetBundleOptions.CompleteAssets, BuildTarget.iPhone);
    }
}

このコードは ExportBundle という名前のファイルに保存し Editor という名前のフォルダーの配下に置く必要があります(すでにプロジェクトにない場合は新規作成します)。このスクリプトによりエディターの Assets メニューで “Build AssetBundle From Selection - Track dependencies” というメニューアイテムを追加します。

バンドルに含めたいコンテンツはプレハブの形式で準備する必要があります。プロジェクトビューからプレハブを選択してエディターの Assets メニューから Assets > Build AssetBundle From Selection - Track dependencies と選択します(すなわち、ExportBundle により追加されたメニューアイテム)。このコマンドにより保存ダイアログが表示されアセットバンドルファイルの名前と場所を選択します。

iOS でアセットをダウンロードする

注意: Apple 社はデータを書き込んでよい場所を変更するかもしれません。常に最新の Apple ドキュメントから自身のアプリケーションが適合していることを確認してください。次のアドバイスは 2013 年初めまでは問題ありませんでした。

WWWクラスを使用してアセットバンドルをダウンロードできます。送信が完了すると格納されていたアセットへアクセスできるようになります。アセットバンドルをダウンロードする際に推奨する方法は LoadFromCacheOrDownload メソッドです。次のコードサンプルにより実現方法を示します:

// C#
IEnumerator GetAssetBundle() {
    WWW download;
    string url = "http://somehost/somepath/someassetbundle.assetbundle";

    while (!Caching.ready)
        yield return null;

    download = WWW.LoadFromCacheOrDownload(url, 0);

    yield return download;

    AssetBundle assetBundle = download.assetBundle;
    if (assetBundle != null) {
        // Alternatively you can also load an asset by name (assetBundle.Load("my asset name"))
        Object go = assetBundle.mainAsset;
            
        if (go != null)
            Instantiate(go);
        else
            Debug.Log("Couldn't load resource");    
    } else {
        Debug.Log("Couldn't load resource");    
    }
}

// JS
function GetAssetBundle() {
    var download : WWW;
    var url = "http://somehost/somepath/someassetbundle.assetbundle";
    var download = WWW.LoadFromCacheOrDownload (url, 0);

    yield download;

    var assetBundle = download.assetBundle;
    if (assetBundle != null) {
        // Alternatively you can also load an asset by name (assetBundle.Load("my asset name"))
        var go : Object = assetBundle.mainAsset;
            
        if (go != null)
            Instantiate(go);
        else
            Debug.Log("Couldn't load resource");    
    } else {
        Debug.Log("Couldn't load resource");    
    }
}

ダウンロードされたアセットバンドルファイルは iOS アプリケーション Sandbox の Library フォルダーに格納されていてファイルに No Backup フラグが有効化されています。これが意味することは OS はこれらのファイルを誤って削除せず、これらのファイルは iCloud にバックアップされないということです。キャッシュサイズのリミット を低く抑えることで、アプリがデバイスのディスクスペースのすべてを確保してしまうことを防止すべきです。

もしより細かいところまで AssetBundle のキャッシュファイルを制御しないといけない場合、WWW ダウンロードを LoadFromCacheOrDownload ではなく new WWW(url) 経由で使用して、.NET ファイル API を使用してダウンロードされたファイルをディスク上で格納することができます。必要なファイルを Application.temporaryCachePath (OS によりクリーンされる Library/Caches) フォルダーまたは Application.persistentDataPath (OS によりクリーンされない Documents フォルダー) に保存することができます。これらのファイルの No Backup フラグを iOS.​​Device.SetNoBackupFlag 経由で有効化すべきであり、iCloud にバックアップされることを防止すべきです。

注意: No Backup フラグをセットしないと App Store 提出時にアプリ審査がリジェクトされるかもしれません。

保存したファイルにアクセスするには WWW オブジェクトを file:///pathtoyourapplication/Library/savedassetbundle.assetbundle という URL 形式で作成します:

// C#
string cachedAssetBundle = Application.temporaryCachePath + "/savedassetbundle.assetbundle"; 
System.IO.FileStream cache = new System.IO.FileStream(cachedAssetBundle, System.IO.FileMode.Create);
cache.Write(download.bytes, 0, download.bytes.Length);
cache.Close();

iOS.Device.SetNoBackupFlag(cachedAssetBundle);

Debug.Log("Cache saved: " + cachedAssetBundle);

// JS
private var cachedAssetBundle : String = Application.temporaryCachePath + "/savedassetbundle.assetbundle"; 
var cache = new System.IO.FileStream(cachedAssetBundle, System.IO.FileMode.Create);
cache.Write(download.bytes, 0, download.bytes.Length);
cache.Close();

iOS.Device.SetNoBackupFlag(cachedAssetBundle);

Debug.Log("Cache saved: " + cachedAssetBundle);

注意: Documents フォルダーからファイル読込みのテストをする際は file sharing を有効化します (Info.plist で UIFileSharingEnabled を true にすることで iTunes から Documents フォルダーにアクセスできます)。Documents のコンテンツは iCloud にキャッシュされるため、出荷バージョンにおいてアセットバンドルを格納すべき場所ではありません。詳細については Apple iOS ドキュメントの中の File System Basics を参照してください。

iOS 用のプラグインをビルド
iOSのWWWリクエストをカスタマイズ