本章不介绍如何将游戏与 Apple 的 StoreKit API 进行集成。此处假设已经通过原生代码插件与 StoreKit 进行集成。
Apple StoreKit 文档定义了可通过_应用内购 (In-App Purchase)_ 流程销售的四种商品:
本章仅介绍第一种情况,主要侧重于可下载内容概念。建议使用 AssetBundles 在 Unity 中实现可下载内容,这里将介绍 AssetBundles 的创建和运行时使用。
为主应用程序和将使用的可下载 AssetBundles 维护单独的项目有时很有用。但是,应该注意,AssetBundle 中的对象引用的所有_脚本_必须存在于主游戏可执行文件中。用于创建 AssetBundle 的项目必须将 iOS 作为选定的构建目标,因为 AssetBundle 文件的内容在 iOS 和其他平台之间不兼容。
AssetBundles 是使用 Editor 脚本创建的 - 下面给出了一个简单的示例:
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 的文件夹中(如果项目中不存在该文件夹,则可以创建该文件夹)。此脚本将在 Editor 的 Assets 菜单上添加一个名为 Build AssetBundle From Selection - Track dependencies 的菜单项。
希望包含在捆绑包中的内容应以预制件的形式准备。在 Project 视图中选择一个预制件,然后选择 _Assets > Build AssetBundle From Selection - Track dependencies_(即 ExportBundle 脚本添加的菜单项)。此命令将打开一个保存对话框,可在其中选择 AssetBundle 文件的名称和位置。
注意:Apple 可能会更改允许写入数据的文件夹位置。请务必查看最新的 Apple 文档,以确保您的应用程序符合要求。以下建议截至 2018 年初有效。
可以使用 WWW 类下载 AssetBundles,一旦传输完成,就可以访问其中的资源。推荐的 AssetBundle 下载方法是使用 LoadFromCacheOrDownload,如以下示例所示:
IEnumerator GetAssetBundle() {
WWW download;
string url = "https://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) {
// 或者也可以按名称加载资源 (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");
}
}
下载的 Asset Bundle 文件存储在 iOS 应用程序沙盒的 Library 文件夹中,并在其上设置了 No Backup 标志。这意味着操作系统不会意外删除这些文件,因此这些文件不会备份到 iCloud。
如果需要确切选择 AssetBundle 文件的存储位置,可以使用标准的 WWW 下载(即仅使用构造函数而不是 LoadFromCacheOrDownload),然后使用 .NET 文件 API 将下载的数据保存到磁盘上。可将所需文件保存到 Application.temporaryCachePath 文件夹(存储在 Library/Caches 中,此位置由操作系统定期“清除”)或 Application.persistentDataPath 文件夹(存储在 Documents 中,操作系统不会清除此位置)。应使用 iOS.Device.SetNoBackupFlag 在这些文件上设置 No Backup 标志以防止它们备份到 iCloud。
注意:如果未设置 No Backup 标志,则在将应用程序提交到 App Store 时可能会遭到拒绝。
可以通过使用 file:///pathtoyourapplication/Library/savedassetbundle.assetbundle
形式的 URL 创建 WWW 对象来访问已保存的文件:
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);
注意:如果启用_文件夹共享_,可以测试对 Documents 文件夹中存储的文件的读取(在 Info.plist
中将 UIFileSharingEnabled
设置为 true 允许从 iTunes 访问 _Documents_文件夹)。请注意,Documents 文件夹的内容会缓存到 iCloud,因此不应使用此位置将 AssetBundles 存储到要发布的最终版本中。有关更多详细信息,请参阅 Apple iOS 文档中的文件系统基础知识 (File System Basics)。
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.