1)WebGL-編譯報錯,如何定位sendfile報錯位置
2)設置DepthBufferBits和設置DepthStencilFormat的區別
3)Unity打包exe後,遊戲內拉不起Steam的內購
4)使用了Play Asset Delivery提交版本被Google報錯
這是第395篇UWA技術知識分享的推送,精選了UWA社區的熱門話題,涵蓋了UWA問答、社區帖子等技術知識點,助力大家更全面地掌握和學習。
UWA社區主頁:community.uwa4d.com
UWA QQ羣:793972859
Platform
Q:找了資料,也請教了同行。均反饋是因為WebGL平台限制了System.IO的一些類、方法導致的。但是經過嘗試,把項目中所有的System.IO都做了封裝,依舊出現此編譯報錯。
不知道有沒有什麼更好的辦法,定位到sendfile這個報錯的具體位置,比如:某個腳本的引用、或者類、或者方法等,更為詳細的一些信息?
完整報錯信息如下:
Building Library\Bee\artifacts\WebGL\build\debug_WebGL_wasm\build.js failed with output:
emcc2: warning: C:\Users\ADMINI~1\AppData\Local\Temp\tmpszj8f2k_libxlua.a: archive is missing an index; Use emar when creating libraries to ensure an index is created [-Wemcc]
emcc2: warning: C:\Users\ADMINI~1\AppData\Local\Temp\tmpszj8f2k_libxlua.a: adding index [-Wemcc]
error: undefined symbol: sendfile (referenced by top-level compiled C/C++ code)
warning: Link with `-s LLD_REPORT_UNDEFINED` to get more information on undefined symbols
warning: To disable errors for undefined symbols use `-s ERROR_ON_UNDEFINED_SYMBOLS=0`
warning: _sendfile may need to be added to EXPORTED_FUNCTIONS if it arrives from a system library
Error: Aborting compilation due to previous errors
emcc2: error: '"C:/Program Files/Unity 2022.1.24f1/Editor/Data/PlaybackEngines/WebGLSupport/BuildTools/Emscripten/node/node.exe" "C:\Program Files\Unity 2022.1.24f1\Editor\Data\PlaybackEngines\WebGLSupport\BuildTools\Emscripten\emscripten\src\compiler.js" C:\Users\ADMINI~1\AppData\Local\Temp\tmpz3_8ynyl.txt' failed (1)
UnityEditor.GenericMenu:CatchMenu (object,string[],int)
A:sendfile大概率不是IO接口,而是網絡Socket的接口。WebGL限制不能用C# System.Net.*命名空間。要定位函數名,建議從IL2CPP結果裏找。
打開Unity,觸發WebGL打包,出現報錯後,Unity先別關。Unity會把轉換的中間結果的cpp代碼生成到項目il2cppOutput目錄,舊版Unity是放在Temp目錄裏,新版Unity的Bee構建結果不確定是不是在Temp目錄裏,但最終應該也一樣能在工程裏搜到il2cppOutput目錄。
在il2cppOutput目錄裏直接字符串搜索下sendfile就知道是什麼命名空間或者方法被引入了。
感謝裹面過油炸@UWA問答社區提供了回答
Rendering
Q:請教一下,RT裏面設置DepthBufferBits和設置DepthStencilFormat有什麼不同嗎?
A:DepthBufferBits僅指定深度緩衝區的位數。DepthStencilFormat可以同時指定深度緩衝區和模板緩衝區的格式和精度。
如果你只需要深度緩衝區,那麼DepthBufferBits可能就足夠了。如果你需要用模板緩衝區,那麼使用DepthStencilFormat會更合適。
感謝蕭小俊@UWA問答社區提供了回答
Platform
Q:在Unity編輯器裏是可以拉起內購界面,但是無法點擊。打包出exe,內購界面是拉不起的。用的是Steamworks.NET,編輯器和exe的環境服務器都是一樣的,steam_appid也是對的。求解答!
A1:我之前遇到過同樣的問題:
- 首選遊戲啓動的時候,桌面右下角會有個Steam的彈窗(這個有一定要有!沒有就會有問題)。
- 確認一下exe所在的目錄是否有權限問題,之前遇到過Steam啓動需要Windows管理員權限,所以Steam開啓其他應用時都是管理員,這個要保持一致(比如Steam在“C:\Program Files”,那exe就需要右鍵管理員啓動)。
感謝樑棟@UWA問答社區提供了回答
A2:猜測一下原因:
- SDK集成問題,先把IL2CPP的裁剪關了。
- 關閉Unity(包含Unity Hub)和Steam,重啓Steam後再運行exe。
- 把打包後的exe放到非中文路徑下運行。
感謝蕭小俊@UWA問答社區提供了回答
Platform
Q:Google Play選擇了Target API Level 34之後,如果項目使用了Play Asset Delivery功能提交版本,會被Google報錯(關於Foreground Services Permissions)。
前述截圖中,點擊Go to declaration後,展示一個空列表,並沒有説明我要求了哪些 Permission。
嘗試解決,在AndroidManifest中加入如下內容(想辦法去除權限),仍然不能解決問題:
<!-- Foreground Services permissions -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" tools:node="remove" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" tools:node="remove" />
A1:前台服務類型就幾種,用以下官方文檔跟你目前的權限對照一下:
https://developer.android.google.cn/develop/background-work/s...
感謝蕭小俊@UWA問答社區提供了回答
A2:33版本,Play Asset Delivery的install-time模式不需要任何權限。如果34版本不行,可以降到33版本。因為我搜索了下Google Play Asset Delivery,並不需要任何權限。而且我反編譯了自己的項目,裏面也沒有任何多餘的權限。
感謝qingfeng@UWA問答社區提供了回答
A3: 據我瞭解,谷歌強制的就是要升到34(最晚可延期到2024.11.1),其實是需要權限的,藏在Asset Delivery庫裏。
感謝加菲教主@UWA問答社區提供了回答
封面圖來源於網絡
今天的分享就到這裏。生有涯而知無涯,在漫漫的開發週期中,我們遇到的問題只是冰山一角,UWA社區願伴你同行,一起探索分享。歡迎更多的開發者加入UWA社區。
UWA官網:www.uwa4d.com
UWA社區:community.uwa4d.com
UWA學堂:edu.uwa4d.com
官方技術QQ羣:793972859