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

アプリケーションのアプリ内課金 (IAP) の設定

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

Apple StoreKit ドキュメントでは、 In-App Purchase プロセスで販売される以下の 4 種類のプロダクトを定義しています。

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

本項では最初のケースのみをカバーしていて、ダウンロード可能なコンテンツの概念にフォーカスします。アセットバンドル はダウンロード可能なコンテンツを Unity に実装するのに推奨されます。そして、このページでは、アセットバンドルの作成とランタイム時の使用の両方を説明します。

iOS で使用するアセットのエクスポート

メインアプリケーションとそれに使用されるダウンロード可能なアセットバンドルを別々のプロジェクトとして維持することは都合の良いこともあります。 ただし、アセットバンドル内のオブジェクトによって参照されるすべての スクリプト は、ゲームのメイン実行可能ファイル内に置かなければなりません。アセットバンドルファイルのコンテンツは iOS と他のプラットフォームとの間で互換性がないため、アセットバンドルを作成するために使用するプロジェクトは、iOS をビルドターゲットとして選択する必要があります。

エディタースクリプトを使ったアセットバンドルの作成 - 以下はその例。

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);
        }
    }
}

このコードを ExportBundle いうファイルに保存し、それを Editor というフォルダーに配置する必要があります (まだこのファイルがない場合は、自身で簡単に作成できます)。スクリプトは、エディターの Assets メニューの Build AssetBundle From Selection - Track dependencies というメニュー項目を追加します。

バンドルに含むコンテンツは、プレハブの形で準備します。 Project ビューでプレハブを選択してから、Assets > Build AssetBundle From Selection - Track dependencies (つまり、ExportBundle スクリプトによって追加されたメニュー項目) を選択します。 このコマンドは、アセットバンドルファイルの名前と場所を選択できる保存ダイアログを表示します。

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

注意: Apple は、データの書き込みを許可されているフォルダーの場所を変更することがあります。常に最新の Apple ドキュメントをチェックして、アプリケーションがそれに準拠していることを確認してください。以下の情報は 2018 年の初期の時点では正しいことが確認されています。

アセットバンドルは WWW クラス を使ってダウンロード可能で、いったんダウンロードが終了すると、含まれるアセットにアクセスすることができます。アセットバンドルをダウンロードする推奨方法は、以下の例ように LoadFromCacheOrDownload を使用することです。

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) {
        // もう 1 つの方法として、(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");    
    }
}

ダウンロードされたアセットバンドルファイルは、iOSアプリケーションサンドボックスの Libraryフォルダに保存され、それらには No Backup フラグが設定されています。 つまり、OSがこれらのファイルを誤って削除したり、iCloudにバックアップされたりすることはありません。

AssetBundle ファイルの保存場所を正確に指定する必要がある場合は、標準の WWW ダウンロードを使用し (LoadFromCacheOrDownload の代わりにコンストラクターを使用します)、.NET ファイル API を使用してダウンロードしたデータをディスクに保存します。必要なファイルは、Application.temporaryCachePath フォルダー (OS によって定期的に消去される Library/Caches に格納されています) か、Application.persistentDataPath フォルダー (OS によって消去されない Documents に格納されています) に保存します。これらのファイルが iCloud にバックアップされないようにするには、iOS.Device.SetNoBackupFlag を使用してこれらのファイルに No Backup フラグを設定する必要があります。

注意: No Backup フラグを設定しないと、App Store にアプリケーションを提出する際に拒否される場合があります。

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

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);

ノート: ファイルの共有 を有効にすると (Info.plist 内の UIFileSharingEnabled を true に設定すると、iTune から Documents フォルダーにアクセスできるようになります)、Documents フォルダーに保存されているファイルの読み取りをテストできます。Documents フォルダーのコンテンツは iCloud にキャッシュされるため、この場所は、出荷する最終的なビルドの AssetBundles を保存するために使用するべきではありません。詳しくは、Apple iOS ドキュメントの File System Basics を参照してください。


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