動態

詳情 返回 返回

WebGL-編譯報錯,如何定位sendfile報錯位置 - 動態 詳情

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:我之前遇到過同樣的問題:

  1. 首選遊戲啓動的時候,桌面右下角會有個Steam的彈窗(這個有一定要有!沒有就會有問題)。
  2. 確認一下exe所在的目錄是否有權限問題,之前遇到過Steam啓動需要Windows管理員權限,所以Steam開啓其他應用時都是管理員,這個要保持一致(比如Steam在“C:\Program Files”,那exe就需要右鍵管理員啓動)。

感謝樑棟@UWA問答社區提供了回答

A2:猜測一下原因:

  1. SDK集成問題,先把IL2CPP的裁剪關了。
  2. 關閉Unity(包含Unity Hub)和Steam,重啓Steam後再運行exe。
  3. 把打包後的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

user avatar mamaster777 頭像 pipigao 頭像 huanjinliu 頭像
點贊 3 用戶, 點贊了這篇動態!
點贊

Add a new 評論

Some HTML is okay.