您好,我们想添加一个Validation检查,判断某些情况下NiagaraSystem的LoopBehavior是Once还是Infinite,而LoopBehavior是在蓝图中定义的。请问有什么方法获取到这个参数的值?
您好,
感谢您的咨询。
请查看这个 UDN 页面中关于查询 Niagara Loop Behavior 等信息的内容:
[Content removed]
从虚幻引擎 5.4 版本开始,“Loop Behavior” 也被保存在 Niagara 系统上的 FNiagaraSystemStateData 结构体中,但是这个类型目前并没有暴露给 Niagara 模块以外的代码。
这里是相关的 UDN 链接:
[Content removed]
您好,
感谢您的回复。
我们目前使用的是5.3版本,目前没有升级引擎的打算,所以尝试了第一个链接的方法(代码如下)。奇怪的是这样获取到的Niagara Variable,里面的VarData都是空的,导致没办法通过GetValue获得值,请问是什么原因或可以正确获得值的方式
[Image Removed]
`void GatherNiagaraSystemUpdateScriptVariables(TSoftObjectPtr InSystem, TArray& OutVariables)
{
OutVariables.Empty();
UNiagaraScript* Script = InSystem->GetSystemUpdateScript();
UNiagaraScriptSource* Source = Cast(Script->GetLatestSource());
UNiagaraGraph* ScriptSourceGraph = Source->NodeGraph;
TArray<UEdGraphNode*> NodesToProcess = ScriptSourceGraph->Nodes;
TArray Result;
for (UEdGraphNode* Node : NodesToProcess)
{
if (IsValid(Node))
{
if (const UNiagaraNodeFunctionCall* NodeFunctionCall = Cast(Node))
{
UNiagaraScript* NodeScript = NodeFunctionCall->FunctionScript;
if (const UNiagaraScriptSource* NodeScriptSource = Cast(NodeScript->GetLatestSource()))
{
const UNiagaraGraph* NodeScriptSourceGraph = NodeScriptSource->NodeGraph;
OutVariables.Append(NodeScriptSourceGraph->FindStaticSwitchInputs());
}
}
}
}
}`
您好,
这个函数是怎样获取到 UNiagaraSystem 引用的?您可以检查一下这个 System 上面的 Update Script 或者任何 Emitter 中的静态参数有正确初始化吗?
除此之外,还有一个可能方案是从 System 上 SystemUpdateScript 中的 RapidIterationParameters 查询“Constants.SystemState.Loop Count” 参数(0表示无限循环,1表示循环一次,>1表示多次循环)。
您好,非常感谢您的回复。
这个函数在EditorUtilityWidget里调用的,目前测试代码是直接在蓝图里指向了一个NiagaraSystem(图1),是不是需要调用哪个初始化的方法?我在同一个地方调用NiagaraValidation::ValidateAllRulesInSystem会发现UNiagaraStackModuleItem* SourceModule = Cast<UNiagaraStackModuleItem>(Context.Source)也是空的。
SystemUpdateScript 中的 RapidIterationParameters里的System参数只有Loop Delay和Loop Duration,没有Loop Count,是不是我的获取方式也有问题。
[Image Removed]
尝试了一下,在正常Validation流程里获取的VarData的值也是空的。
例如如下代码在if (Var.GetName() == TEXT(“Loop Behavior”))里断点,VarData的值是空的。
[Image Removed]
`void UNiagaraValidationRule_LifeCycleNotInfinite::CheckValidity(const FNiagaraValidationContext& Context, TArray& OutResults) const
{
UNiagaraSystem& System = Context.ViewModel->GetSystem();
if (System.IsValid())
{
UNiagaraScript* Script = System.GetSystemUpdateScript();
UNiagaraScriptSource* Source = Cast(Script->GetLatestSource());
if (!IsValid(Source)) return;
{
if (!IsValid(Source)) return;
UNiagaraGraph* ScriptSourceGraph = Source->NodeGraph;
TArray<UEdGraphNode*> NodesToProcess = ScriptSourceGraph->Nodes;
TArray Result;
for (UEdGraphNode* Node : NodesToProcess)
{
if (IsValid(Node))
{
if (const UNiagaraNodeFunctionCall* NodeFunctionCall = Cast(Node))
{
UNiagaraScript* NodeScript = NodeFunctionCall->FunctionScript;
#if WITH_EDITORONLY_DATA
FNiagaraAssetVersion NodeVersion = NodeScript->GetExposedVersion();
if (const UNiagaraScriptSource* NodeScriptSource = Cast(NodeScript->GetSource(NodeVersion.VersionGuid)))
{
const UNiagaraGraph* NodeScriptSourceGraph = NodeScriptSource->NodeGraph;
for (FNiagaraVariable Var :NodeScriptSourceGraph->FindStaticSwitchInputs())
{
if (Var.GetName() == TEXT(“Loop Behavior”))
{
const UEnum* Enum = Var.GetType().GetEnum();
FNiagaraInt32 EnumIntValue;
EnumIntValue.Value = Enum->GetValueByIndex(0);
}
}
}
#endif
}
}
}
}
}
}`
您好,
我们还在处理这个问题,有进展会立刻告知您。
您好,
我们确认了可以直接通过 NiagaraGraph 上的 Pin 获取到 Loop Behavior 信息。以下链接中的问题提供了获取 System State 以及 Emitter State 模块的示例代码。请注意这个页面中的问题原文是日文。
[Content removed]
如果您有更多疑问,请随时联系我们。