美文网首页
Unity——tolua项目从5.x升级到2018的踩坑记录

Unity——tolua项目从5.x升级到2018的踩坑记录

作者: 战斗力五只鹅 | 来源:发表于2021-04-08 17:42 被阅读0次

    Unity5.x的tolua项目升级64位

    2020年初接手了一个项目,用Unity5.x + tolua + ngui开发,为什么2020年还有用Unity5开发游戏、到死也不升级技术方案的公司啊我摔!接手之后要上谷歌商店不得不升级版本来打包64位APP,踩了超多坑,这里记录一下。

    1. 用Unity2018 lts版打开5.x项目后的报错解决

    注意:报错太多可能是编译错误导致的,比如console报了几百条错,实际只需要把关键的几条报错解决,编译通过后其他报错就自然消失了。如果有console pro插件,不要看这个插件的报错,要看unity自带的console报错,因为在编译出错时可能会导致console pro本身出错,导致日志显示不全。

    console pro和unity console对比
    • 插件脚本中有编译错误

    更新插件BuildReport和QHierarchy

    • 文件中多出莫名其妙的字符产生编译错误,删掉即可。
    文件结尾.png
    • dll重复错误
      5.x版本的Unity是可以有多个相同的dll的,而升级到Unity2018后不可以,需要把重复的dll删除只留一个。
      (可以把需要删除的dll原地压缩一下,代替删除)

      • 5.x中用的是单独的System.Data.dll,而2018的unity自带了System.Data.dll。
      • Framework和ThirdPackage都有一个excel.dll,删除了ThirdPackage的excel.dll
      重复的Excel.dll
    • tolua的wrap脚本文件中有编译错误
    wrap脚本编译错误.png

    注释掉wrap文件中编译错误的代码,重新生成wrap文件。

    重新生成wrap文件时,生成ParticleSystem时部分函数报空导致生成中断

    ParticleSystem生成wrap文件时在SetParticles函数处突然报错中断 GetElementType()返回null导致MakeGenericType报错中断

    暂时先取消对ParticleSystem类的生成,如果需要lua中操作ParticleSystem,把整个操作封装到C#层。
    这个可能是因为项目中用的tolua版本太老了,后续有时间升级下tolua试试。

    现在编译错误已经全部解决,Editor下运行游戏,一切正常。

    2. windows用Unity2018打包apk时的报错解决

    • excel.dll无法读取表格

    自定义的打包逻辑中用到了ExcelDataReader这个库来打表,5.x是正常的,升级2018后这个工具无法读取到表格数据。大概是由于原来项目中的ExcelDataReader库太老旧了,csdn上下载了个新的编译好的ExcelDataReader库,替换项目中的Excel.dll和ICSharpCode.SharpZipLib.dll,重新测试,打表成功。

    旧版的ExcelDataReader库在Unity2018上无法读取到.xlsx
    • 打apk包时wrap文件中有编译错误导致打包中断。
    'Light' does not contain a definition for 'SetLightDirty' and no accessible extension method 'SetLightDirty' 
    accepting a first argument of type 'Light' could be found (are you missing a using directive or an assembly reference?)
    
    Property or indexer 'QualitySettings.streamingMipmapsRenderersPerFrame' cannot be assigned to -- it is read only
    
    Error building Player because scripts had compiler errors
    

    参照unity论坛 build-error light-does-not-contain-a-definition-for-setlightdirty下的回复,SetLightDirty在Android环境下不存在,因此打包会编译错误。所以调用这种函数时应该加编译条件,但这里的wrap文件都是自动生的,没法加编译条件。

    参照LuaFramework_UGUI/issues下的回复,QualitySettings和Light不要导出。

    xlua也有同样的问题xLua/issues,不过xlua可以黑名单单独过滤某个函数。

    3. windows下打包64位apk的报错解决

    • 打包Android时il2cpp失败
    Failed running D:\Unity\2018.4.22f1\Editor\Data\il2cpp/build/il2cpp.exe --convert-to-cpp --emit-null-checks --enable-array-bounds-check --dotnetprofile="unityaot" --compile-cpp --libil2cpp-static --platform="Android" --architecture="ARMv7" --configuration="Release" --outputpath="F:\UnityProjects\XXZT_2018\Client\Temp\StagingArea\assets\bin\Data\Native\armeabi-v7a\libil2cpp.so" --cachedirectory="F:\UnityProjects\XXZT_2018\Client\Assets\..\Library\il2cpp_android_armeabi-v7a/il2cpp_cache" --additional-include-directories="D:\Unity\2018.4.22f1\Editor\Data\PlaybackEngines\AndroidPlayer/Tools\bdwgc/include" --additional-include-directories="D:\Unity\2018.4.22f1\Editor\Data\PlaybackEngines\AndroidPlayer/Tools\libil2cpp/include" --additional-libraries="F:\UnityProjects\XXZT_2018\Client\Assets/Plugins/BuglyPlugins/iOS/BuglyBridge/libBuglyBridge.a" --tool-chain-path="D:/android-ndk-r16b-windows-x86_64/android-ndk-r16b" --map-file-parser="D:\Unity\2018.4.22f1\Editor\Data\Tools\MapFileParser\MapFileParser.exe" --directory="F:\UnityProjects\XXZT_2018\Client\Temp\StagingArea\assets\bin\Data\Managed" --generatedcppdir="F:\UnityProjects\XXZT_2018\Client\Temp\StagingArea\Il2Cpp\il2cppOutput" 
    stdout:
    Building libil2cpp.so with AndroidToolChain
        Output directory: F:\UnityProjects\XXZT_2018\Client\Temp\StagingArea\assets\bin\Data\Native\armeabi-v7a
        Cache directory: F:\UnityProjects\XXZT_2018\Client\Library\il2cpp_android_armeabi-v7a\il2cpp_cache
    ObjectFiles: 758 of which compiled: 758
        Time Compile: 38557 milliseconds Il2CppAttributes.cpp
        Time Compile: 26065 milliseconds Il2CppInvokerTable.cpp
        Time Compile: 18923 milliseconds Bulk_Assembly-CSharp_8.cpp
        Time Compile: 14814 milliseconds Il2CppTypeDefinitions.cpp
        Time Compile: 12752 milliseconds Bulk_Generics_4.cpp
        Time Compile: 12398 milliseconds Bulk_Generics_3.cpp
        Time Compile: 12242 milliseconds Il2CppMetadataUsage.cpp
        Time Compile: 11586 milliseconds Bulk_Assembly-CSharp_53.cpp
        Time Compile: 10058 milliseconds Bulk_Assembly-CSharp_47.cpp
        Time Compile: 10054 milliseconds Bulk_Generics_2.cpp
    Total compilation time: 248697 milliseconds.
    il2cpp.exe didn't catch exception: Unity.IL2CPP.Building.BuilderFailedException: D:\android-ndk-r16b-windows-x86_64\android-ndk-r16b\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++ @"C:\Users\Yunkun123\AppData\Local\Temp\tmpA93D.tmp" -o "F:\UnityProjects\XXZT_2018\Client\Library\il2cpp_android_armeabi-v7a\il2cpp_cache\linkresult_39373350752C7370D578BCDF56E18453\libil2cpp.so" -shared -Wl,-soname,libil2cpp.so -Wl,--no-undefined -Wl,-z,noexecstack -Wl,--gc-sections -Wl,--build-id --sysroot "D:\android-ndk-r16b-windows-x86_64\android-ndk-r16b\platforms\android-16\arch-arm" -gcc-toolchain "D:\android-ndk-r16b-windows-x86_64\android-ndk-r16b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64" -target armv7-none-linux-androideabi -Wl,--wrap,sigaction -L "D:\android-ndk-r16b-windows-x86_64\android-ndk-r16b\sources\cxx-stl\gnu-libstdc++\4.9\libs\armeabi-v7a" -lgnustl_static -llog -rdynamic -fuse-ld=gold.exe "F:\UnityProjects\XXZT_2018\Client\Assets\Plugins\BuglyPlugins\iOS\BuglyBridge\libBuglyBridge.a"
    D:\android-ndk-r16b-windows-x86_64\android-ndk-r16b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin\ld.gold.exe: error: F:\UnityProjects\XXZT_2018\Client\Assets\Plugins\BuglyPlugins\iOS\BuglyBridge\libBuglyBridge.a:1:1: invalid character
    clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
       �� Unity.IL2CPP.Building.CppProgramBuilder.PostprocessObjectFiles(HashSet`1 objectFiles, CppToolChainContext toolChainContext)
       �� Unity.IL2CPP.Building.CppProgramBuilder.Build(IBuildStatistics& statistics)
       �� il2cpp.Program.DoRun(String[] args)
       �� il2cpp.Program.Run(String[] args)
       �� il2cpp.Program.Main(String[] args)
    stderr:
    δ��������쳣:  Unity.IL2CPP.Building.BuilderFailedException: D:\android-ndk-r16b-windows-x86_64\android-ndk-r16b\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++ @"C:\Users\Yunkun123\AppData\Local\Temp\tmpA93D.tmp" -o "F:\UnityProjects\XXZT_2018\Client\Library\il2cpp_android_armeabi-v7a\il2cpp_cache\linkresult_39373350752C7370D578BCDF56E18453\libil2cpp.so" -shared -Wl,-soname,libil2cpp.so -Wl,--no-undefined -Wl,-z,noexecstack -Wl,--gc-sections -Wl,--build-id --sysroot "D:\android-ndk-r16b-windows-x86_64\android-ndk-r16b\platforms\android-16\arch-arm" -gcc-toolchain "D:\android-ndk-r16b-windows-x86_64\android-ndk-r16b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64" -target armv7-none-linux-androideabi -Wl,--wrap,sigaction -L "D:\android-ndk-r16b-windows-x86_64\android-ndk-r16b\sources\cxx-stl\gnu-libstdc++\4.9\libs\armeabi-v7a" -lgnustl_static -llog -rdynamic -fuse-ld=gold.exe "F:\UnityProjects\XXZT_2018\Client\Assets\Plugins\BuglyPlugins\iOS\BuglyBridge\libBuglyBridge.a"
    D:\android-ndk-r16b-windows-x86_64\android-ndk-r16b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin\ld.gold.exe: error: F:\UnityProjects\XXZT_2018\Client\Assets\Plugins\BuglyPlugins\iOS\BuglyBridge\libBuglyBridge.a:1:1: invalid character
    clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
       �� Unity.IL2CPP.Building.CppProgramBuilder.PostprocessObjectFiles(HashSet`1 objectFiles, CppToolChainContext toolChainContext)
       �� Unity.IL2CPP.Building.CppProgramBuilder.Build(IBuildStatistics& statistics)
       �� il2cpp.Program.DoRun(String[] args)
       �� il2cpp.Program.Run(String[] args)
       �� il2cpp.Program.Main(String[] args)
    
    Exception: D:\Unity\2018.4.22f1\Editor\Data\il2cpp/build/il2cpp.exe did not run properly!
    

    "libBuglyBridge.a:1:1: invalid character",重新设置下插件类型,ios不要选android。

    打包成功。

    4. 运行64位apk的报错解决

    • apk运行wwise插件报错
    DllNotFoundException: Unable to load DLL 'AkSoundEngine: The specified module could not be found
    

    打包64位缺少Wwise的64位库,到Wwise的安装路径下看,64位的库是有的,但是Unity里的Wwise路径下确实没有64位的库。推测Wwise集成到Unity时,是根据当前项目的Unity版本来选择将哪些库集成进去,当初集成Wwise时项目还是5.x的Unity,可能就是因此Wwise不会集成64位的库。现在我们用Unity2018升级项目后,重新集成一下Wwise就好了。

    本来的版本是Wwise 2018.1.1,现在顺便更新到该大版本的最新版Wwise 2018.1.11.

    重新更新集成Wwise时记得先关闭Unity。

    升级wwise 平台选择

    选好参数,点一下Modify等着就好,时间很长......

    集成之后,要到Wwise工程里重新生成一下。

    打开Wwise工程 重新生成Wwise
    • apk运行时tolua报错
    DllNotFoundException: Unable to load DLL 'tolua': The specified module could not be found.
    

    旧版本tolua没有64的库,需要升级tolua。github下载最新的tolua-runtime,把里面的arm64-v8a下的libtolua拷贝到项目中。

    • 替换最新的64位lua文件后,运行apk报错:

    LuaException: tolua.lua: cannot load incompatible bytecode

    5. mac下的报错解决

    mac下拉取windows下升级到2018之后的项目。

    • Editor运行游戏,加载lua文件报错中断。
    LuaException: xxxPath/xxxLuaFile:1: unexpected symbol near '�'
    stack traceback:
        [C]: ?
        [C]: in function 'require'
    

    require加载某些lua文件,被加载的文件第一行第一个字符就报错,符号无法识别。
    用vscode查看lua文件的编码,发现无法加载的lua文件,编码是UTF-8 with BOM,而可以正常加载的lua文件,编码是UTF-8。如果lua文件用windows记事本打开过,就会自动变为带BOM头的格式,在windows下不影响,但在mac下就会无法加载。用vscode的save with encoding把lua文件重新存储为UTF-8格式,即可重新正常加载运行。

    无法加载的lua文件编码 正常可以加载的lua文件编码

    相关文章

      网友评论

          本文标题:Unity——tolua项目从5.x升级到2018的踩坑记录

          本文链接:https://www.haomeiwen.com/subject/onlzihtx.html