Niagara 系统的自定义资产验证

科技   科技   2024-07-30 09:37   上海  

Niagara系统可能会变得非常复杂,并且通常必须遵守不同平台上的各种约束。与其给你的技术艺术家一个该做和不该做的清单,不如在Niagara编辑器中给他们实时反馈,甚至可能是一个“立即修复”按钮,这不是更好吗?这正是验证规则的用途,所以让我们看看如何使用它们以及如何创建自己的规则。

效果类型

使用验证规则的最常见方法是效果类型。您可以通过在内容浏览器中单击鼠标右键并使用“FX -> Advanced -> Niagara Effect Type”来创建新的效果类型资源。在那里,您可以逐个添加规则,也可以添加包含多个规则的规则集。如果您有一组要在多个效果类型之间共享的通用基线规则,则规则集非常方便。

具有“无预热”规则的效果类型
验证与效果类型相关联,因为通常不同类型的效果(如环境、玩家特效、武器冲击等)都有不同的要求和可伸缩性需求。这样一来,你就可以确保廉价的环境特效不使用昂贵的模块,如碰撞,或者游戏性关键模块,如武器撞击,在大世界坐标下正常工作。

项目设置

不管每个系统使用何种效果类型,验证规则也可以配置为应用于项目中的所有系统。此选项可以在“项目设置”->“Niagara 编辑器”-“默认验证规则集”>中找到。
具有默认验证规则的项目设置
模块
验证规则也可以配置为仅用于某些模块脚本。当您打开模块并查看其详细信息面板时,您将看到添加验证规则的选项。请注意,并非所有规则在添加到模块时都有用,因为它们需要在编写时考虑模块上下文。其中一个用例是检查模块是否将在当前系统和项目设置下按预期运行。
例如,碰撞模块检查系统是否不使用固定刻度 dt(因为它可以独立于物理系统进行子刻度),以及当粒子材质写入场景深度时是否不使用深度碰撞(因为粒子会与自身碰撞)。
碰撞模块中配置的验证规则
编写自定义规则
若要创建自己的验证规则,请创建一个扩展 UNiagaraValidationRule(在 NiagaraValidationRule.h 中定义)的新 UCLASS。例如,请查看 Engine/Plugins/FX/Niagara/Source/NiagaraEditor/Public/NiagaraValidationRules.h 中的现有规则
下是“无预热”规则的定义:

UCLASS(Category = "Validation", DisplayName = "No Warmup Time")

class UNiagaraValidationRule_NoWarmupTime : public UNiagaraValidationRule

{

GENERATED_BODY()

public:

virtual void CheckValidity(const FNiagaraValidationContext& Context, TArray& OutResults) const override;

};
FNiagaraValidationContext 允许您访问系统视图模型,您可以使用该模型访问 Niagara 系统和包含所有模块及其输入的当前堆栈视图。返回的结果可以包含有用的消息、警告或错误,这些消息、警告或错误将在堆栈中显示给用户。
以下是“无预热”规则的实现:
void UNiagaraValidationRule_NoWarmupTime::CheckValidity(const FNiagaraValidationContext& Context, TArray& Results) const
{
UNiagaraSystem& System = Context.ViewModel->GetSystem();
if (System.NeedsWarmup())
{
UNiagaraStackSystemPropertiesItem* SystemProperties = NiagaraValidation::GetStackEntry<uniagarastacksystempropertiesitem>(Context.ViewModel->GetSystemStackViewModel());</uniagarastacksystempropertiesitem>
FNiagaraValidationResult Result(ENiagaraValidationSeverity::Error, LOCTEXT("WarumupSummary", "Warmuptime > 0 is not allowed"), LOCTEXT("WarmupDescription", "Systems with the chosen effect type do not allow warmup time, as it costs too much performance.\nPlease set the warmup time to 0 in the system properties."), SystemProperties);
Results.Add(Result);
}

}

您的规则还可以声明属性,然后在将规则添加到效果类型或规则集时显示这些属性。此处需要注意的是 FNiagaraPlatformSet 属性,该属性将在 UI 中显示可伸缩性选取器,因此用户只能在某些平台或可伸缩性设置上强制执行规则。
“禁止模块”规则中的示例:
//Platforms this validation rule will apply to.
UPROPERTY(EditAnywhere, Category=Validation)
FNiagaraPlatformSet Platforms;
UPROPERTY(EditAnywhere, Category = Validation)

TArray<tobjectptr> BannedModules;

上述属性代码在 UI 中的外观


近期焦点
Unreal Fest Shanghai 2024 | 虚幻引擎技术开放日,开票啦!
通过游戏动画示例项目获取500多种免费动画
UOD Awards 2024 作品征集,启动!
虚幻引擎5.4现已发布
GDC 2024:来自State of Unreal的重大新闻
欢迎来到全新的虚幻引擎网站
我们将在四月下旬更新虚幻引擎、Twinmotion和RealityCapture的定价


扫描下方二维码,关注后点击菜单栏按钮“更多内容”并选择“联系我们”获得更多虚幻引擎的授权合作方式和技术支持
长按屏幕选择“识别二维码”关注虚幻引擎
“虚幻引擎”微信公众账号是Epic Games旗下Unreal Engine的中文官方微信频道,在这里我们与大家一起分享关于虚幻引擎的开发经验与最新活动。


虚幻引擎
Epic Games 旗下 Unreal Engine 虚幻引擎官方订阅号
 最新文章