1)如何动静获取URP设置里自定义的RenderFeatures
2)UGUI里,把UI丢回池里,把计划SetActive(false)办法的最佳
3)Prefab中m_Text会主动换行导致搜寻不到
4)URP变体优化shader_feature,MAIN_LIGHT_SHADOWS关键字废除
这是第295篇UWA技术常识分享的推送。明天咱们持续为大家精选了若干和开发、优化相干的问题,倡议浏览工夫10分钟,认真读完必有播种。
UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)
Script
Q:咱们在URP我的项目中自定义了多个RenderFeatures去实现游戏成果,当初想动静开启和敞开相干的RenderFeatures,请问怎么在代码里动静获取这些Features呢?
A:咱们应用反射获取,供参考:
public static class ScriptableRendererExtension{ private static readonly Dictionary<ScriptableRenderer, Dictionary<string, ScriptableRendererFeature>> s_renderFeatures = new Dictionary<ScriptableRenderer, Dictionary<string, ScriptableRendererFeature>>(); public static ScriptableRendererFeature GetRendererFeature(this ScriptableRenderer renderer, string name) { if (!s_renderFeatures.TryGetValue(renderer, out var innerFeatures)) { var propertyInfo = renderer.GetType().GetProperty("rendererFeatures", BindingFlags.Instance | BindingFlags.NonPublic); List<ScriptableRendererFeature> rendererFeatures = (List<ScriptableRendererFeature>)propertyInfo?.GetValue(renderer); if (rendererFeatures == null) { s_renderFeatures[renderer] = null; } else { innerFeatures = new Dictionary<string, ScriptableRendererFeature>(); for (var i = 0; i < rendererFeatures.Count; i++) { var feature = rendererFeatures[i]; innerFeatures[feature.name] = feature; } s_renderFeatures[renderer] = innerFeatures; } } if (innerFeatures != null) { innerFeatures.TryGetValue(name, out var result); return result; } return null; }}
感激yqsas@UWA问答社区提供了答复
UGUI
Q:想求教下在UGUI里,把UI扔回池里,取代SetActive(false)这种低效办法的最佳计划是什么呢?具体该当怎么操作?
A1:能够尝试移到屏幕外的一个池子里,不SetActive(false),SetScale=0,Disable一些逻辑脚本,移回去的时候做相同的操作。配合一些数值初始化的操作,能够缩小UI重建的耗时。
感激小ben@UWA问答社区提供了答复
A2:能够应用Canvas Group,扭转Alpha来代替SetActive(),不会触发UI重建,咱们有些我的项目曾经应用这样的形式,成果还不错。
感激廖武兴@UWA问答社区提供了答复
Script
Q:在Prefab中的m_Text会主动换行,导致齐全匹配搜寻的时候搜寻不到,这应该怎么解决?
A:如果应用相似文本读取的形式解析Prefab,会呈现换行的问题。
能够思考应用AssetDatabase.LoadAssetAtPath来提取所有文本:
string[] dirs = { “Assets” };var asstIds = AssetDatabase.FindAssets(“t:Prefab”, dirs);for (int i = 0; i < asstIds.Length; i++){string path = AssetDatabase.GUIDToAssetPath(asstIds[i]);var obj = AssetDatabase.LoadAssetAtPath(path);var text = obj.GetComponent();Debug.Log(text.text);}
感激萧小俊@UWA问答社区提供了答复
Shader
Q:为了优化变体数量,将URP Shader中的multi_compile改成了shader_feature,而后遍历所有场景角色,收集一个变体和所有Shader打在了一个AssetBundle中。后果就是PC包的变体失常,然而Android包的变体却失落了局部Keywords,次要是这个_MAIN_LIGHT_SHADOWS。
PC包:
Android包:
下面所有的关键字都是shader_feature定义的,然而只失落_MAIN_LIGHT_SHADOWS和_MAIN_LIGHT_SHADOWS_CASCADE。
而后通过AssetStudio排查在shader.ab内编译后的Shader文件,也可能找到这个变体,阐明这个变体实际上是在包内的。
再测试将Shader中的shader_feature还原成multi_compile模式,Android包的变体显示也都正确了,跟PC一样。
大家有遇到过相似的URP管线丢变体问题么?
A:找到起因了,遍历场景收集变体的代码写的有点问题,收集的时候Editor是PC平台,只思考了开启暗影+Cascade的时候的变体。
所以PC上同时存在_MAIN_LIGHT_SHADOWS和_MAIN_LIGHT_SHADOWS_CASCADE关键字,体现是失常的。
而Android机器上没开启级联暗影,所以只有这个关键字_MAIN_LIGHT_SHADOWS,其实变体没有收集到。
感激题主范世青@UWA问答社区提供了答复
封面图来源于网络
明天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题兴许都只是冰山一角,咱们早已在UWA问答网站上筹备了更多的技术话题等你一起来摸索和分享。欢送酷爱提高的你退出,兴许你的办法恰能解他人的当务之急;而他山之“石”,也能攻你之“玉”。
官网:www.uwa4d.com
官网技术博客:blog.uwa4d.com
官网问答社区:answer.uwa4d.com
UWA学堂:edu.uwa4d.com
官网技术QQ群:793972859(原群已满员)