FAQ
AutoStreaming 相关:
游戏刚启动,弹框提示:“No scene found! Please add at least one scene to build settings.”
当 Build Settings 里面的 Scene 列表为空时,Autostreaming 不会自动打包当前打开的场景,请确认项目的 Build Settings -> Scene 列表是否为空。
游戏启动后,部分或全部纹理不变清晰,并且 log 中有大量404 的下载报错。
开启 AutoStreaming 后,如果游戏用到了某个 Streaming 的资源,但 UOS CDN 服务器上没有,则会出现这种情况。请检查 TextureStreaming 页面是否有点生成 AB,或者 Library 目录下 AutoStreamingCache 文件夹是否有被删除。重新生成 AutoStreaming 的 AB 后,请重新打包游戏。
Scene 和 Texture 的 AutoStreaming 文件会在上传前计算 hash 并保存在首包中,打包前请先确认 AutoStreaming 页面的 Texture Streaming -> Generate AssetBundles 和 Scene Streaming -> Generate ABs 操作已执行
小游戏首包内的资源hash文件增量打包时未及时更新,打包时请勾选clean build选项
游戏内有从 AB 和 Resources 文件夹加载资源的逻辑,做了 streaming 后该如何加载?
对于 AudioClip、Mesh 和 AnimationClip 资源,AutoStreaming 仅抽取了其中的重度数据,Asset 对象依旧存在,因此可以按照原来的逻辑加载 AB 和 Resources 内的 Asset。
但做了 streaming 之后,Asset 内的数据不可立即访问,例如 Mesh.vertices
,Texture2D.GetPixels()
,Texture2D.GetWidth()
,AudioClip.LoadAudioData()
等接口的调用可能会返回 null 或者不正确的结果。
使用 AutoStreaming 后,spine 的 2D 动画出错
如使用了旧版 spine 插件的工程,所有 spine 图集必须勾选 BlurPlaceholder
,否则会出现显示错误;因此推荐将 spine 插件升级到 3.7.xx(2019–05–06) 及以后的版本 。
上传文件到 UOS 时,错误日志显示有部分文件上传失败了。
当遇到网络波动,或者上传文件过多超时的情况,上传可能失败。 只需要在 Window -> AutoStreaming -> Cfg&Publish 页面,重新点 Upload to UOS CDN 按钮即可,上传操作会从上一次失败的位置继续。
如果不小心覆盖了 UOS CDN 上的版本怎么办?
如果操作失误,上传文件到 UOS CDN 时覆盖了已有版本 badge,请前往 UOS CDN 网站,根据时间从 Release 中找到,被覆盖的版本,将 Badge 标签设置回来。
如何查看某个下载链接对应的原始资源
找不到 ConvertLegacySpritePacker 按钮
当项目的 Play Settings -> Editor -> Sprite Packer -> Mode 为 Enable For Build (Legacy Sprite Packer)
或 Always Enable(Legacy Sprite Packer)
时,Instant Game 界面才会显示 ConvertLegacySpritePacker
按钮。
小游戏运行相关:
游戏首次进入下载并存储的文件在第二次打开时不见了
微信小游戏不支持 WebGL 默认的 indexDB 文件存储,因此通过 C# API 存储的文件只会临时存在于内存当中,而不会持久化到手机存储中,退出游戏后即清理。需要持久保存文件,请使用微信 SDK 提供的文件接口。
小游戏需要本地存档,该如何保存
小游戏存档建议保存在服务器,避免丢失。本地存档请文件使用微信 SDK 提供的文件接口保存,也可以通过 PlayerPrefs 保存。
小游戏在手机上运行时,无法进入游戏,报资源下载失败,404的错误
点击游戏的输入框,不弹出虚拟键盘,无法输入
*团结1.3.4版本已修复该问题。 更早的版本中可通过WeixinMiniGameInput.mobileKeyboardSupport
用于控制点击输入框时是否弹出输入法,建议使用时打开,使用结束后关闭,避免性能问题,默认开启。
小游戏启动时,遇到报错 Browser.mainLoop.scheduler is not a function
callmain运行中出了异常,导致setMainLoop没有调用,Browser.mainLoop.scheduler是空的,在下一帧报错了,而callmain里的异常没有打印出来,造成报的错和实际出问题的地方没有关联,又缺少信息,开发者容易被迷惑。
例如首场景Awake函数中,会调用到用户js代码,js代码中出了异常。
callmain里的这个异常没有打印出来,原因是Emscripten的一个瑕疵,Emscripten catch了这个异常,却没有log异常。Emscripten设计在这里catch一个无害异常,导致有害异常无法正常log。
解决方法是修改framework.js里callmain函数,把捕获到的异常打印出来。unwind异常是正常的,而其它异常是有问题的。
小游戏启动后,出现花屏或黑屏问题
如果是只在iOS设备出现,并且游戏卡住,请检查设备的系统版本,SIMD(iOS 16.4),webGL 2.0(15.4)需要较高版本的系统才能支持。开启微信小游戏的高性能模式后可以在iOS 15.0及以上的版本中使用webGL 2.0
如果在微信开发者工具中显示正常,但在移动设备上显示花屏。请检查是否有纹理压缩格式为DXT格式,并且在团结引擎的引擎代码剔除 中将DecompressDXT设置为了ForceStrip
如果微信开发者工具和真机设备均出现部分区域花屏,并且项目使用了URP管线和后处理,请升级最新版本的团结引擎。
小游戏打包相关:
导出微信小游戏时,报错 “Error building Player: Incompatible color space with the graphics API”
linear color space 需要 webgl 2.0 才支持。 项目使用了 webgl 2.0, 因此需要在微信小游戏转换页面也勾选上 webgl 2.0 选项。
小游戏打包后 Shader 报错 shader compiler 9/5 is not available in shader blob
微信小游戏打包页面和工程 Player setting 里面都有 webgl 1.0/ 2.0 的设置,打包前,playersetings 内的设置会被微信 SDK 修改。但如果 Shader 是在此之前打包进 AB 的,则项目实际使用的图形 API 和 AB 中 Shader 的图形 API 不一致。 先确认两处 webgl1.0/2.0 设置正确,然后重新打包所有 AB,并重新打包小游戏
团结引擎打包的 webgl.data 无法用 AssetStudio 打开查看首包详情
我们在小游戏 QQ 交流群里面提供了一个 ExtractUnityWebdata 工具,配合引擎 Editor 中自带的 WebExtract 和 Binary2Text 可以将资源 webgl.data 文件解开。
另外 Github 上已经有开发者修改了 AssetStudio 代码,支持了团结引擎 https://github.com/SiMaLaoShi/AssetStudio_Tuanjie
打包 AB 关闭了 TypeTree 后,在 Editor 中加载 AB 运行时,Editor 经常崩溃或者报错
Editor PlayMode 中加载 AB 运行时,如果打包 AB 时禁用了 typetree,并且 AB 中包含以下形式的 monobehaviour,将导致 editor 发生崩溃,无法从引擎层避免:
//问题示例monobehaviour脚本
using UnityEngine;
public class CrashDemo : MonoBehaviour
{
public int speed;
#if UNITY_EDITOR
//该序列化属性在AB中不存在,因此会导致Editor crash
public bool time;
#endif
// Start is called before the first frame update
void Start()
...
}
使用 AssetBundleBuild 方式打包 AB 时,报错 Moving file failed
当资源上设置了 AB 标签,同时又用 AssetBundleBuild 的方式从代码里面打包 AB,如果两边有同名字的 AB,就会出现 AB 名字变为空字符串的问题,导致移动移动一个文件到文件夹地址失败。
可以通过运行以下代码来清理 AB 标签,排除打包错误:
[MenuItem("InstantGame/Clear All AssetsBundle Names")]
public static void ClearAssetBundleNames()
{
var abNames = AssetDatabase.GetAllAssetBundleNames();
foreach (var abName in abNames)
{
AssetDatabase.RemoveAssetBundleName(abName, true);
}
AssetDatabase.SaveAssets();
AssetDatabase.Refresh(ImportAssetOptions.ForceSynchronousImport | ImportAssetOptions.ForceUpdate);
}
如需了解更多或解决疑问,欢迎访问 团结引擎技术问答专栏 。
更多微信小游戏相关的问题可前往微信官网查看技术常见问题 QA 。