UE4:Niagara添加获取FeatureLevel的方法

前言

TA大佬希望在NiagaraScript中可以有一个类似于材质的FeatureLevelSwitch的节点,让我帮忙看看能不能搞

我很费解啊这个事情.jpg

咨询了leader之后,决定扩展一个Niagara的DataInterface来支持CPU粒子获取FeatureLevel的信息

具体需求

在NiagaraScript中可以通过添加FeatureLevel引脚,引出两个Get方法,获取当前的特征等级是否为ES31或者SM5,如下图:

FeatureLevel

解决方案

这里参考了原生的一些DataInterface,继承UNiagaraDataInterface实现一个新的DataInterface

首先我参考了DataInterfaceCamera(因为前两天刚改了这个(参考之前水的文章)),准备重载PerInstanceTick,在这里进行DataInstace的赋值操作,但是考虑到Camera确实是需要tick的,但是FeatureLevel除非在编辑器情况下更改了预览,正常情况下的游戏时决定好了平台的,不会去改FeatureLevel这种东西,于是改为在InitPerInstanceData中进行数据填充。原本考虑到这里可能会影响编辑器模式下切换预览能不能及时生效,但是当尝试完成第一个版本之后发现没有问题,在编辑器模式下修改FeatureLevel之后会重新执行Init操作

FFeatureLevelDataInterface_InstanceData

新建结构体,作为DataInstance

InitPerInstanceData

重载该函数用于初始化DataInstance

GetFunctions

该函数用来添加FNiagaraFunctionSignature,包括但不限于真正使用到的函数的Name、支持的粒子类型、添加输入输出等

GetVMExternalFunction

重载来Bind函数用

GetIfES31ForCPU

具体的函数实现,填充上下文

GetIfSM5ForCPU

具体的函数实现,填充上下文

效果

这里创建了一个Debug材质,红色是ES31,绿色是SM5,在编辑器模式下切换FeatureLevel可以获取正确的效果

ES31

SM5

源码

源文件


UE4:Niagara添加获取FeatureLevel的方法
http://muchenhen.com/posts/60677/
作者
木尘痕
发布于
2022年8月21日
许可协议