iOS用のプラグインをビルド
Customising WWW Requests on iOS

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

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

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

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

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

注意: アセットバンドルは Unity Pro のみの機能であることに留意して下さい。iOS (Basic)アドオンのユーザはゲームコードの中でAsset Bundle を使用することが出来ません。

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";
    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 にバックアップされないということです。 キャッシュ サイズ のリミット を低く抑えることで,アプリがデバイスのディスクスペースの全てを確保してしまうことを防止すべきです。

もしより細かいところまでキャッシュファイルを制御しないといけない場合, WWW ダウンロードを new WWW(url) 経由で使用して,.NET ファイル API を使用してダウンロードされたファイルをディスク上で格納することが出来ます。必要なファイルを Application.temporaryCachePath (OS によりクリーンされる Library/Caches) フォルダまたは Application.persistentDataPath (OS によりクリーンされない Documentsフォルダ) に保存することが出来ます。これらのファイルの No Backup フラグを iPhone.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();

iPhone.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();

iPhone.SetNoBackupFlag(cachedAssetBundle);

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

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

iOS用のプラグインをビルド
Customising WWW Requests on iOS