欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS开发之Unity游戏在iOS平台运行调研(踩坑)

程序员文章站 2022-07-07 08:23:51
需求在现有App上运行自研的Unity游戏方案方案一、导出WebGL运行在WKWebView上方案二、Unity与原生混合开发官方示例:将 Unity 集成到原生 iOS 应用程序中...

需求

在现有App上运行自研的Unity游戏

注:此需求可能会由于一些原因而弃掉

方案

方案一、导出WebGL运行在WKWebView上(方案不适用)

结论:
  • 不建议采用;不建议深挖
  • 移动端网页仅适用于Unity小游戏,不适用于大型Unity游戏。PC可正常运行
  • 游戏本身兼容性并不是大问题,主要还是内存原因无法在移动端网页运行
原因:
  • WebView内存分配不足以支撑。经测试手机最多可分配1G内存供Web使用,超出1G,如果手机性能高,会弹出请求分配更多内存的提示;否则直接崩溃,无法进入游戏
  • 手机性能高,勉强能够进入游戏,但持续运行,手机发烫严重,请谨慎尝试。高内存场景也无法进入
  • 手机性能低,Unity进度条加载完毕,网页直接崩溃
历程:
  1. Unity项目导出WebGL,直接让其运行在PC浏览器上,可正常运行。不过有些UI无法显示,经分析是有些插件不兼容WebGL,可通过更换插件支持。

  2. 让其运行在手机浏览器,弹出错误提示:iOS开发之Unity游戏在iOS平台运行调研(踩坑)
    点击OK后,加载一会一直白屏。以为WebGL无法运行在手机端。就考虑第二套方案了(Unity与原生混合开发)。回过头来再分析此问题时,发现,此提示只是一个警告,可通过修改UnityLoader.js文件的方法避开此提示。如下注释掉原方法实现,改成 直接回调 t();(此js文件是未格式化的,可以使用此 格式化工具

    compatibilityCheck: function(e, t, r) {
            // UnityLoader.SystemInfo.hasWebGL ? UnityLoader.SystemInfo.mobile ? e.popup("Please note that Unity WebGL is not currently supported on mobiles. Press OK if you wish to continue anyway.", [{
            //     text: "OK",
            //     callback: t
            // }]) : ["Edge", "Firefox", "Chrome", "Safari"].indexOf(UnityLoader.SystemInfo.browser) == -1 ? e.popup("Please note that your browser is not currently supported for this Unity WebGL content. Press OK if you wish to continue anyway.", [{
            //     text: "OK",
            //     callback: t
            // }]) : t() : e.popup("Your browser does not support WebGL", [{
            //     text: "OK",
            //     callback: r
            // }])
            t();
        },
    

    此问题解决后,然而并没有解决无法进入游戏的问题。猜测可能是内存问题引起的,经查资料,尝试看能不能指定内存打包,结果2019版本的unityIDE不支持修改MemorySize的设定。(如图无法设置)

    iOS开发之Unity游戏在iOS平台运行调研(踩坑)
    继续查找问题原因,通过Unity IDE查看此游戏启动所占用的内存,发现启动占用了近2G的内存。为了验证是否是内存不足导致的。尝试创建了一个新的项目,里面随意放几个组件,看是否能正常运行在手机端。发现可正常运行。问题越来越接近猜测了。再在网上找了几个小项目去尝试,也可正常运行。

    接下来,只要进一步验证到底是游戏项目的问题,还是内存的问题即可。

    因为刚开始我使用的是iPhone 6sp 尝试的。想着找一台性能高的手机看看。如果可以运行,就肯定是内存问题。经尝试。猜测是正确的。在iPhone XS Max上可以进入游戏首页,不过点击进入游戏场景,网页就崩溃了。而且内存占用极大,手机发烫严重。赶紧杀死网页,停止尝试。

    问题到此结束了,在移动端根本无法使用,此方案被Pass。从而得出了开头给出的结论。

    iOS开发之Unity游戏在iOS平台运行调研(踩坑)

方案二、Unity与原生混合开发

官方参考示例:将 Unity 集成到原生 iOS 应用程序中

结论:
  • 多工程项目
  • 可运行,不过打出的包会很大,根据取舍自行考量
踩坑
  1. 保证导出的 Unity iOS工程可正常运行在手机上。
    其中遇到报错脚本不执行如下:
    /Users/xxxx/Desktop/yinghua2020Ios/MapFileParser.sh: Permission denied
    执行命令修改权限即可
    chmod a+x "/Users/xxxx/Desktop/NativeBrige/yinghua2020Ios/process_symbols.sh"
  2. 可运行,不过有几率闪退
    通过导出项目选择的渲染方式解决。
    OpenGL2.0 或 OpenGL3.0 方式 更换成 Metal 方式
class ViewController in Interface Builder file.

CrashReporter: initialized

2020-10-14 16:42:14.464216+0800 NativeiOSApp[6896:858416] Built from '2019.4/china_unity/release' branch, Version '2019.4.9f1 (ba291d946e84)', Build type 'Release', Scripting Backend 'il2cpp'

-> applicationDidFinishLaunching()

2020-10-14 16:42:14.597049+0800 NativeiOSApp[6896:858416] Metal API Validation Enabled

-> applicationWillEnterForeground()

-> applicationDidBecomeActive()

[Subsystems] Discovering subsystems at path /var/containers/Bundle/Application/19D8DA15-9798-4373-977D-F28DDBFB24F5/NativeiOSApp.app/Frameworks/UnityFramework.framework/Data/UnitySubsystems

GfxDevice: creating device client; threaded=1

Renderer: Apple A9 GPU

Vendor:   Apple Inc.

Version:  OpenGL ES 2.0 Metal - 66.6

GLES:     2

 GL_OES_depth_texture GL_OES_depth_texture_cube_map GL_OES_depth24 GL_OES_element_index_uint GL_OES_fbo_render_mipmap GL_OES_mapbuffer GL_OES_packed_depth_stencil GL_OES_rgb8_rgba8 GL_OES_standard_derivatives GL_OES_texture_float GL_OES_texture_half_float GL_OES_texture_half_float_linear GL_OES_vertex_array_object GL_EXT_blend_minmax GL_EXT_color_buffer_half_float GL_EXT_debug_label GL_EXT_debug_marker GL_EXT_discard_framebuffer GL_EXT_draw_instanced GL_EXT_instanced_arrays GL_EXT_map_buffer_range GL_EXT_occlusion_query_boolean GL_EXT_pvrtc_sRGB GL_EXT_read_format_bgra GL_EXT_separate_shader_objects GL_EXT_shader_framebuffer_fetch GL_EXT_shader_texture_lod GL_EXT_shadow_samplers GL_EXT_sRGB GL_EXT_texture_filter_anisotropic GL_EXT_texture_rg GL_EXT_texture_storage GL_APPLE_clip_distance GL_APPLE_color_buffer_packed_float GL_APPLE_copy_texture_levels GL_APPLE_framebuffer_multisample GL_APPLE_rgb_422 GL_APPLE_sync GL_APPLE_texture_format_BGRA8888 GL_APPLE_texture_max_level GL_APPLE_texture_packed_float GL_IMG_

read_format GL_IMG_texture_compression_pvrtc

OPENGL LOG: Creating OpenGL ES 2.0 graphics device ; Context level  <OpenGL ES 2.0> ; Context handle -2126231072

OPENGL LOG: OpenGLES2 is deprecated on this platform

Initialize engine version: 2019.4.9f1 (ba291d946e84)

CrashReporter: No pending report exists at /var/mobile/Containers/Data/Application/A26F5888-B414-4B87-9645-D3A0FAABCE70/Library/Caches/CrashReports/crash-pending.plcrash

本文地址:https://blog.csdn.net/Yj_sail/article/details/109218510

相关标签: iOS开发 小技巧