关闭

Unity3d IOS 64 IL2CPP迁移之 AStarPath JosnFX 错误

标签: unitycppc++xcodeIL2CPP
6998人阅读 评论(0) 收藏 举报
分类:

在为公司的Unity3d游戏从Mono迁移到IOS 64过程中,出现了许多问题。

在看到Xcode提示Build Success时会有一种成就感油然而生,但是噩梦才刚刚开始。

由于IL2CPP的不完善或者说这种把C#代码转换成C++的方式太粗暴,不仅在Build阶段会出现很多错误,在运行期出现的异常崩溃更是数不胜数。


解决掉Build阶段的错误之后,昨天终于把游戏运行起来,但是在进入主城之后就黑屏了,What Fuck!

不过还好在Xcode中有异常爆出。

Method not found: 'Default constructor not found...ctor() of System.ComponentModel.Int64Converter'.
  at System.Activator.CreateInstance (System.Type type, System.Object[] args) [0x00000] in <filename unknown>:0
  at System.ComponentModel.TypeDescriptor.GetConverter (System.Type type) [0x00000] in <filename unknown>:0
  at Pathfinding.Serialization.JsonFx.TypeCoercionUtility.CoerceType (System.Type targetType, System.Object value) [0x00000] in <filename unknown>:0
  at Pathfinding.Serialization.JsonFx.JsonReader.ReadNumber (System.Type expectedType) [0x00000] in <filename unknown>:0
  at Pathfinding.Serialization.JsonFx.JsonReader.Read (System.Type expectedType, Boolean typeIsHint) [0x00000] in <filename unknown>:0
  at Pathfinding.Serialization.JsonFx.JsonReader.PopulateObject (System.Object& result, System.Type objectType, System.Collections.Generic.Dictionary`2 memberMap, System.Type genericDictionaryType) [0x00000] in <filename unknown>:0 

从字面上来看,没有默认的构造函数?

什么鬼。

但是根据异常来看,异常指向了系统函数……


没办法只有谷歌。

在Unity官方论坛终于看到有开发者反应这个问题,怀疑是因为Unity的代码裁剪优化,消减了这一部分的代码支持!

官方技术支持回答说,不大可能是这个优化造成的,但是也还是给出了一个解决方案。

对于提示出异常的类,创建一个脚本,在这个脚本里面使用new 来调用一下这个类的构造函数,这样就避免被优化裁剪。


I actually doubt this is a stripping issue. It is more likely related to an AOT limitation. IL2CPP can only construct and instance of a type at runtime that it knows about at compile time. So for a call to System.Activator.CreateInstance to succeed, IL2CPP needs to have previously generated code for the System.Type passed as the first argument to CreateInstance.

You may be able to work around this issue by declaring an unused field of type System.ComponentModel.Int64Converter in a class that will not be stripped. A MonoBehaviour in one of your scripts is likely a good candidate. Maybe try something like this:

    class AotTypes : MonoBehaviour
    {
        private static System.ComponentModel.Int64Converter _unused = new System.ComponentModel.Int64Converter();
    }

然后呢对于所有你需要用到的一些类都这样用一下。

private static System.ComponentModel.Int64Converter _unused = new System.ComponentModel.Int64Converter();
    private static System.ComponentModel.DecimalConverter _unused2 = new System.ComponentModel.DecimalConverter();
    private static System.ComponentModel.ByteConverter _unused3 = new System.ComponentModel.ByteConverter();
    private static System.ComponentModel.CollectionConverter _unused4 = new System.ComponentModel.CollectionConverter();
    private static System.ComponentModel.CharConverter _unused5 = new System.ComponentModel.CharConverter();
    private static System.ComponentModel.SByteConverter _unused6 = new System.ComponentModel.SByteConverter();
    private static System.ComponentModel.Int16Converter _unused7 = new System.ComponentModel.Int16Converter();
    private static System.ComponentModel.UInt16Converter _unused8 = new System.ComponentModel.UInt16Converter();
    private static System.ComponentModel.Int32Converter _unused9 = new System.ComponentModel.Int32Converter();
    private static System.ComponentModel.UInt32Converter _unused10 = new System.ComponentModel.UInt32Converter();
    private static System.ComponentModel.Int64Converter _unused11 = new System.ComponentModel.Int64Converter();
    private static System.ComponentModel.UInt64Converter _unused12 = new System.ComponentModel.UInt64Converter();
    private static System.ComponentModel.DoubleConverter _unused13 = new System.ComponentModel.DoubleConverter();
    private static System.ComponentModel.SingleConverter _unused14 = new System.ComponentModel.SingleConverter();
    private static System.ComponentModel.BooleanConverter _unused15 = new System.ComponentModel.BooleanConverter();
    private static System.ComponentModel.StringConverter _unused16 = new System.ComponentModel.StringConverter();
    private static System.ComponentModel.DateTimeConverter _unused17 = new System.ComponentModel.DateTimeConverter();
    private static System.ComponentModel.EnumConverter _unused18 = new System.ComponentModel.EnumConverter(typeof(<any your enum>));
    private static System.ComponentModel.TimeSpanConverter _unused19 = new System.ComponentModel.TimeSpanConverter();

这样就避免代码被裁剪。


游戏成功运行。

0
0
查看评论

System.MissingMethodException:+Method+not+found:+解决方案

中文版本提示:System.MissingMethodException: 找不到方法:... 英文版本提示:System.MissingMethodException: Method not found:... 导致此异常的原因是引用程集版本冲突,通常可能是因为同一个项目(
  • jglie
  • jglie
  • 2011-10-11 15:45
  • 12180

Unity IL2CPP Bug : IL2CPP error for method 'System.Void <PrivateImplementationDetails>::.ctor()'

Unity IL2CPP Bug : IL2CPP error for method 'System.Void <PrivateImplementationDetails>::.ctor()'
  • cp790621656
  • cp790621656
  • 2016-02-25 11:07
  • 2991

fastjson解析json时报错default constructor not found. class............

fastjson解析json时报错default constructor not found. class............. http://blog.csdn.net/pengpenggxp/article/details/39181859 实体类需要有一个空...
  • Rodulf
  • Rodulf
  • 2016-06-30 15:23
  • 2578

unity 导出包后 xcode build 报错il2cpp_codegen_initialize_method

unity 导出包后 xcode 编译报错 错误关键信息: il2cpp_codegen_initialize_method 以下是网上找到的问题解决: bug: Hey guys - I just upgraded a project from Unity ...
  • z9895512
  • z9895512
  • 2016-02-26 15:58
  • 2904

iOS平台Unity引擎的IL2CPP机制分析及安全性评估

研究背景 Iphone5S以上(包括5S以上的机型)的机器中都采用了64位的CPU,苹果为了更好发挥64位CPU运行速度,APP Store发布规定:全新App必须在15年2月1日支持64位CPU,已经上架的游戏必须在15年6月1日更新的时候支持64位,否则不能通过苹果官方的审核。 ...
  • ykr168age
  • ykr168age
  • 2017-03-13 16:46
  • 802

Unity:iOS可执行程序超过80MB问题及各版本IL2CPP对比

http://www.jianshu.com/p/acd02674b57e测试版本: Unity 4.x 都是IL2CPP惹的祸Unity的IL2CPP技术,会把所有的DLL中的IL代码转换成C++。这造成了最终编译的可执行文件大小激增。一些大的项目,在上传App Store时会出现大小超载的提示:...
  • chepy
  • chepy
  • 2016-07-07 09:49
  • 1741

Unity使用IL2CPP构建IOS64位中System.Enum.IsDefined的问题

今天突然想起来特地开通一下博客,只想记录自己在开发工程中所经历的各种问题,然后分享给大家!以便给更多人解决可能的困扰。 由于从2015年2月1日起,上传到App Store的IOS应用必须包含对64位系统的支持,并且必须使用Xcode6或更高版本中的ios8  SDK编译。 然后unity...
  • wang_ween
  • wang_ween
  • 2015-04-14 14:50
  • 1803

4.6.x IL2CPP问题汇总

使用4.6.x发布64bit游戏时, 需要用到IL2CPP做scriptingEnd. 过程中遇到了一些问题,一一记录如下。 1. 4.6.3使用IL2CPP后, ICSharpCode的ZipInputSteam read返回值不对,在64bit下不会返回0,导致解压缩一个文件夹时,持续写入第一个...
  • MichaelPengCN
  • MichaelPengCN
  • 2016-02-11 03:47
  • 3389

解决Banshee 启动后异常退出的问题

解决Banshee 启动后异常退出的问题 在Ubuntu上,启动Banshee后,有时会发生Banshee立刻退出的情况。通过从命令行启动banshee,发现报出如下异常。 Unhandled Exception: GLib.GException: No such file or director...
  • jackyyen
  • jackyyen
  • 2014-06-06 13:59
  • 1144

Unity3d IOS 64 IL2CPP迁移之 AStarPath JosnFX 错误

在为公司的Unity3d游戏从Mono迁移到IOS 64过程中,出现了许多问题。在看到Xcode提示Build Success时会有一种成就感油然而生,但是噩梦才刚刚开始。由于IL2CPP的不完善或者说这种把C#代码转换成C++的方式太粗暴,不仅在Build阶段会出现很多错误,在运行期出现的异常崩溃...
  • cp790621656
  • cp790621656
  • 2015-02-28 15:32
  • 6998
    个人资料
    • 访问:1395657次
    • 积分:17230
    • 等级:
    • 排名:第682名
    • 原创:334篇
    • 转载:109篇
    • 译文:6篇
    • 评论:292条
    我的Github
    @ThisisGame
    博客专栏
    最新评论