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本身出错,导致日志显示不全。
- 插件脚本中有编译错误
更新插件BuildReport和QHierarchy
- 文件中多出莫名其妙的字符产生编译错误,删掉即可。
-
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
- tolua的wrap脚本文件中有编译错误
注释掉wrap文件中编译错误的代码,重新生成wrap文件。
重新生成wrap文件时,生成ParticleSystem时部分函数报空导致生成中断。
暂时先取消对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,重新测试,打表成功。
- 打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。
选好参数,点一下Modify等着就好,时间很长......
集成之后,要到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格式,即可重新正常加载运行。