当前位置:网站首页>用脚本添加URP的RendererData
用脚本添加URP的RendererData
2022-06-10 17:24:00 【Edward.W】
最近遇到了一些比较奇怪的问题。
在Unity的渲染管线中,需要给URP的RenderPipeline Asset中增加一些RenderererData,这也是自定义Render Feature并且渲染的方式。具体的实现方法也很简单,准备好RendererData后,只需要再Unity的UI上点击加号就行。如下图所示:

但是实际上总是有这样那样的需求。此次需要通过脚本来动态添加这个Renderer List。 我们通过URP的源码中可以看到,这个变量不可访问,也没有对应的方法。

讲道理这样的接口应该由URP自己暴露出来,但是实际上并没有。不过既然是可序列化的变量,大概率是能够通过合法的方式操作的,但是并不打算让你访问,所以这边只能够通过反射的方式来添加了。
直接上代码:
var proInfo = typeof(UniversalRenderPipelineAsset).GetField("m_RendererDataList",
BindingFlags.NonPublic | BindingFlags.Instance);
if (proInfo != null)
{
rendererDataList = (ScriptableRendererData[])proInfo.GetValue(UniversalRenderPipeline.asset);
var newList = new ScriptableRendererData[rendererDataList.Length+1];
for (int i = 0; i < rendererDataList.Length; i++)
{
newList[i] = rendererDataList[i];
newList[rendererDataList.Length] = newRendererData;
}
proInfo.SetValue(GraphicsSettings.currentRenderPipeline, newList);
}首先先通过反射获取到对应的Field,然后强制转化为对应的rendererDataList,这时候就能够获取整个列表了。
但是这里有个问题,如果我们直接修改了List,实际上是不会生效的,因为此时的rendererDataList只是我们的一个变量,指向的位置才是真正的列表,如果我们直接:
rendererDataList = new ScriptableRendererData[10];
这样的话相当于是重新new了一个变量,是无法改变PipeLine Asset里面的列表。因此,此处还需要使用SetValue方法把新的值放回才能生效。
于是,在代码里的方法就是new一个ScriptableRendererData数组,先把获取到的列表内容塞进去,再把自定义的RendererData放到最后。再用SetValue方法来更新对应的asset。
实测在Editor和Runtime中都能够生效。
边栏推荐
- 企鹅电竞停步,虎牙也难行
- 领导提拔你的原因,只有这点最真实,其他都是瞎扯!
- 信息学奥赛一本通 1280:【例9.24】滑雪 | OpenJudge NOI 2.6 90:滑雪 | 洛谷 P1434 [SHOI2002] 滑雪
- LeetCode 321. Maximum number of splices***
- 正斜杠“/”、反斜杠“\、”转义字符“\”、文件路径分割符傻傻记不清楚
- Noise line h5js effect realized by canvas
- AI 加持实时互动|ZegoAvatar 面部表情随动技术解析
- Why 0.1+0.2=0.3000000000000004
- Play with pytoch's function class
- 牛客网:两数之和
猜你喜欢

2022 version of idea graphical interface GUI garbled code solution super detailed simple version

IP总结(TCP/IP卷1和卷2)

Nacos configuration management

《华为数据之道》读书笔记

训练时添加进度条的库--tqdm

绘制混淆矩阵

One of the Taobao short video pit avoidance Guide Series -- thoroughly understand Taobao short video

mmdetection之dataset类解读
![[FAQ] summary of common problems and solutions during the use of rest API interface of sports health service](/img/93/d999239b28afb2d9a61e9aad27d2cd.png)
[FAQ] summary of common problems and solutions during the use of rest API interface of sports health service

盛最多水得容器
随机推荐
Classic topics of leetcode tree (I)
Abbexa 8-OHdG CLIA 试剂盒解决方案
LoRa模块无线收发通信技术详解
CDGA|工业企业进行数据治理的六个关键点
Jouer avec la classe de fonctions de pytorch
关于cmake和gcc的安装的记录
JS blur shadow follow animation JS special effect plug-in
淘宝短视频避坑指南系列之一--彻底了解淘宝短视频
Why does the universe limit its maximum speed to the speed of light
CUDA编程(一):实现两个数组相加
Canvas fire burning H5 animation JS special effects
mmcv之Config类介绍
LeetCode 255. Verifying preorder traversal sequence binary search tree*
蓝桥杯_挑选子串_组合数学_乘法原理_ / 尺取法
玩转Pytorch的Function类
mmdetection之model构建
基于业务沉淀组件 =&gt; manage-table
if else的使用太简单?(看懂这篇你的逻辑会进一步提升)
高数_第6章无穷级数__正项级数的性质
盛最多水得容器