UE4:Niagara添加获取FeatureLevel的方法
前言
TA大佬希望在NiagaraScript中可以有一个类似于材质的FeatureLevelSwitch的节点,让我帮忙看看能不能搞
我很费解啊这个事情.jpg
咨询了leader之后,决定扩展一个Niagara的DataInterface来支持CPU粒子获取FeatureLevel的信息
具体需求
在NiagaraScript中可以通过添加FeatureLevel引脚,引出两个Get方法,获取当前的特征等级是否为ES31或者SM5,如下图:
解决方案
这里参考了原生的一些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可以获取正确的效果