Unity WebGL版本打包注意事项

采用较新的Unity版本

  • 更加低级的版本如,Unity 2/3/4 导出来的网页运行版本只能在安装了Unity Web Player插件的32位浏览器中运行
  • Unity 5/2017/2018 导出的网页版本,支持初步的WebGL和H5,但只仅仅限制于桌面浏览器,手机浏览器还不行
  • Unity 2021+ 在这个之上的版本已经对手机和桌面浏览器有很好的支持了,可以真正做到跨平台运行了;对于手机浏览器的支持,可以在微信小游戏、抖音小游戏中流畅运行起来(当然手机的硬件配置,如内存、处理器不能太差)。
  • 目前市场上主流是H5,强烈建议你把老项目升级到新的Unity版本。你可以想象下,你导出一个H5版本的游戏,部署到了github上,然后把链接通过微信分享给你的朋友们,而他们直接点开链接就可以玩你的游戏了(安卓和iOS设备都是一样的操作)。你作为开发者再也不用经历繁琐的APP上传流程了,而且整个过程你都可控了。这是不是很爽!!

Unity 5/2017/2018 项目升级问题

  • Unity2018版本的项目升级起来是比较顺畅的
  • Unity5.6/2017版本的项目会有以下几个问题
    • 老版本粒子系统丢失
    • 替换掉 GUITextGUITexture, 删掉Camera上挂载的 GUILayout
    • WWW 修改为 UnityWebRequest
  • Unity 4.x到Unity 5,这二者之间的物理模块,如cloth,车体物理如WheelCollider 有个大的更新,这对于赛车类游戏来说,可能需要重新调试车体物理效果;或者干脆放弃
  • 对于低版本的项目,建议切换到资源模式 Force Text,再逐步从低版本升级高版本。如 Unity4.x -> Unity5.6 -> Unity 2018 -> Unity 2021
  • 从Unity5.6/2017直接升级到Unity2021,AnimatorController所引用的动画可能会缺失,一个可选的方式是,先升级到Unity2018,然后再到 Unity2021
  • 带有绑定GUILayout组件的Camera场景需要重新保存下,否则打包会Error
  • GetComponent/AddComponent("SomeBehaviour") 修改为 GetComponent/AddComponent<SomeBehaviour>()
  • C#中动态创建类型的代码在在il2cpp中是无法工作的,解决办法是枚举类型并展开,或者根据方法名去字典里查找对应的Func
    • typeof(T).GetMethod("methodName")
    • Activator.CreateInstance(type)
    • DynamicMethodILGenerator
    • AppDomain.CurrentDomain.GetAssemblies()

WebGL版本注意点

  • 不要设置 Application.targetFrameRate
  • 去掉 Application.Quit()
  • 去掉 对Screen.orientation的修改
  • 注意对Screen.widthScreen.height的调用,当浏览器窗口会发生变化时,任何依赖该值的计算都需要重新计算;这点与Android/iOS平台完全不一样
  • warning: 2 FS.syncfs operations in flight at once, probably just doing extra work,网络说读写文件会导致这个问题,建议使用PlayerPrefs,但是PlayerPrefs调用次数过多也会有该问题
  • Canvas中设置屏幕屏幕宽高比,否则某些UI元素位置会显示乱掉
  • UnityWebRequest 要么写在using()中,要么调用其dispose() 方法,否则会有内存泄漏的问题:A Native Collection has not been disposed, resulting in a memory leak.
  • 版本更新浏览器缓存内容:游戏资源更新需要添加版本号或者刷新CDN;游戏存档数据则需要做升级或者兼容性处理、或者自行清理缓存数据。总之,开发者更新游戏后不能要求玩家手动清理浏览器缓存
  • Prefab 'xxx.prefab' has unexpected file IDs and is likely to be corrupt,把prefab拖到场景里,然后再拖出成另一个prefab试试
  • 类空间为:BooUnityScript的遗留代码要改正
  • 加入垃圾回收机制
    • Resources.UnloadUnusedAssets()
    • GC.Collect()
  • 注意以下代码:
    • DllImport
    • RuntimePlatform.Android
    • UnityEngine.Input.touchCountInput.touches
    • Social

代码优化

删除没有用到的代码库或者package,这样做能减少生成的代码包体大小。例如,WebGL版本里就不应该有Admob、UnityAds这类的代码。因为它们只供 手机端 使用。下面列出来的代码内容都可以考虑删除。

  • UnityEngine.Advertisements
  • AndroidJavaClassAndroidJavaObjectAndroidJavaProxy,
  • Application.ExternalCallApplication.ExternalEval
  • APIUpdaterRuntimeServicesusing Boo.Langusing UnityScript.Lang

包体优化

  • 把图片长宽设置为4的倍数,开启Crunch压缩
  • 减少图片尺寸,去掉 mipmap
  • 设置Audio的Compression FormatVorbis,设置Quality值为 20~25
  • 对.fbx文件设置 Mesh Compression
  • 删掉项目里没有用到的代码和资源
  • 删掉重复资源;注意,完全一样的两张图片,一张用于diffuse,另一张用于生成normal,虽然它们是相同的图片,但是它们表示的是不同的资源
  • 删掉不用的package