Unity3d IOS 64 IL2CPP遷移之 AStarPath JosnFX 錯誤

來源:互聯網
上載者:User

標籤:unity   cpp   c++   xcode   il2cpp   

在為公司的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 

從字面上來看,沒有預設的建構函式?

什麼鬼。

但是根據異常來看,異常指向了系統函數……


沒辦法只有Google。

在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();

這樣就避免代碼被裁剪。


遊戲成功運行。

Unity3d IOS 64 IL2CPP遷移之 AStarPath JosnFX 錯誤

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.