关于script:如何动态获取URP设置里自定义的RenderFeatures

33次阅读

共计 2951 个字符,预计需要花费 8 分钟才能阅读完成。

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(原群已满员)

正文完
 0