PlayDrama开发者文档

PlayDrama 开发者文档

PlayDrama 上的每部互动影游都是一个独立的 Unity 工程。你照常用 Unity 开发,装上平台插件,自检通过后上传, 平台复核通过就能用 App 扫码试玩。大部分平台能力不需要写代码;需要摄像头、麦克风这类设备能力时,用 SDK 的几个接口。

快速开始

  1. Unity 版本:用平台指定的 6000.3.26f1 建工程或打开已有工程(Unity Hub 里安装这个版本)。渲染管线用 URP。
  2. 安装插件:在 Package Manager 里添加平台插件 com.aiplay.sdk(版本 0.6.1)。
  3. 打开面板:菜单 AIPlay → 创作者面板。用 PlayDrama App「我的」页的扫一扫扫面板上的二维码登录,作品归这个账号。
  4. 勾选场景:作品用到的场景勾进 Build Settings,第一个是入口场景。
  5. 自检:面板打开、脚本编译后自动检查,规则和平台复核是同一套。插件包和平台差修订号的会自动对齐,差得多的点「一键对齐」。
  6. 上传:选发行端(iOS / 安卓 / 双端 / 网页版)点「上传」。第一次上传会在创作者中心建好作品。 已经是 WebGL 项目、或用了网页专属代码(jslib)的工程选网页版。
  7. 试玩:平台复核通过后面板上出预览二维码(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用户退出作品时照常触发,可以在里面存档
摄像头、麦克风、陀螺仪这部作品单独授权,见设备能力
反射调用也一样。可视化脚本(Visual Scripting)和按名字调接口的插件都是通过反射调用的,平台同样会接管: 可视化脚本里的「退出」只退出作品,存档进作品自己的存档,联网同样只放行平台地址。

不能用的写法

  • 原生插件:.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 时插件会提醒,手机网络下第一次进入要等很久。
同一部作品可以同时有 iOS / 安卓版和网页版:App 优先用 iOS / 安卓版(性能更好),只有网页版时才用网页容器运行。

平台能力(不用写代码)

  • 胶囊和安全区:右上角固定有平台胶囊(“···”菜单、“◉”退出)。胶囊占的区域已经算进 Screen.safeArea,界面按安全区布局就不会被挡住。
  • 退出:用户点胶囊退出,作品不用做“返回首页”。
  • 横竖屏:在创作者中心选竖屏、横屏或自动;选“自动”时作品用 Screen.orientation 自己切。
  • 付费:整部买断,价格在创作者中心设置,玩家在 App 详情页购买后才能进入,作品里没有付费代码。
  • 视频:照常用 VideoPlayer 播 VideoClip,App 里边下边播。
  • 中文字体:iOS 上 Unity 读不到系统中文字体,TextMesh Pro 缺字时平台会用思源黑体兜底;也可以直接用 PlatformApi.DefaultFont。

设备能力

摄像头、麦克风、陀螺仪、相册按作品单独授权:用户允许了《你的作品》使用摄像头,不代表别的作品也能用。用户可以在胶囊菜单的「授权管理」里撤销。

授权流程

  1. App 弹出询问:“《作品名》想使用你的摄像头”,用户点「允许」或「不允许」。
  2. 用户允许后,App 再向系统申请权限(整个 App 只申请一次)。系统权限之前被关掉的,会提示用户去设置里打开。
  3. 结果按作品记住,下次不再问。

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.RequestUserAuthorization
Application.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 会引导去系统设置里打开。