PlayDrama 开发者文档
PlayDrama 上的每部互动影游都是一个独立的 Unity 工程。你照常用 Unity 开发,装上平台插件,自检通过后上传, 平台复核通过就能用 App 扫码试玩。大部分平台能力不需要写代码;需要摄像头、麦克风这类设备能力时,用 SDK 的几个接口。
快速开始
- Unity 版本:用平台指定的
6000.3.26f1建工程或打开已有工程(Unity Hub 里安装这个版本)。渲染管线用 URP。 - 安装插件:在 Package Manager 里添加平台插件
com.aiplay.sdk(版本 0.6.1)。 - 打开面板:菜单 AIPlay → 创作者面板。用 PlayDrama App「我的」页的扫一扫扫面板上的二维码登录,作品归这个账号。
- 勾选场景:作品用到的场景勾进 Build Settings,第一个是入口场景。
- 自检:面板打开、脚本编译后自动检查,规则和平台复核是同一套。插件包和平台差修订号的会自动对齐,差得多的点「一键对齐」。
- 上传:选发行端(iOS / 安卓 / 双端 / 网页版)点「上传」。第一次上传会在创作者中心建好作品。 已经是 WebGL 项目、或用了网页专属代码(jslib)的工程选网页版。
- 试玩:平台复核通过后面板上出预览二维码(24 小时有效),用 App 扫码试玩这次上传的版本。 只有你本人和你在创作者中心「预览成员」里添加的人能打开,别人扫码会提示没有权限。 作品资料、价格、横竖屏在创作者中心填写。
Library/AIPlaySandbox,
设备授权弹编辑器对话框模拟。作品怎么跑在 App 里
作品的代码在 App 里热加载运行,场景和资源打成资源包下发,视频由插件转码后单独放 CDN。工程不用为平台改结构: 多个 asmdef、Assembly-CSharp、Package Manager 的第三方 C# 插件、预编译的 C# DLL 都可以。
平台自动接管的写法
下面这些照常写,平台复核时会改成平台的版本,行为和在单独的 App 里一样,作品之间互不影响:
| 你的写法 | 在 App 里 |
|---|---|
File、Directory、FileStream、StreamReader/Writer、persistentDataPath | 读写这部作品自己的存档目录 |
PlayerPrefs | 这部作品自己的存档 |
UnityWebRequest、WWW | 只放行平台自己的地址,其它请求被拦下 |
Application.Quit() | 退出这部作品,回到 App |
Application.OpenURL() | 不跳出 App,提示用户已拦截 |
| 按编号切场景、标签、图层名、旧输入系统的输入轴、排序层 | 按你工程里的设置换算 |
Resources.Load、Shader.Find | 从作品自己的资源包里找 |
OnApplicationQuit、Application.quitting | 用户退出作品时照常触发,可以在里面存档 |
| 摄像头、麦克风、陀螺仪 | 这部作品单独授权,见设备能力 |
不能用的写法
- 原生插件:
.a、.framework、.so、.mm、.swift等原生代码,以及DllImport。App 不能加载作品带的原生代码。 - 动态加载或生成代码:
System.Reflection.Emit、按名字加载程序集。从文件或字节加载程序集(Assembly.LoadFile、Load(byte[])) 不会被拒绝,真调到时会报“App 里不能动态加载代码”,插件里不会走到的分支不影响作品。 - .NET 底层联网:
Socket、HttpClient、WebClient等。 - 自己给
VideoPlayer设网址:视频请直接用工程里的 VideoClip,平台会自动换成 CDN 地址。
通过反射调这些接口,会报 NotSupportedException,并说明原因。
大小和视频规范
- 代码不超过 50 MB,资源包不超过 2 GB。
- 视频:H.264 或 HEVC,长边不超过 1920,单个不超过 600 秒、300 MB。插件在上传前把视频转码成两档清晰度(长边 1280 和 960),第一个视频取一帧做封面;转好的视频按原文件缓存,没改过的视频再次上传不会重新转码。插件自带转码工具 ffmpeg,如果合规检测提示找不到,请更新插件(Mac 上也可以
brew install ffmpeg)。AI 生成内容的隐式标识由平台按创作者中心里的设置写进视频,不用自己加。 - Unity 内置包(URP、Input System、Timeline 等)要和平台版本一致;App 没内置的包不限制,代码随作品下发。
网页版(WebGL)
工程本来就以 WebGL 为目标平台、用了 .jslib 等网页专属代码,或者想绕开 iOS / 安卓版的限制(比如 Unity 版本、渲染管线),
发行端选网页版。插件用你的工程打一个完整的 WebGL 包上传,App 用系统网页容器运行它,外面一样有平台胶囊和菜单。
| iOS / 安卓版 | 网页版 | |
|---|---|---|
| Unity 版本 | 必须是平台指定的版本 | 不限(自带 Unity 运行时) |
| 渲染管线、插件包 | URP,App 内置的包要对齐版本 | 不限 |
| 代码 | 平台复核时改写(存档、联网、退出接管) | 不改写,原样运行 |
| jslib 等网页代码 | 不支持 | 支持 |
| 性能 | 原生,更好 | 网页里运行,内存和速度差一些 |
网页版的规则
- 存档:
PlayerPrefs、Application.persistentDataPath照常用,每部作品的存档只属于它自己。 - 联网:和 iOS / 安卓版一样不能联网,网页里请求外部地址会被 App 拦下;平台复核时会列出网页里写死的外部地址。
- 退出:调
Application.Quit()会退出这部作品回到 App。 - 设备能力:
PlatformApi的授权、存相册、选图照常用;WebCamTexture在网页里申请摄像头时 App 一样按这部作品单独询问。 Unity 的 WebGL 平台本身没有Microphone类,录音要用自己的 jslib。 - 页面模板:用 Unity 自带模板时,插件导出时自动换成全屏模板(手机上铺满屏幕、按设备像素比渲染);你有自己的模板就照用你的。
- 大小:插件用 Gzip 压缩打包。包体超过 100 MB 时插件会提醒,手机网络下第一次进入要等很久。
平台能力(不用写代码)
- 胶囊和安全区:右上角固定有平台胶囊(“···”菜单、“◉”退出)。胶囊占的区域已经算进
Screen.safeArea,界面按安全区布局就不会被挡住。 - 退出:用户点胶囊退出,作品不用做“返回首页”。
- 横竖屏:在创作者中心选竖屏、横屏或自动;选“自动”时作品用
Screen.orientation自己切。 - 付费:整部买断,价格在创作者中心设置,玩家在 App 详情页购买后才能进入,作品里没有付费代码。
- 视频:照常用 VideoPlayer 播 VideoClip,App 里边下边播。
- 中文字体:iOS 上 Unity 读不到系统中文字体,TextMesh Pro 缺字时平台会用思源黑体兜底;也可以直接用
PlatformApi.DefaultFont。
设备能力
摄像头、麦克风、陀螺仪、相册按作品单独授权:用户允许了《你的作品》使用摄像头,不代表别的作品也能用。用户可以在胶囊菜单的「授权管理」里撤销。
授权流程
- App 弹出询问:“《作品名》想使用你的摄像头”,用户点「允许」或「不允许」。
- 用户允许后,App 再向系统申请权限(整个 App 只申请一次)。系统权限之前被关掉的,会提示用户去设置里打开。
- 结果按作品记住,下次不再问。
iOS 和安卓的流程一样。安卓上陀螺仪不需要系统权限;存进相册在安卓 10 及以上也不需要存储权限;选图用系统的照片选择器。
什么时候问:
- 代码里直接用了 Unity 接口(
WebCamTexture、Microphone、Input.gyro、Application.RequestUserAuthorization): 平台复核时会扫出来,进入作品时在加载界面上先问。 - 用 SDK 的
RequestPermission,或者扫不出来的情况(比如可视化脚本里用的):第一次用到时再问。
用 SDK 接口(推荐)
自己决定什么时候问,拿到明确的结果:
using AIPlay.SDK;
// 摄像头:允许后再打开
PlatformApi.RequestPermission(DevicePermission.Camera, granted =>
{
if (!granted) { tip.text = "没有摄像头权限,可以在右上角 ··· → 授权管理里重新允许"; return; }
var camera = new WebCamTexture();
rawImage.texture = camera;
camera.Play();
});
// 麦克风:拿到授权再开始录音
PlatformApi.RequestPermission(DevicePermission.Microphone, granted =>
{
if (granted) clip = Microphone.Start(null, false, 10, 44100);
});
// 陀螺仪
PlatformApi.RequestPermission(DevicePermission.Motion, granted => Input.gyro.enabled = granted);
// 存图到相册(会先申请相册权限;贴图要可读)
PlatformApi.SaveImageToAlbum(screenshot, ok => tip.text = ok ? "已保存到相册" : "没有保存");
// 从相册选图:用系统选图界面,不需要相册权限,用户取消时为 null
PlatformApi.PickImageFromAlbum(texture => { if (texture != null) avatar.texture = texture; });
回调都在主线程。已经有结果时 RequestPermission 马上回调,不会重复弹窗;PlatformApi.GetPermission 可以先查状态。
直接用 Unity 接口
已有的工程不用改,平台会接管这些调用:
| Unity 接口 | 已允许 | 还没问过 | 已拒绝 |
|---|---|---|---|
webCamTexture.Play() | 照常打开 | 先问用户,允许后自动打开 | 不打开,日志里有提示 |
Input.gyro.enabled = true | 照常打开 | 先问用户,允许后自动打开 | 保持关闭 |
Microphone.Start(...) | 照常录音 | 先问用户,这一次返回静音的 AudioClip | 返回静音的 AudioClip |
Application.RequestUserAuthorizationApplication.HasUserAuthorization | 照常向系统申请 | 先问用户,这一次结果为未授权 | 马上完成,结果为未授权 |
PlatformApi.RequestPermission 拿到授权再调 Microphone.Start。SDK 接口参考
命名空间 AIPlay.SDK,静态类 PlatformApi:
| 接口 | 说明 |
|---|---|
bool IsHosted | 是否运行在 PlayDrama App 里(编辑器模拟时为 false) |
bool IsAutoTest | 平台无人值守测试时为 true,作品可以据此自动推进流程 |
string UserName | 当前用户昵称(不提供手机号等隐私信息) |
Font DefaultFont | 平台自带的中文字体(思源黑体) |
PermissionStatus GetPermission(DevicePermission) | 这部作品当前的授权:NotDetermined / Granted / Denied |
void RequestPermission(DevicePermission, Action<bool>) | 申请设备能力,回调是否允许 |
void SaveImageToAlbum(Texture2D, Action<bool>) | 存图到系统相册(先申请 PhotoLibrary) |
void PickImageFromAlbum(Action<Texture2D>) | 系统选图界面,回调选中的图片,取消为 null |
DevicePermission:Camera 摄像头、Microphone 麦克风、Motion 陀螺仪等运动传感器、PhotoLibrary 存图到相册。
常用插件
| 插件 | 状态 | 说明 |
|---|---|---|
| TextMesh Pro | 可用 | 旧版 TMP 着色器上传时自动换成新版;字体里缺的字自检会列出来(emoji 会显示成方框) |
| Timeline、Cinemachine 2 / 3 | 可用 | — |
| Visual Scripting(可视化脚本) | 可用 | 不写 C# 也能做完整作品;图里调的退出、存档、联网同样走平台沙盒。
节点里 object 类型的输入不能填默认值,要接常量节点(编辑器里也一样) |
| ink | 可用 | 剧本、选项、变量、外部函数都正常。剧本放进工程会自动编译 |
| Yarn Spinner 3 | 可用 | 命令、函数、选项都正常。自带对话框的继续箭头很小、贴着屏幕底边,手机上建议加“点屏幕任意位置翻页”
(铺满屏幕的透明按钮调用 LineAdvancer.RequestNextLine)。dice 是 Yarn 自带的函数,自己的函数别重名 |
| 含原生代码的插件 | 不支持 | 如各类 SDK 的 iOS 原生部分,自检会列出来 |
自检和提醒
创作者面板里分两类:
- 问题(不能上传):版本不一致、用了不能用的写法、原生插件、超过大小限制等。平台复核用的是同一套规则,本地通过了复核也会通过。
- 提醒(不影响上传):手机上可能出问题的地方,比如只用了键盘操作、没按安全区布局、Gamma 色彩空间、字体缺字、Burst 不生效。
命令行也能跑:Unity -batchmode -quit -projectPath 工程 -executeMethod AIPlay.SDK.EditorTools.WorkSubmitter.SelfCheckCI,
上传用 WorkSubmitter.SubmitCI -workTarget iOS,令牌可以放在环境变量 AIPLAY_TOKEN。
常见问题
编辑器里好好的,手机上界面被挡住了?
按 Screen.safeArea 布局。平台已经把右上角胶囊算进安全区。
手机上有的字显示成方框?
字体里没有这个字。汉字会用平台的中文字体补上(字形和其他字不同),emoji 和特殊符号没有后备,换成图片或给字体加后备字体。自检会列出场景和预制体里缺的字,代码运行时赋值的文字查不到,请在手机上看一遍。
存档在哪里?换手机还在吗?
存在这部作品自己的存档目录里,和其他作品互不影响;用户删除 App 时一起删除。
作品能联网吗?
不能访问外部地址。需要的数据请放进工程里。
怎么让别人帮我试玩预览版?
让对方在 PlayDrama App「我的」页点一下用户 ID 复制给你(PD 开头加 8 位),你在创作者中心作品页的「预览成员」里添加,对方再扫同一个预览码就能打开。
玩家举报了我的作品会怎样?
玩家可以在胶囊菜单 ··· → 举报、或作品详情页举报。平台审核员会逐条核实,结果显示在创作者中心作品页的「用户举报」里(不显示举报人);确认违规的作品会下架,修改后重新提交审核即可。
用户拒绝了授权,怎么让他重新允许?
提示用户在右上角 ··· → 授权管理里撤销这一项,下次用到时会重新询问;系统权限被关掉的,App 会引导去系统设置里打开。