1)安卓包在真机上安装时的“风险提示”问题
2)iOS下AssetBundle的加载疑问
3)特效用粒子系统,模拟器里出现花屏问题
4)IL2CPP编译的Protobuf,反射类运行时报空
这是第321篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。
Android
Q:最近在安卓真机上安装游戏的过程中突然出现了风险提示(以前没有)。有的手机甚至需要输入密码授权才能安装。
如图:
不知道有没有大佬们最近也遇到了这样的问题,可否提供个修改的思路?
A:首先是32位问题,这个是必然要升级的不要挣扎了。至于风险提示和密码授权,都是国内手机的问题。Rom里面限制了你不上架它的商店就会有这种提示。OPPO限制了adb直接安装,每次要密码授权。
这些都属于研发层面无从下手的问题,能做的就是建议玩家别用国产手机。
感谢江南@UWA问答社区提供了回答
AssetBundle
Q:iOS下AssetBundle加载时候Animator上面丢失AnimatorController。
问题:
1.0版本里A.prefab是打在AssetsBundle1里面,A.prefab引用的AnimatorController 是打在AssetsBundle2里面,A.prefab上引用的其他资源在AssetsBundle3里面。
2.0版本热更新时,改变了引用文件的文件夹,A.prefab上引用的AnimatorController生成的Bundle变到了AssetsBundle3里面,A.prefab上引用的其他资源生成的Bundle变到AssetsBundle2里面。
A.prefab所在的AssetsBundle1没有变化,所以热更新下去的是AssetsBundle2和AssetsBundle3。
热更新之后加载AssetsBundle2和AssetsBundle3,再加载AssetsBundle1,运行后发现A.prefab上的Animator组件还在,但是上面的runtimeAnimatorController丢失了,变成了Missing。
有人遇到这个问题吗?
A1:有一些排查思路,首先在Android平台看下是否也有问题,排除下是否是与平台相关。另外在出问题的机器上预制体模式,如果正常则使用AssetBundle模式来加载看下是否正常,如果是Bundle问题,那可以完全删除涉及到的Bundle重新打一遍再试一下。
感谢Knight-132872@UWA问答社区提供了回答
A2:Unity上遇到这种问题,最好把A、B、C 3个AssetsBundle包先删除,再打包,让Unity全新生成,应该就好了。
感谢1 9 7 3-311135@UWA问答社区提供了回答
Simulator
Q:游戏特效用了粒子系统,其他平台都正常,就在模拟器下出现了花屏问题,时不时地花屏闪烁。
特效用了粒子系统的Mesh和Billboard两种模式,然后粒子上挂材质球,是用自己写的Shader,但是切换成Unity自带的URP粒子系统Shader,也一样花屏。不用粒子系统就不会花屏。
用RenderDoc抓帧,只分析出部分花屏,是用Mesh模式的粒子网格,顶点发生拉扯偏移产生的。但是其余花屏,查不出是哪个对象产生的问题,谁知道是怎么回事吗?
A1:可以尝试换一下Shader的采样精度。
感谢NG週@UWA问答社区提供了回答
A2:可以尝试一下把粒子特效对应Shader变量类型从fixed改为half或者float。
感谢beikeshell@UWA问答社区提供了回答
针对以上问题,有经验的朋友欢迎转至社区交流分享:
Build
Q:IL2CPP编译的Protobuf,反射类运行时报空。
问题发生时,会闪崩,闪崩日志信息:
Error_Not_Null:"c# exception:System.TypeInitializationException: The type initializer for ‘abcConfigReflection’ threw an exception. —> System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. —> System.ExecutionEngineException: Attempting to call method 'Google.Protobuf.Reflection.ReflectionUtil+ReflectionHelper`2[[System.IntPtr&, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]::.ctor’ for which no ahead of time (AOT) code was generated.\n
...
(完整日志信息,请见原问答。)
看下来是因为AOT编译时,代码剔除所致,问题非常偶现。我们的QA基本上没有跑出来过这个问题,但是放到外网就有一堆玩家遇到此问题。蹊跷的是哪怕同一个手机也是偶然才报。
Proto GitHub项目有人提过这个问题,包括下面回复主要提了两点:
1. Linker包含Google.Protobuf程序集
2. AOT编译器不会为T为Any Enum的泛型方法,针对枚举参数泛型方法创建显式调用类
https://docs.unity3d.com/cn/current/Manual/ScriptingRestrictions.html
和我这个问题不同点是,abcConfigReflection是一个类,不是枚举,而且整个项目这个类会有很多。
我用的Proto 3.6.1版本,而且Proto也在3.6.0版本修改了
> AOT generics issues in Unity/il2cpp have a workaround (see commit 1b219a1 for details)
Protobuf源码确实加了强制反射的代码:
static FileDescriptor()
{
ForceReflectionInitialization<Syntax>();
ForceReflectionInitialization<NullValue>();
ForceReflectionInitialization<Field.Types.Cardinality>();
ForceReflectionInitialization<Field.Types.Kind>();
ForceReflectionInitialization<Value.KindOneofCase>();
}
当然我有加Google.Protobuf程序集到Linker,还是不能解决。后来我加了Assembly-CSharp程序集到Linker,也就是整个自定义代码全部不剔除,目前因为不方便放外网,也不清楚有没有解决这个问题。
使用Protobuf序列化数据按讲是常规操作,相信应该有很多人遇到,不知道大家处理方案是什么,有没有解决这个问题?
针对以上问题,有经验的朋友欢迎转至社区交流分享
封面图来源于网络
今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官方问答社区:answer.uwa4d.com