头图

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


侑虎科技
62 声望21 粉丝

UWA官网:[链接]