草庐IT

Unity_IL2CPP常见问题分析

Clank的游戏栈 2023-04-18 原文

Unity 打包il2cpp模式时的常见问题分析

Unity 编辑器模式下是采用.net 虚拟机解释执行.net 代码,发布的时候有两种模式,一种是mono虚拟机模式,一种是il2cpp模式。由于iOS AppStore规定不允许使用虚拟机,所以发布到iOS,Unity采用了il2cpp技术,把IL(.net字节码) 的代码转成c++代码,然后再用xcode来进行编译。发布到Android的时候,可以用mono与il2cpp模式,il2cpp由于转成native code直接在硬件CPU上跑,性能要比虚拟机解释执行要高,所以发布Android的时候我们也采用il2cpp。但是开发者会遇到一些问题mono模式下能正常运行,编译il2cpp模式下会出现问题,如闪退等,本文将il2cpp 打包发布可能遇到的问题,进行分类,分析与总结,希望能给大家提供解决思路与方向。

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

 

il2cpp模式编译错误

首先遇到的问题是使用il2cpp模式下编译C++代码报错。由于Android/iOS不同的版本对编译器(NDK/xcode)的版本要求也是不同的,而大多数同学下载的NDK/xcode 是网络上的一个版本,不一定匹配上unity 编译Android/iOS时对应的版本,所以如果在发布il2cpp模式过程中,当我们遇到编译错误的时候,首先先编译空项目,看看是不是NDK,SDK,xcode的版本不匹配导致的。Unity Hub 现在也集成了一个功能就是安装对应Unity版本对应的NDK与SDK。安装正确的工具链编译问题一般能很轻松的解决。(如下图所示, Unity hub中不同unity版本,安装相关编译工具时的模块化安装)

Mono模式下没问题, il2cpp模式下报类型缺失错误

 开发完打包的时候,mono模式下没有问题, il2cpp模式下编译通过,但是运行的时候报”类型缺失的错误”。这也是常见的il2cpp模式下遇到的问题。C++是属于根据依赖进行编译的模式。Il2cpp中,如果我们编写的c#代码没有使用这个类,那么编译完C++代码后,这个类的二进制代码就不会出现在c++的代码中,运行的时候就会导致类型缺失,功能不正常等相关报错。很多同学看到这里就有一个疑问,既然IL的.dll代码里面没有,为何C++的代码会调用呢?给大家举个例子你瞬间就明白了,假设有个资源预制体挂了一个组件,而这个组件只在资源上使用,代码中没有使用,编辑器模式下与mono模式下都能正常运行。而打包il2cpp的时候由于这个组件在代码中没有使用, 所以导致IL code中没有依赖,因此就不会被il2cpp打入进去,导致l2cpp模式下运行的时候类型缺失报错,功能不能正常使用。

 了解了出错的原因与原理,解决方案就非常简单在ilcode代码里面加上组件类的代码引用与依赖就可以了,让il2cpp将相关的类与组件打入进去。比如动画的timeline等。

Mono模式没有问题,IL2CPP模式下闪退

最后一类问题就是mono模式下没有问题,il2cpp模式下闪退。闪退其实就是手机app的这个进程由于运行时候的错误,OS必须要杀掉这个进程,而虚拟机解释执行式模式,不容易闪退,因为有虚拟机这一层作为保护隔绝,而对于il2cpp而言,全部已经转成了native 代码,如果运行的时候数据不对,比如除0异常,空指针等会导致OS 直接把进程删掉造成闪退。所以这样就会导致mono模式下不闪退,而il2cpp模式下却直接闪退。

引起这类问题原因有很多,比如上面的类型缺失,可能导致闪退, 还有就是某个代码与数据跑出来缺失异常了,但是mono下由于有虚拟机的保护作用,异常可能被直接忽视了,导致我们认为还在app正常运行,而il2cpp模式下由于没有虚拟机的保护,可能直接被OS 杀掉。

一般解决这类我们问题我们还是要通过隔离的手段,找出运行出错的代码与相关数据,然后分析原因来修正它。而不要老想着 “mono正常,而il2cpp模式下报错,闪退”是不是il2cpp的环境问题。其实很大一部分确实是我们的代码或我们代码跑的数据异常导致的。

今天的分享就到这里了,关注我们,可以学习更多的Unity 游戏开发程序员进阶相关的教程内容。

有关Unity_IL2CPP常见问题分析的更多相关文章

  1. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  2. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  3. unity---接入Admob - 2

    目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里​编辑 3.解析依赖到项目中

  4. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  5. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  6. ruby - 将对象设置为 nil 是否很常见? - 2

    我正在构建一个应用程序,想知道是否将未使用的对象设置为nil是生产级编码中的常见做法。我知道这只是垃圾收集器的提示,并不总是处理对象。 最佳答案 根据这个thread如果您使用完一个成员对象,将其设置为nil将引发被引用对象被垃圾回收。如果它是局部变量,方法exit将做同样的事情。也就是说,如果您要求将成员显式设置为nil,我会质疑您的设计。 关于ruby-将对象设置为nil是否很常见?,我们在StackOverflow上找到一个类似的问题: https://

  7. ruby - 变量赋值后的 if 语句 - 有多常见? - 2

    我最近与一位同事讨论了以下Ruby语法:value=ifa==0"foo"elsifa>42"bar"else"fizz"end我个人并没有看到太多这种逻辑,但我的同事指出,这实际上是一种相当普遍的Rubyism。我试着用谷歌搜索这个主题,但没有找到任何文章、页面或SO问题来讨论它,这让我相信这可能是一种非常实际的技术。然而,另一位同事发现语法令人困惑,而是将上面的逻辑写成这样:ifa==0value="foo"elsifa>42value="bar"elsevalue="fizz"end缺点是value=的重复声明和隐式elsenil的丢失,如果我们想使用它的话。这也感觉它与Ruby

  8. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

  9. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

  10. 三分钟集成 TapTap 防沉迷 SDK(Unity 版) - 2

    三分钟集成Tap防沉迷SDK(Unity版)一、SDK介绍基于国家对上线所有游戏必须增加防沉迷功能的政策下,TapTap推出防沉迷SDK,供游戏开发者进行接入;允许未成年用户在周五、六、日以及法定节假日晚上8:00-9:00进行游戏,防沉谜时间段进入游戏会弹窗进行提示!开发环境要求:Unity2019.4或更高版本iOS10或更高版本Android5.0(APIlevel21)或更高版本🔗Unity集成Demo参考链接🔗UnityTapSDK功能体验APK下载链接二、集成前准备1.创建应用进入开发者后台,按照提示开始创建应用;2.开通服务在使用TDS实名认证和防沉迷服务之前,需要在上面创建的应

随机推荐